本博文总结一些常用的爬虫小技巧,不涉及任何爬虫框架,适用于为科学研究或者教育目的而从互联网上爬取少量数据,内容较为粗略,仅从较高抽象层次进行说明,涉及的模块使用方法或者代码实现可以另行搜索其他相关资料参考。
数据需求分析
首先,要明确实验项目需要哪些数据,例如电商网页中的商品名字、商品价格或者社交网站中的评论标题、评论发表时间等。
网页结构分析
根据上一步的数据需求分析结果,分析含有所需数据的网页的结构,看一下是否有固定的存在格式或者请求方式,就是要发现规律。
网页内容获取
推荐使用requests包,其中常用的参数有headers,timeout(connect timeout和read timeout),proxy。
- 对于headers可以通过浏览器(chrome)的Network面板获取Request Headers,如下图所示:
- headers中的cookies设置以及更新,请查阅其他资料,本文不做介绍,headers中的user-agent可以区网络上搜集几个,也可以使用random-user-agent包随机生成,然后随机替换着使用。
- timeout包括连接超时和读取超时,建议设置一个合理的阈值,如果只传一个值,则该值同时为连接超时和读取超时时间,如果传入一个元组,则可以为两种超时分别设置时间。
- proxy,如果你需要代理,以字典形式传入,例如proxies={"http": "234.122.9.1:4897"}
网页内容解析
使用requests获取内容后推荐使用BeautifulSoup和lxml包进行页面内容解析,当页面的结构的一致性程度高时推荐使用lxml配合xpath,当然也可以使用BeautifulSoup(例如获取表格或列表等内容);内容非结构化程度高,推荐使用BeautifulSoup和正则表达式。
异常处理
可以先使用for循环写一段爬虫代码,然后运行一小段时间,看看是否有bug造成大量异常,根据异常信息,进一步完善,不要苛求不出一点异常,差不多完善的时候,开启日志打印,并且将错误信息单独记录在日志文件,最后将日志文件中的异常进行统一处理,确保程序不会因为偶发异常而出现运行错误,同时建议以追加的方式分批将数据写入本地,提高效率的同时,确保数据不会因意外异常而全部未保存,此处推荐try...except、traceback、logging包一起使用。
多进程
当爬虫代码跑起来没什么大问题时,查看一下速度如何,如果获取完全部数据需要的时间太长,建议使用Python的多进程,推荐multiprocessing模块,如果在多进程处理中涉及文件的写入,可以配合该模块pool函数的callback参数,确保写入的顺序不会乱套,也避免了加各种锁,可以参考博文《Python多进程写入同一文件》,配合多进程的爬虫一般明显提升爬取速度。
处理网站的反爬虫
如果在代码层面很难处理网站的反爬虫策略,那么最后迫不得已可以使用selenium模拟浏览器行为,也可以同时配合使用多进程,这种方式比较耗费资源,并且效率较低,好好分析网站和想想办法避免被反爬虫,实在不行再用这种方式。
上述内容仅为个人使用经验的总结,后续会持续更新,不免会有遗漏或者错误,请各位在评论中不吝赐教,共同学习和进步。