当前位置: 首页 > 面试题库 >

Python urllib2.urlopen()速度很慢,需要一种更好的方式来读取多个URL

楚羽
2023-03-14
问题内容

顾名思义,我正在使用python编写的网站上,它对urllib2模块进行了多次调用以读取网站。然后,我用BeautifulSoup解析它们。

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

我只是想知道是否可以同时阅读所有站点?还是任何使它更快的技巧,例如我应该在每次读取后关闭urllib2.urlopen还是将其保持打开状态?

补充 :另外,如果我只是改用php,从其他站点获取和解析HTML和XML文件会更快吗?我只希望它加载更快,而不是目前需要20秒钟的时间


问题答案:

我正在使用以下现代Python模块(如threading和)重写Dumb Guy的代码Queue

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.9秒。

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



 类似资料:
  • 对于我正在做的一些测试,我需要一个执行时间约为10秒的C#函数。它将从ASPX页面调用,但我需要该函数消耗服务器上的CPU时间,而不是呈现时间。对Northwinds数据库的缓慢查询或一些非常缓慢的计算将会工作。有什么想法吗?

  • 基本上,它想要完成的就是找到胜率最多的球队。这是通过对每个球员的制胜球进行合计,并根据他们来自哪一支球队来判断,为该队计数来发现的。 我通过遍历所有玩家并找到唯一的队名来创建作为队对象的队列表来实现这一点。 然后我查了一下球员名单,如果球员所在的球队和现在的球队一样,就会为他们的制胜球加分。 一个小任务总共有四个for循环。看起来很恶心。

  • 问题内容: (重要)编辑3: 单独运行testajax2.php而 _不是_Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询用时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。

  • 使用xarray的open_mfdataset打开一系列大约90个netCDF文件,每个文件大约27MB,加载一个小的时空选择需要很长时间。 分块维度产生边际收益。decode_cf=True在函数内部或单独都没有区别。这里还有一个建议https://groups.google.com/forum/#!topic/xarray/11lDGSeza78让我将所选内容另存为一个单独的netCdf并重新

  • 问题内容: 我正在使用Google BigQuery,并且正在从PHP执行一些简单的查询。(例如,从电子邮件中的SELECT * WHERE email='mail@test.com‘)我只是在检查表中是否存在该电子邮件。 表“电子邮件”目前为空。但是,PHP脚本仍然需要大约4分钟的时间来检查一个空表上的175封电子邮件。.如我希望将来该表将被填充,并且将有500 000封邮件,那么我想请求时间会

  • 问题内容: 谁能帮我?我正在尝试提出一种计算方法 并计算此总和中的项目数,而不必进行两次以上的传递。 似乎令人难以置信,但是在扫描了std- lib(内置函数,itertools,functools等)后,我什至找不到一个可以计算可迭代对象数的函数。我发现了这个函数,听起来像我想要的,但实际上它只是一个虚假命名的函数。 经过一番思考,我想出了以下内容(它很简单,缺少库函数可能是可以原谅的,除了它的