这一篇涉及到如何在网页请求环节使用多进程任务处理功能,因为网页请求涉及到两个重要问题:一是多进程的并发操作会面临更大的反爬风险,所以面临更严峻的反爬风险,二是抓取网页数据需要获取返回值,而且这些返回值需要汇集成一个关系表(数据框)(区别于上一篇中的二进制文件下载,文件下载仅仅执行语句块命令即可,无需收集返回值)。
R语言使用RCurl+XML,Python使用urllib+lxml。
方案1——自建显式循环:
整个过程耗时11.03秒。
方案2——使用向量化函数:
整个过程耗时9.07m。
方案3——使用多进程包:
总耗时5.14秒。
这里解释一下昨天的多进程下载pdf文件为何没有任何效果,我觉得是因为,对于网络I/O密集型的任务,网络下载过程带宽不足,耗时太久,几乎掩盖了多进程的时间节省(pdf文件平均5m)。
Python版:
Python的案例使用urllib、lxml包进行演示。
方案1——使用显式循环抓取:
总耗时将近19秒,(代码中设置有时延,估测净时间在9秒左右)
方案2——使用多线程方式抓取:
以上多进程模式仅使用了1.64m,多进程爬虫的优势与单进程相比效率非常明显。
方案3——使用多进程方式抓取:
最后的多进程执行时间差不多也在1.5s左右,但是因为windows的forks问题,不能直接在编辑器中执行,需要将多进程的代码放在.py文件,然后将.py文件在cmd或者PowerShell中执行。
c从今天这些案例可以看出,对于网络I/O密集型任务而言,多线程和多进程确实可以提升任务效率,但是速度越快也意味着面临着更大的反爬压力,特别是在多进程/多线程环境下,并发处理需要做更加加完善的伪装措施,比如考虑提供随机UA/IP,以防过早被封杀。
欢迎关注数据小魔方qq交流群
领取专属 10元无门槛券
私享最新 技术干货