当前位置: 首页 > wzjs >正文

做建材去什么网站中国网络推广网站排名

做建材去什么网站,中国网络推广网站排名,创建网站的工作流程八年级信息技术,做网站用到的技术有个朋友想用Go语言编写一个多线程爬虫,并且使用代理IP来应对反爬措施。多线程在Go中通常是通过goroutine实现的,所以应该使用goroutine来并发处理多个网页的抓取。然后,代理IP的话,可能需要一个代理池,从中随机选择代…

有个朋友想用Go语言编写一个多线程爬虫,并且使用代理IP来应对反爬措施。多线程在Go中通常是通过goroutine实现的,所以应该使用goroutine来并发处理多个网页的抓取。然后,代理IP的话,可能需要一个代理池,从中随机选择代理来发送请求,避免同一个IP被封锁。大体思路就是这样,具体看我下面实操吧。

在这里插入图片描述

以下是一个使用Go语言编写的多线程爬虫程序,结合代理IP和反爬策略的示例代码:

package mainimport ("bufio""crypto/tls""fmt""io/ioutil""math/rand""net""net/http""net/url""os""sync""time"
)var (proxyPool  []*url.URLproxyMux   sync.MutexuserAgents = []string{"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",}visitedURLs sync.Map
)func main() {// 初始化随机种子rand.Seed(time.Now().UnixNano())// 加载代理列表if err := loadProxies("proxies.txt"); err != nil {fmt.Println("Error loading proxies:", err)return}// 创建任务通道taskChan := make(chan string, 100)// 启动workervar wg sync.WaitGroupworkerCount := 10for i := 0; i < workerCount; i++ {wg.Add(1)go worker(taskChan, &wg)}// 添加初始任务go func() {taskChan <- "https://httpbin.org/ip"taskChan <- "https://example.com"}()// 等待所有worker完成(实际可能需要其他停止机制)wg.Wait()close(taskChan)
}func loadProxies(filename string) error {file, err := os.Open(filename)if err != nil {return err}defer file.Close()scanner := bufio.NewScanner(file)for scanner.Scan() {line := scanner.Text()proxyURL, err := url.Parse("http://" + line)if err != nil {continue}proxyPool = append(proxyPool, proxyURL)}return nil
}func worker(taskChan <-chan string, wg *sync.WaitGroup) {defer wg.Done()for targetURL := range taskChan {// URL去重if _, loaded := visitedURLs.LoadOrStore(targetURL, true); loaded {continue}// 随机延迟(1-3秒)time.Sleep(time.Duration(1+rand.Intn(2)) * time.Second)// 获取随机代理proxy := getRandomProxy()if proxy == nil {fmt.Println("No available proxies")continue}// 创建自定义Transporttransport := &http.Transport{Proxy: http.ProxyURL(proxy),DialContext: (&net.Dialer{Timeout:   10 * time.Second,KeepAlive: 10 * time.Second,}).DialContext,TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},MaxIdleConns:          100,IdleConnTimeout:       90 * time.Second,TLSHandshakeTimeout:   10 * time.Second,ExpectContinueTimeout: 1 * time.Second,}// 创建HTTP客户端client := &http.Client{Transport: transport,Timeout:   15 * time.Second,}// 创建请求req, err := http.NewRequest("GET", targetURL, nil)if err != nil {fmt.Printf("Error creating request: %v\n", err)continue}// 设置随机User-Agentreq.Header.Set("User-Agent", userAgents[rand.Intn(len(userAgents))])// 发送请求resp, err := client.Do(req)if err != nil {fmt.Printf("Error fetching %s: %v\n", targetURL, err)markBadProxy(proxy)continue}defer resp.Body.Close()// 处理响应if resp.StatusCode != http.StatusOK {fmt.Printf("Non-200 status code: %d for %s\n", resp.StatusCode, targetURL)continue}// 读取响应内容body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("Error reading response body: %v\n", err)continue}// 处理页面内容(示例:输出内容长度)fmt.Printf("Successfully fetched %s (%d bytes) using proxy %s\n",targetURL, len(body), proxy.Host)// 这里可以添加链接提取和任务添加逻辑// parseLinks(body, taskChan)}
}func getRandomProxy() *url.URL {proxyMux.Lock()defer proxyMux.Unlock()if len(proxyPool) == 0 {return nil}return proxyPool[rand.Intn(len(proxyPool))]
}func markBadProxy(badProxy *url.URL) {proxyMux.Lock()defer proxyMux.Unlock()for i, p := range proxyPool {if p.String() == badProxy.String() {// 移除无效代理proxyPool = append(proxyPool[:i], proxyPool[i+1:]...)fmt.Printf("Removed bad proxy: %s\n", badProxy.String())break}}
}// 示例链接解析函数(需要根据实际情况实现)
func parseLinks(body []byte, taskChan chan<- string) {// 这里可以添加HTML解析逻辑,提取链接并发送到taskChan// 注意:需要处理相对路径转换和域名限制
}

关键特性说明:

  1. 代理管理

    • 从文件加载代理列表(格式:ip:port)
    • 随机选择代理进行请求
    • 自动移除失效代理
  2. 反爬策略

    • 随机User-Agent轮换
    • 请求间随机延迟(1-3秒)
    • 自动代理失效检测和移除
    • 支持HTTPS和跳过证书验证
  3. 并发控制

    • 使用带缓冲的channel作为任务队列
    • 可配置的worker数量
    • 自动URL去重(使用sync.Map)
  4. 健壮性设计

    • 连接超时设置(15秒)
    • 自定义Transport参数优化
    • 完善的错误处理

使用说明:

  1. 创建代理文件proxies.txt,格式为每行一个代理地址(ip:port)
  2. 根据需求调整以下参数:
    • workerCount:并发worker数量
    • taskChan缓冲大小
    • 各种超时参数
    • 随机延迟时间范围
  3. 实现parseLinks函数来提取新链接
  4. 添加具体的页面解析逻辑

注意事项:

  1. 代理质量直接影响爬虫效果,建议使用优质代理服务
  2. 根据目标网站的robots.txt和版权政策合理使用
  3. 添加适当的速率限制避免对目标网站造成过大压力
  4. 对于复杂反爬机制可能需要添加更多策略:
    • Cookie管理
    • JavaScript渲染支持
    • 验证码识别
    • 请求头随机化
    • 请求参数随机化

上面代码就是我提供了基础的爬虫框架,大家在使用的时候可以根据具体需求进行扩展和优化,有了这样的代码示例能让你们省很多事情。

http://www.dtcms.com/wzjs/36566.html

相关文章:

  • 免费做网页的网站适合推广的app有哪些
  • 工程公司会计账务处理杭州seo推广优化公司
  • 理县网站建设公司运营网站是什么意思
  • 网站导航内链建设视频外链平台
  • 金华网站建设方案报价手机系统流畅神器
  • 苏州要服务网站建设搜索推广公司
  • crm 在线试用网站seo具体怎么做?
  • 金泉网网站建设黑锋网seo
  • 能看见自己家的地图软件免费seo教学实体培训班
  • 九江开发区建设环保局网站网络销售平台上市公司有哪些
  • 长沙网站建设公司哪家专业网络推广公司哪家做得好
  • 电子商务网站建设与维护期末百度提交入口的注意事项
  • 织梦网站字体大小百度信息流广告位置
  • 临沂网站建设费用网络整合营销方案ppt
  • 免费网站模版 优帮云网络平台销售
  • 政府部门网站建设意义网址大全浏览器下载
  • 江苏省高职重点专业群建设网站seo技术助理
  • wordpress交互式地图来宾网站seo
  • 个人网站主页设计模板seo虚拟外链
  • 网站的404如何做百度小说搜索风云榜
  • wordpress收购百度推广seo
  • 怎样做企业手机网站建设有广告位怎么找广告商
  • 石家庄楼盘最新消息app排名优化公司
  • 临安做企业网站的公司谈谈自己对市场营销的理解
  • 下载宝硬盘做网站seo提升排名
  • wordpress 底部音乐播放器插件想做seo哪里有培训的
  • 昆明制作企业网站的公司关键词歌词
  • 做方案还找不到素材 这里有最全的设计网站免费的客户资源怎么找
  • 网站建设产品介绍优化搜索点击次数的方法
  • 网站首页被k咋办百度竞价推广开户价格