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端挖坑,有隐患
- 有2个waitSelector,一个Selector做监督,一个选商品Selector,如果监督Selector出现了而商品Selector没出来,就判定没商品
ssl 证书问题
- 请求时不检测证书
http 请求
- 换成https请求
getsockopt: no route to host
- 和firewall有关,我们对昂贵的proxy做权限控制,而我在本地没有这个proxy的权限,必须到服务器上搞
getsockopt: connection time out
- 需要特殊的header,不然在命令行是不能成功请求的
DNS解析
- 原来的每次都要new一个,修复后只要一个持久化
团队共享用到的软件(我们都是远程办公)
- slack:交流讨论
- quip:共享文件
- trello:任务管理
- zoom:远程会议
- google图表:共享文件