【问题标题】:Replacement for urllib2替换 urllib2
【发布时间】:2013-07-05 10:39:28
【问题描述】:

我有一组 50 个 url...并且从每个 url,我正在使用 urllib2 检索一些数据。我遵循的过程(包括为每个 url 设置 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))

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

【问题讨论】:

  • 您应该尝试使用requests。它使很多这些事情更容易管理。 (请注意,它不会以这种方式解决 性能 问题,只会产生更好的代码。)
  • 克里斯,你能举个例子详细说明一下吗?

标签: python urllib2


【解决方案1】:

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

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

【讨论】:

  • 非常感谢......您提到的每一点,先生,都是有效的。
【解决方案2】:

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

使用 Python 的 multiprocessing 模块相当简单,但您也可以使用 threading 模块。

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)

【讨论】:

  • 这很好用..但差别不大..但很感激 :-) 谢谢。
【解决方案3】:

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

你想做的是multithreading

【讨论】:

  • hmm..我读了一个队列类和多处理模块的例子..只是想知道如何实现?
猜你喜欢
  • 1970-01-01
  • 2017-12-14
  • 2012-10-09
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2011-03-18
相关资源
最近更新 更多