gpt4 book ai didi

python - 线程化 HTTP 请求(使用代理)

转载 作者:行者123 更新时间:2023-11-30 23:51:47 26 4
gpt4 key购买 nike

我研究过类似的问题,但对于使用 HTTP 处理线程的最佳方法似乎总是存在很多分歧。

我特别想做的事情:我正在使用 Python 2.7,我想尝试线程化 HTTP 请求(具体来说,POST 一些东西),每个请求都有一个 SOCKS5 代理。我的代码已经可以工作了,但是速度相当慢,因为它要等待每个请求(到代理服务器,然后是 Web 服务器)完成才能开始另一个请求。每个线程很可能会使用不同的 SOCKS 代理发出不同的请求。

到目前为止,我一直纯粹使用 urllib2。我研究了像 PycURL 这样的模块,但在 Windows 上使用 Python 2.7 正确安装是极其困难的,我想支持它并且我正在其上编码。不过,我愿意使用任何其他模块。

我特别研究了这些问题:

Python urllib2.urlopen() is slow, need a better way to read several urls

Python - Example of urllib2 asynchronous / threaded request using HTTPS

许多例子都遭到了反对和争论。假设评论者是正确的,那么使用像 Twisted 这样的异步框架来创建客户端听起来会是使用速度最快的东西。然而,我在 Google 上疯狂搜索,它没有为 SOCKS5 代理提供任何形式的支持。我目前正在使用 Socksipy 模块,我可以尝试以下方法:

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, IP, port)
socks.wrapmodule(twisted.web.client)

我不知道这是否可行,而且我什至不知道 Twisted 是否是我真正想要使用的。我也可以直接使用线程模块并将其应用到我当前的 urllib2 代码中,但如果这比 Twisted 慢得多,我可能不想打扰。有没有人有任何见解?

最佳答案

也许更简单的方法是仅依赖 gevent (或 eventlet)让您打开与服务器的大量连接。这些库 Monkeypatch urllib 使之异步,同时仍然允许您编写同步代码。与线程相比,它们的开销较小,这也意味着您可以生成更多(1000 秒并不罕见)。

我使用过类似的负载(抄袭 here ):

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent
from gevent import monkey

# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()

import urllib2


def print_head(url):
print ('Starting %s' % url)
data = urllib2.urlopen(url).read()
print ('%s: %s bytes: %r' % (url, len(data), data[:50]))

jobs = [gevent.spawn(print_head, url) for url in urls]

关于python - 线程化 HTTP 请求(使用代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6545849/

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