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