您还可以告诉我如何吗? 预先感谢。
代码如下:
def test():
with open("proxies.txt", "r") as f:
for line in f:
try:
proxy = line.split('\n', 1)[0]
r = requests.get('http://www.icanhazip.com/', proxies={'http': 'http://' + proxy}, timeout=1)
print(r.status_code)
except (requests.exceptions.ProxyError, requests.exceptions.ConnectTimeout,
requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError):
print("Doesn't work")
多处理或多线程仅应在调用该函数时开始。
答案 0 :(得分:0)
我认为线程化是最好的,似乎您并没有在每个工作者上执行大量的计算工作。子流程需要相当大的开销才能开始,因此更适合需要大量计算的任务。
答案 1 :(得分:0)
两个观察结果:
您可以尝试使用并发库中的ThreadPoolExecutor或ProcessPoolExecutor,以便可以并行执行。
您可能想看看是否创建显式请求Session并重新使用Session可以加快速度。这样可以节省TLS重新协商/握手的成本。请注意,您可能需要谨慎使用cookie,因为默认情况下,重用的会话将共享一个cookie jar。
未经测试,很快就被抓在一起的例子:
session = requests.Session()
def do_request(line):
proxy = line.split('\n', 1)[0]
r = session.get('http://www.icanhazip.com/', proxies={'http': 'http://' + proxy}, timeout=1)
return r.status_code
with ThreadPoolExecutor(max_workers=8) as executor, \
open("proxies.txt", "r") as f:
results = executor.map(do_request, f)
for future in results:
try:
print(future.result())
except (requests.exceptions.ProxyError, requests.exceptions.ConnectTimeout,
requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError):
print("Doesn't work")