python 2.7 urlopen 函数,如何提高下载速度.

情况如下:我有10000个URL需要下载,用的是urllib2的urlopen函数.实践发现,如果全部放到一个.py文件里面下载,则速度为40KB/s左右如果我将URL分... 情况如下:
我有10000个URL需要下载,用的是urllib2的urlopen函数.
实践发现,如果全部放到一个.py文件里面下载,则速度为40KB/s左右
如果我将URL分散到4个.py文件,然后先后运行这4个文件,则总下载速度基本为160kb/s

问题:
4个文件同时下载的方法感觉很原始啊,而且调整代码也不方便,一改就四个都要打开改...
有没有能从根本上提高urlopen下载速度的办法呢?以便在一个py文件里面就能实现提高下载速度的目的.

代码就认为是这样吧:

urls=[我定义的url列表]
for url in urls:
web=urllib2.urlopen(url,None,5)
WIN7 操作系统
展开
 我来答
nbyh2012
推荐于2016-11-30 · TA获得超过3278个赞
知道小有建树答主
回答量:483
采纳率:100%
帮助的人:806万
展开全部

可以使用多进程或多线程并发下载。其实你的方法已经是多进程的一种了。


python中有多进程模块multiprocessing和多线程multithreading。


思路是这样,将需要下载的连接送入队列,然后各个进程(或线程)从队列里拿任务然后下载。前面的两个类库都提供进程、线程安全的队列。


楼下给了个多线程的示例,这里我给一个稍微复杂点的进程的示例。其实线程和进程库的接口基本是一致的。

#!/usr/bin/env python
# encoding=utf-8
# test.py

from multiprocessing import Queue, Process
from Queue import Empty
import urllib
import time

urls = [line.strip() for line in open('urls.txt')]
queue = Queue(1024)

for url in urls:
    queue.put(url)

def download():
    while True:
        try:
            url = queue.get()
            f = urllib.urlopen(url)
            r = f.read()
            # 这里保存你下载的文件
        except Empty:
            time.sleep(5)
        except Exception, e:
            print 'download error: %s' % e

for i in range(10):
    p = Process(target=download)
    p.start()
    p.join()


使用方法:编辑一个文件urls.txt,每行一个url。然后:

nohup ./test.py &


结束进程则需要找到它的进程号,然后kill -9


望采纳,谢谢支持!

追问
不太明白nohup ./test.py &的意思.它是加在哪儿呢?
我没有用这一句,直接去下载,然后报错.貌似和操作系统相关,我是WIN7 ..详情点击:
http://note.youdao.com/share/?id=62378d1b3bb8cfe51442ffe891034314&type=note
追答
这个命令是linux下的。win的我不太熟悉,你可以在网上查下怎么在win的cmd中后台执行命令,以及如何杀进程。
bdwisyou7d
推荐于2016-07-04 · TA获得超过1.3万个赞
知道大有可为答主
回答量:3774
采纳率:81%
帮助的人:1091万
展开全部

如nbyh2012所说。要用多线程或者是多进程来下载。我给你一个简单的DEMO

urls=[url.strip() for url in open("urls.txt","rb").readlines() if url.strip()]
import threading
class DownloadUrl(threading.Thread):
     def __init__(self,queue):
         self.queue=queue
         threading.Thread.__init__(self)
     def run(self):
         while not self.queue.empty():
              url=set.queue.get()
              web=urllib2.urlopen(url,None,5)
import Queue
queue=Queue.Queue()
for url in urls: queue.put(url)
threadnumber=10
threads=[]
for i in xrange(threadnumber):
    threads.append(DownloadUrl(queue))
for i in xrange(threadnumber):
    threads[i].start()
for i in xrange(threadnumber):
    threads[i].join()
追问
win7操作系统,有异常:
...
url=set.queue.get()
AttributeError: type object 'set' has no attribute 'queue'
详细信息点击:

http://note.youdao.com/share/?id=540e2ebf48bb5c058dbe799e716a6bd4&type=note
追答
是self.queue打错了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式