gpt4 book ai didi

python - For循环调用urllib.urlopen().getcode()很慢

转载 作者:行者123 更新时间:2023-11-30 23:17:58 24 4
gpt4 key购买 nike

我有一个Python程序,它运行字符串的所有组合(保存在列表comb中)并检查属于它的网站是否存在。该程序可以运行,但运行速度非常慢。在尝试了一些事情之后,我认为问题出在 getcode 方法上,因为除了该行之外,所有其他部分都工作得很快。我怎样才能让这个程序更快?

它只使用了不到 1% 的 CPU 和很少的互联网带宽。我尝试同时运行该程序的 3 个实例,每个实例的运行速度都与我只运行其中一个实例一样快。是否可以在程序中复制此内容?

for p in comb: 
if urllib.urlopen(url + p).getcode()!=404:
print "Sucessful: " + str(p)
break
else:
print "Failure:" + str(p)

最佳答案

多线程的替代方法是使用异步请求。您可以使用 grequests(requests 库的变体)与 Gevent 结合使用来执行此操作。使用 Github page itself 中的代码.

import grequests

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

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

for i in grequests.imap(rs):
print i, i.url

我的结果是 7 秒。

<Response [200]> http://docs.python-tablib.org/en/latest/
<Response [200]> https://www.heroku.com/
<Response [200]> http://httpbin.org/
<Response [200]> http://docs.python-requests.org/en/latest/
<Response [200]> http://www.kennethreitz.org/
[Finished in 7.0s]

我对多线程方法的看法。

import requests as rq
import threading

urls = ["...={}".format(x) for x in range(100)]

def get_status(url):
if rq.get(url, verify=False).status_code != 404:
print "Successful: {}\n".format(url)
else:
print "Failed: {}".format(url)

for url in urls:
t = threading.Thread(None, get_status, url, (url,))
t.start()

这能够在大约 10 秒内获取 100 个网站的状态。

关于python - For循环调用urllib.urlopen().getcode()很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27043693/

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