三 Python 爬取留言板留言:多进程版+selenium模拟( 四 )


def main():'''主函数'''fids = get_fid()print('爬虫程序开始执行:')s_time = time.time()# 处理传入的参数,使之对应索引合并并且可迭代itera_merge = list(zip(range(1, len(fids) + 1), fids))# 创建进程池pool = Pool(3)# 将任务传入进程池并通过映射传入参数pool.map(get_officer_messages_enc, itera_merge)print('爬虫程序执行结束!!!')print('开始合成文件:')merge_csv()print('文件合成结束!!!')e_time = time.time()c_time = int(e_time - s_time)c_minute = c_time // 60c_second = c_time % 60print('{}位领导共计用时:{}分钟{}秒 。'.format(len(fids), c_minute, c_second))if __name__ == '__main__':'''执行主函数'''main()
主函数中先通过多进程获取领导所有留言,再合并所有数据文件,完成整个爬取过程,并统计整个程序的运行时间,便于分析运行效率 。
三、结果、分析及说明 1.结果说明
2个完整代码和测试执行结果可点击下载,欢迎进行测试和交流学习,请勿滥用 。
整个执行过程相比于单线程大大缩短了时间,我选择了10个领导进行测试,它们的留言数量有差异,以便于发现多线程的优势,在云服务器中的运行结果分别如下

三  Python 爬取留言板留言:多进程版+selenium模拟

文章插图
运行时间缩短到不到100分钟,与单进程相比大大缩短了时间、提高了效率,因为同一时刻有3个子进程执行 。加入多进程之后,可以让运行时间较长和较短的相互补充,在任意时刻多个进程同时运行 。但是也可以看出来与多线程相比,多进程的运行时间相对稍长,虽然差别不大,但是这可能就是性能的瓶颈 。可能的原因是进程需要的资源更多,这对内存、CPU和网络的要求更高,从而对设备提出了更高的要求,有时可能设备性能跟不上程序要求,从而降低了效率 。
最后得到了合并的DATA.csv:
对于多线程和多进程的简单对比分析如下:
一个线程至少有一个进程,一个进程至少有一个线程,线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高,进程在执行过程中拥有独立的存储单元,而多个线程共享存储器,从而极大的提高了程序的运行效率 。线程不能够独立执行,必须依存在进程中 。
多线程:
多进程:
显然,在爬虫中应该偏向使用多线程 。
2.改进分析
(1)该版本的代码仍未实现自动爬取所有的fid,需要手动保存,是其中一点不足,可以在后期改进 。
(2)爬取留言详情页仍然采用的模拟,会降低请求效率,可以考虑用库请求 。
(3)该版本对于反爬的措施较弱,因此很多时候会出现异常,比如得到的页面不正常找不到对应的元素,请求时间延长等,可以在之后的版本加入进一步的防反爬措施,进一步增加代码的健壮性 。
3.合法性说明