最先应该思考的问题
- 稳定性
- 除重
爬虫的稳定性
由于项目并不会投入太多的时间,所以稳定性能是最终的。稳定性的可以从以下的维度进行考虑:
- 数据量不多的时候采用单线程。
- 异常处理。
- 重试。
- 详细的日志。
个人觉得数据量少就是在40小时内遍历全部并且可以爬完的就是小数据量。
异常处理主要就是放在请求网站时、入库。
而重试主要是用traceback这个库,它的作用是捕捉到特定异常、设定重试间隔的时长、间隔时常的增长策略。如果真的想不到要在什么地方写重试就思考:
- 在断网的情况下会出现什么情况,重试多次以后会抛出什么异常。
- 如果有验证码,而你是用打码平台的API,调用接口的时候会有什么异常。
- 把目标网站爬挂会有什么异常。
- 爬取到数据后要进行数据入库,入库是不是会遇到插入失败的问题、如果是唯一索引会数据库会抛出什么异常。当遇到异常的时候是不是需要进行回滚操作。
- 最后清洗数据的时候如果是用Xpath提取信息,通常结果返回的结果是一个列表,如果有通过索引取值,会不会导致index out of range?
日志的打印:
一开始可能会对什么地方需要进行日志打印感觉一点头绪都没。
我个人总结了几点,
- 在开发的时候你想知道某一个变量的值是什么是不是需要print来打印?这一类的打印归为debug日志。
- 你想知道此时什么函数在运行,例如现在访问页面的一个接口,接口是什么,你就想打印现在到哪一个函数它在干什么就是info日志。
- 最后捕捉异常如果是很严重的异常需要立刻处理的就是error不需要及时处理就是warnning,举个例子,我某一个接口请求失败了,但是有重试,我在捕捉到链接错误的时候使用的是warnning日志,因为我还没有必要及时处理,我还有重试在运行,而如果我已重试多次后,登录失败了,或者是某些网站只有首页,一旦首页爬取失败了往下所有爬取都会失败。我就不得不去处理。此时还可以用钉钉的机器人进行告警,以保证错误可以及时处理。
除重
除重的策略主要是:
- 内容长的进行hash处理,通过对比hash来替代对比内容,例如图片,可以通过base64转码后hash缩小成64位,这样的图片就不会有重复。
- 添加唯一索引,如果值有大量重复的列就不建议做唯一索引,例如性别,而币种名称就可以作为唯一索引,假如数据是一直在更新的那么可以尝试唯一联合索引,例如币种名称和创建次条信息的时间。
- redis。
- 插入数据前先查一次,如果有对象就返回没有就插入。