chuxuezhe7954 2018-04-23 12:53 采纳率: 33.3%
浏览 3183
已结题

python如何提高爬虫效率

任务背景是需要从一个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)除了使用多台机器和提高网速外,还能考虑什么方式提高爬虫效率?

  • 写回答

6条回答 默认 最新

  • threenewbee 2018-04-23 13:31
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容