为了账号安全,请及时绑定邮箱和手机立即绑定

python如何提高爬虫效率

python如何提高爬虫效率

慕慕森 2018-07-06 20:15:48
任务背景是需要从一个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)除了使用多台机器和提高网速外,还能考虑什么方式提高爬虫效率?
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

首先要搞清楚瓶颈在哪里。一个是监控你的cpu、内存、io,看看有没有出现满载。一个是测试你的服务器的连接速度,确认它的上限,以及在持续传输的过程中是否会限速(有的机房会限速)

查看完整回答
反对 回复 2018-07-14
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

一个进程开300个线程 太多了吧 建议少一点 16 or 32 测试一下 然后提高效率,基于目前的模式,你可以开多个进程 每个进程多个线程,可能会更快。


查看完整回答
反对 回复 2018-07-14
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

提高爬虫的方法有很多,建议看看python的相关库函数

查看完整回答
反对 回复 2018-07-14
  • 3 回答
  • 0 关注
  • 654 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信