我正在打开一个有100,000个URL的文件.我需要向每个URL发送HTTP请求并打印状态代码.我正在使用Python 2.6,到目前为止,我看到了Python实现线程/并发的许多令人困惑的方式.我甚至看过python concurrence库,但无法弄清楚如何正确编写这个程序.有没有人遇到过类似的问题?我想通常我需要知道如何尽快在Python中执行数千个任务 - 我想这意味着'同时'.
很久以前我写了一个我多线程的网络蜘蛛,以便同时发生并发请求.那是在我的Python青年时代,在我知道GIL及其为多线程代码创建的相关问题之前的几天(IE,大多数时候东西最终都被序列化了!)......
我想重做这段代码,使其更强大,性能更好.我基本上有两种方法可以做到这一点:我可以在2.6+中使用新的多处理模块,或者我可以选择某种类型的基于反应器/事件的模型.我宁愿做后者,因为它更简单,更不容易出错.
所以问题涉及哪种框架最适合我的需求.以下是我目前了解的选项列表:
我有什么遗漏吗?当然必须有一个适合简化的异步网络库的最佳点的库!
[编辑:非常感谢intgr指向此页面的指针.如果你滚动到底部,你会看到有一个非常好的项目列表,旨在以某种方式解决这个任务.事实上,自Twisted开始以来事情确实已经发生了变化:人们现在似乎更倾向于基于协同例程的解决方案而不是传统的反应堆/回调导向解决方案.这种方法的好处是更清晰,更直接的代码:我在过去肯定发现过,特别是在C++中使用boost.asio时,基于回调的代码可能会导致难以理解的设计并且相对模糊不清未经训练的眼睛.使用协同例程允许您编写至少看起来更加同步的代码.我想我现在的任务是找出我喜欢的这些库中的哪一个,并试一试!很高兴我现在问...]
[编辑:也许对任何跟随或偶然发现这个问题或者在任何意义上关心这个话题的人都感兴趣:我发现了一个非常好的关于这个工作的可用工具的当前状态的文章]
我很想写自己的,但我现在没有足够的时间.我已经看过维基百科的开源爬虫列表,但我更喜欢用Python编写的东西.我意识到我可能只是使用维基百科页面上的一个工具并将其包装在Python中.我可能最终会这样做 - 如果有人对这些工具有任何建议,我愿意听到他们的意见.我通过它的网络界面使用了Heritrix,我发现它非常麻烦.我肯定不会为即将推出的项目使用浏览器API.
提前致谢.另外,这是我的第一个问题!
我有一个脚本,可以获取多个网页并解析信息.
(可以在http://bluedevilbooks.com/search/?DEPT=MATH&CLASS=103&SEC=01上看到一个例子)
我在它上面运行了cProfile,而且正如我所假设的那样,urlopen占用了大量的时间.有没有办法更快地获取页面?或者一种方法一次获取几个页面?我会做最简单的事情,因为我是python和web开发的新手.
提前致谢!:)
更新:我有一个调用的函数fetchURLs(),我用它来制作一个我需要的URL数组,如下所示urls = fetchURLS().这些URL是来自亚马逊和eBay API的所有XML文件(这让我很困惑,为什么加载需要这么长时间,也许我的虚拟主机很慢?)
我需要做的是加载每个URL,读取每个页面,并将该数据发送到脚本的另一部分,该部分将解析和显示数据.
请注意,在获取所有页面之前,我无法执行后一部分,这就是我的问题所在.
另外,我相信我的主机一次限制我25个进程,所以服务器上最简单的任何东西都会很好:)
这是时间:
Sun Aug 15 20:51:22 2010 prof
211352 function calls (209292 primitive calls) in 22.254 CPU seconds
Ordered by: internal time
List reduced from 404 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
10 18.056 1.806 18.056 1.806 {_socket.getaddrinfo}
4991 2.730 0.001 2.730 0.001 {method 'recv' of '_socket.socket' objects}
10 0.490 0.049 0.490 0.049 {method 'connect' of '_socket.socket' objects} …Run Code Online (Sandbox Code Playgroud) 我确信在标准库中有这样的东西,但似乎我错了.
我有一堆我想urlopen并行的网址.我想要内置map函数,除了工作由一堆线程并行完成.
是否有一个很好的模块可以做到这一点?
我正在寻找一个python库或命令行工具,用于并行下载多个文件.我目前的解决方案是按顺序下载文件,这很慢.我知道你可以很容易地在python中编写一个半成熟的线程解决方案,但是在使用线程时我总是遇到烦人的问题.它用于从网站轮询大量xml提要.
我对解决方案的要求是:
请不要建议我如何实施上述要求.我正在寻找一个现成的,经过实战考验的解决方案.
我想我应该描述我想要的东西......我有大约300种不同的数据源,因为xml格式的文件来自50个数据提供者.每个文件的大小在100kb到5mb之间.我需要经常轮询它们(如每隔几分钟一次)以确定它们是否有我需要处理的新数据.因此,下载程序使用http缓存来最小化要获取的数据量非常重要.它显然也使用gzip压缩.
那么最大的问题是如何在不超越任何边界的情况下以尽可能高效的方式使用带宽.例如,如果您打开20个同时连接到其数据源的连接,则一个数据提供商可能会认为它被滥用.相反,最好使用一个或两个重用于多个文件的连接.或者您自己的连接可能会以奇怪的方式受到限制.我的isp限制了您可以执行的dns查找次数,因此某种dns缓存会很好.
正如标题所示,我正在开发一个用python编写的网站,它会多次调用urllib2模块来读取网站.然后我用BeautifulSoup解析它们.
由于我必须阅读5-10个网站,因此页面需要一段时间才能加载.
我只是想知道是否有办法一次性阅读这些网站?或者是为了让它更快,我应该在每次阅读后关闭urllib2.urlopen,还是保持打开状态?
补充:另外,如果我只是切换到php,那么从其他网站获取和Parsi g HTML和XML文件会更快吗?我只是希望它加载更快,而不是目前需要的约20秒
我有一个python web爬虫,我想在许多不同的代理服务器之间分发下载请求,可能运行squid(虽然我对替代品持开放态度).例如,它可以以循环方式工作,其中request1转到proxy1,request2转发到proxy2,最后循环回来.知道如何设置吗?
为了使其更难,我还希望能够动态更改可用代理列表,减少一些代理,并添加其他代理.
如果重要,则动态分配IP地址.
谢谢 :)
我正在开发一个运行Python代码的Linux Web服务器,以通过第三方API从HTTP获取实时数据.数据被放入MySQL数据库.我需要对很多URL进行大量查询,我需要快速完成(更快=更好).目前我正在使用urllib3作为我的HTTP库.最好的方法是什么?我应该生成多个线程(如果是,有多少?)并且每个查询都有不同的URL?我很想听听你对此的看法 - 谢谢!
我有一个web.py服务器响应各种用户请求.其中一个请求涉及下载和分析一系列网页.
有没有一种简单的方法在web.py中设置基于异步/回调的url下载机制?资源使用率低是特别重要的,因为每个用户发起的请求可能导致下载多个页面.
流程看起来像:
用户请求 - > web.py - >并行或异步下载10页 - >分析内容,返回结果
我认识到Twisted是一个很好的方法,但我已经在web.py中了,所以我对web.py中的内容特别感兴趣.
python ×10
http ×4
concurrency ×3
asynchronous ×2
urllib2 ×2
web-crawler ×2
cprofile ×1
download ×1
feed ×1
httprequest ×1
map-function ×1
networking ×1
proxy ×1
squid ×1
time ×1
twisted ×1
urlopen ×1