替换urllib2

时间:2013-07-05 01:45:46

标签: python urllib2

我有一组50个网址...并且从每个网址,我使用urllib2检索一些数据。我正在遵循的程序(包括为每个网址设置cookie)如下:

urls = ['https://someurl', 'https://someurl', ...]
vals = []

for url in urls:
   req2 = urllib2.Request(url)
   req2.add_header('cookie', cookie)
   response = urllib2.urlopen(req2)
   data = response.read()
   vals.append(json.loads(data))

所以,基本上我是从所有这些网址中检索数据并将其转储到vals列表中。 50个网址的整个过程大约需要15.5到20秒。我需要知道是否有任何其他python库我可以通过它来执行相同的操作,但是以更快的方式...如果你们可以建议使用urllib2来解决这个问题的任何其他更快的方法,那么它就是' ll也没关系。感谢。

3 个答案:

答案 0 :(得分:3)

因此,如果15-20秒的成本很高,您可以尝试以下几种方法:

  1. 使用urllib2本身的线程。例如here
  2. 你可以尝试pycurl。(不确定性能改进)
  3. 一旦我使用subprocess.Popen运行curl命令并以json格式从URL获取响应。我使用它来并行调用不同的URL并在使用Popen对象的通信方法到达时获取响应。

答案 1 :(得分:2)

urllib2的速度不会成为限制因素,大部分时间它将等待TCP连接或远程服务器响应。

使用Python的multiprocessing模块非常简单,但您也可以使用线程模块。

multiprocessing.Pool可以像这样使用:

from multiprocessing import Pool
# Use the following if you prefer to use threads over processes.
# from multiprocessing.pool import ThreadPool as Pool

urls = ['https://someurl', 'https://someurl', ...]

def download_json(url):
    req2 = urllib2.Request(url)
    req2.add_header('cookie', cookie)
    response = urllib2.urlopen(req2)
    data = response.read()
    return json.loads(data)

pool = Pool()
vals = pool.map(download_json, urls)

答案 2 :(得分:1)

urllib2非常快(50个网址20秒不是这么慢)。连接资源需要一些时间。

您要做的是multithreading