通过Python发送多个HTTP请求的理想方法?

2024-05-16 01:03:03 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
Multiple (asynchronous) connections with urllib2 or other http library?

我正在开发一个Linux web服务器,它运行Python代码,通过HTTP从第三方API获取实时数据。数据被放入MySQL数据库。 我需要对很多URL进行大量的查询,而且我需要快速(更快=更好)完成它。目前我正在使用urllib3作为我的HTTP库。 最好的办法是什么?我应该生成多个线程(如果是,有多少个?)每个查询都有不同的URL? 我很想听听你的想法-谢谢!


Tags: or数据httpurllinuxwithlibraryurllib2
3条回答

您应该使用多线程和流水线请求。例如搜索->;详细信息->;保存

您可以使用的线程数不只是取决于您的设备。这项服务可以服务多少个请求?它允许运行多少个并发请求?甚至你的带宽也可能成为瓶颈。

如果你说的是一种抓取-服务可能会在特定的请求限制后阻止你,所以你需要使用代理或多个IP绑定。

对于我来说,在大多数情况下,我可以从python脚本在笔记本上运行50-300个并发请求。

听起来是一个很好的Twisted应用程序。这里有一些web-related examples,包括如何download a web page。这里有一个关于database connections with Twisted的相关问题。

注意Twisted不依赖线程同时执行多个任务。相反,它采用cooperative multitasking方法——主脚本启动reactor,reactor调用您设置的函数。在反应器可以继续工作之前,您的函数必须将控制返回到反应器。

如果很多确实比您可能希望使用异步io而不是线程要多。

requests+gevent=grequests

GRequests允许您使用带有Gevent的请求来轻松地生成异步HTTP请求。

import grequests

urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com'
]

rs = (grequests.get(u) for u in urls)
grequests.map(rs)

相关问题 更多 >