Go 爬虫总结

爬虫目的:爬导航和爬商品

爬虫架构:

  • electron虚拟浏览器
  • proxy代理ip
  • dashboard网页端调控
  • 爬虫APP

实现的功能:

  • url拼接,过滤出商品
  • url翻页,点击翻页,无限流,loadmore按钮
  • 过滤文本中包含某text的url,过滤url中包含某url的url,定点过滤特定的url,只爬文本中包含某text的url,只爬url中包含某url的url
  • 失败移至末尾重试(次数,本次返回的状态码,延时)
  • 控制爬取频率,控制递归爬取深度
  • 用electron防止cookie或ajax动态加载页面,有WaitSelector,直到WaitSelector出现才返回渲染后的页面给spider,否则返回错误码
  • 分布式,高并发
  • 多个proxy负载均衡
  • proxy权限控制
  • dashboard网页端爬虫调度,导航log和简单报表分析,商品log和简单报表分析,服务器上当前所有配置一览

我负责的模块:

  • 配置文件template
  • 测试被反爬虫的条件,计算最大爬取频率
  • 实现同时爬取多个网站,单线程和并发可选
  • 默认 http client 不会缓存 DNS 记录,而爬虫会有大量的请求,所以自己专门对 DNS 做缓存
  • 调查并分析站点请求不成功的url占比超过 20% 的原因并修复
  • 发现并解决 ssl 证书问题
  • 网站改版,及时更新配置文件
  • 给timeout设一个下界

返回408原因:
(1)商品Selector作为WaitSelector,有的页面是介绍页,没有商品,返回408
(2)翻页超过最大页数,没有商品,返回408。这个原因导致的408一般 成堆 出现
(3)无限流需要较长时间来翻页,timeout较小会408
(4)目标网站有的商品下架,没有商品,返回408
(5)目标网站反爬策略,封ip后也不返回500,只有提示性的html,等不到商品,返回408
(6)目标网站必须用https

解决方案:(这几个印象深刻,其他的想不起来了)

  • 商品Selector作为WaitSelector,有的页面是介绍页,没有商品,返回408

    • 有2个waitSelector,一个Selector做监督,一个选商品Selector,如果监督Selector出现了而商品Selector没出来,就判定没商品
      • 效果好
      • 时间成本高
    • 只要1个errorSelector,出现提示性的error,判定为没有商品
      • 实现简单,时间成本低,逻辑清晰
      • 不全面,有些站点如果没有商品,也不出现提示性文字
    • electron不处理,无论是否408都把页面返回,交给spider处理
      • electron端实现简单,效果好,易于扩展
      • spider端实现困难,给spider端挖坑,有隐患
  • ssl 证书问题

    • 请求时不检测证书
  • http 请求

    • 换成https请求
  • getsockopt: no route to host

    • 和firewall有关,我们对昂贵的proxy做权限控制,而我在本地没有这个proxy的权限,必须到服务器上搞
  • getsockopt: connection time out

    • 需要特殊的header,不然在命令行是不能成功请求的
  • DNS解析

    • 原来的每次都要new一个,修复后只要一个持久化

团队共享用到的软件(我们都是远程办公)

  • slack:交流讨论
  • quip:共享文件
  • trello:任务管理
  • zoom:远程会议
  • google图表:共享文件

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器