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 操作系统 展开
我有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 操作系统 展开
展开全部
可以使用多进程或多线程并发下载。其实你的方法已经是多进程的一种了。
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中后台执行命令,以及如何杀进程。
展开全部
如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打错了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询