爬虫的主要工作流程
- 设定抓取目标(种子页面/起始页面)并获取网页
- 当服务器无法访问时,按照指定的重试次数尝试重新下载页面
- 在需要的时候设置用户代理或隐藏真实IP,否则可能无法访问页面
- 对获取的页面进行必要的解码操作然后抓取出需要的信息
- 在获取的页面中通过某种方式(如正则表达式)抽取出页面中的链接信息
- 对链接进行进一步的处理(获取页面并重复上面的动作)
- 将有用的信息进行持久化以备后续的处理
爬虫的注意事项
- 处理相对链接。有的时候我们从页面中获取的链接不是一个完整的绝对链接而是一个相对链接,这种情况下需要将其与URL前缀进行拼接(urllib.parse中的urljoin()函数可以完成此项操作)
- 设置代理服务。有些网站会限制访问的区域(例如美国的Netflix屏蔽了很多国家的访问),有些爬虫需要隐藏自己的身份,在这种情况下可以设置使用代理服务器,代理服务器有免费的服务器和付费的商业服务器,但后者稳定性和可用性都更好,强烈建议在商业项目中使用付费的代理服务器。可以通过修改urllib.request中的ProxyHandler来为请求设置代理服务器
- 限制下载速度。如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损害动产”的风险(这个可能会导致吃官司且败诉),可以在两次下载之间添加延时从而对爬虫进行限速
- 避免爬虫陷阱。有些网站会动态生成页面内容,这会导致产生无限多的页面(例如在线万年历通常会有无穷无尽的链接)。可以通过记录到达当前页面经过了多少个链接(链接深度)来解决该问题,当达到事先设定的最大深度时爬虫就不再像队列中添加该网页中的链接了
- SSL相关问题。在使用urlopen打开一个HTTPS链接时会验证一次SSL证书,如果不做出处理会产生错误提示“SSL: CERTIFICATE_VERIFY_FAILED”,可以通过以下两种方式加以解决