2

我有一组 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 解决此问题的任何其他更快的方法,那么就可以了也是。谢谢。

4

3 回答 3

3

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

  1. 使用 urllib2 本身的线程。例子在这里
  2. 您可以尝试 pycurl 。(不确定性能改进)
  3. 一旦我使用 subprocess.Popen 运行 curl 命令并以 json 格式从 URL 获取响应。我用它来并行调用不同的 URL,并使用 Popen 对象的通信方法在它们到达时获取响应。
于 2013-07-05T02:33:09.840 回答
2

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

Python 的多处理模块的使用相当简单,但您也可以使用线程模块。

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)
于 2013-07-05T02:32:35.910 回答
1

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

你想做的是多线程

于 2013-07-05T01:52:26.897 回答