gpt4 book ai didi

Python urllib2.urlopen() 很慢,需要一个更好的方法来读取多个 url

转载 作者:太空狗 更新时间:2023-10-29 17:37:08 24 4
gpt4 key购买 nike

正如标题所示,我正在开发一个用 python 编写的网站,它会多次调用 urllib2 模块来读取网站。然后我用 BeautifulSoup 解析它们。

由于我必须阅读 5-10 个站点,因此页面需要一段时间才能加载。

我只是想知道是否有一种方法可以同时阅读所有站点?或者任何让它更快的技巧,比如我应该在每次阅读后关闭 urllib2.urlopen 还是保持打开状态?

已添加:此外,如果我只是切换到 php,从其他站点获取和解析 HTML 和 XML 文件会更快吗?我只是想让它加载得更快,而不是目前需要大约 20 秒

最佳答案

我正在使用 threadingQueue 等现代 Python 模块重写 Dumb Guy 的代码。

import threading, urllib2
import Queue

urls_to_load = [
'http://stackoverflow.com/',
'http://slashdot.org/',
'http://www.archive.org/',
'http://www.yahoo.co.jp/',
]

def read_url(url, queue):
data = urllib2.urlopen(url).read()
print('Fetched %s from %s' % (len(data), url))
queue.put(data)

def fetch_parallel():
result = Queue.Queue()
threads = [threading.Thread(target=read_url, args = (url,result)) for url in urls_to_load]
for t in threads:
t.start()
for t in threads:
t.join()
return result

def fetch_sequencial():
result = Queue.Queue()
for url in urls_to_load:
read_url(url,result)
return result

find_sequencial() 的最佳时间是 2 秒。 fetch_parallel() 的最佳时间是 0.9s。

同样,由于 GIL,说 thread 在 Python 中无用也是不正确的。这是线程在 Python 中有用的情况之一,因为线程在 I/O 上被阻塞。正如您在我的结果中看到的那样,并行情况快了 2 倍。

关于Python urllib2.urlopen() 很慢,需要一个更好的方法来读取多个 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com