使用多线程为你的Python爬虫提速的N种姿势,你会几种?

本文附带福利向Python脚本一个,学习多线程与爱美之心兼得,关注和订阅博主的专栏即可领取! https://github.com/qinyuanpei/zngirls

授人以鱼,不如授人以渔。提供代码,并非每一个技术写作者的义务。我懒得搞关注公众号、发送关键字、网盘地址这种繁琐的流程,读者若有心,请参考:https://github.com/Regularly-Archive/2021/tree/master/multiple-threading

雪轻鸿 CSDN认证博客专家 .NET Python 伪·全栈攻城狮
谢谢你,在这世界的角落,找到我,一个即将进入而立之年的中年大叔,常年以 飞鸿踏雪 的花名混迹江湖。在现实生活中,我是一名 伪·全栈攻城狮,因为我觉得,什么都略懂一点,生活会更多彩一些。目前,主要关注.NET、.NET Core、Python、数据分析、微服务、Web 等技术方向。日常行为:读书、写作、电影、烹饪、洞箫等。喜欢看日剧/纪录片/科普、刷B站、刷LeetCode等。
已标记关键词 清除标记
任务背景是需要从一个linux服务器上下载文件,我拥有该服务器的访问权限但仅限于读。 目前的解决方法是我把所有需要下载的数据地址都保存在了本地的文件中,一行一条数据地址,通过paramiko包连接服务器然后使用多线程的方式进行爬取。每个线程启动时向其传入一个下载地址列表,因为每个线程的下载地址列表都不重复,因此不需要考虑线程之间的通信。详细代码如下: ``` # filename是存储在本地的地址列表文件,n是最大线程数 def download(filename, n): files = open(filename, 'rb').readlines() numbers = range(n) stop = len(files) / len(numbers) def thread_download(n): sftp = login() directory = files[n*stop : (n+1)*stop] for line in directory: # 该函数的功能是将服务器中的文件下载至本地,第一个参数是具体地址,第二个参数是连接句柄 download_from_server(line.strip(), sftp) threads = [] for i in numbers: threads.append(threading.Thread(target=thread_download, args=(i, ))) threads[i].start() time.sleep(0.1) # 暂停0.1s是为了防止并发数太多 for i in numbers: threads[i].join() ``` 现在有两个问题: (1)我一般把n设置为300,程序启动时下载速度很快,能够达到每分钟100多份文件,虽然也能看到一些线程崩溃,但数量不多;但是大概10分钟后程序下载速度只有20多份文件,是因为很多线程已经挂掉了嘛,还是线程之间通过同一个账户访问存在阻塞?为什么速度下降幅度这么大? (2)除了使用多台机器和提高网速外,还能考虑什么方式提高爬虫效率?
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值