我如何向不同的站点发送大量请求,我有一个站点数据库(1kk),需要检查它们是否还活着,有条件地,如果你只是通过grequests(Python)软件块(100个请求在 10 个线程中 ~128 秒)需要 12.5 天,但对我来说太长了,我确信这可以做得更快。
你能告诉我在这种情况下我可以使用什么吗?我只是收集有关网站主页的信息。
这是我的代码,我想以某种方式改进它,你有什么建议? 我尝试将每个请求都放入流中,但感觉好像有什么东西阻止了它,我将使用代理,这样我的 IP 就不会因为更多请求而被阻止
帮助谁可以!
def start_parting(urls:list,chunk_num,chunks):
if len(urls)>0:
chunk_num+=1
print(f'Chunck [{Fore.CYAN}{chunk_num}/{chunks}{Style.RESET_ALL}] started! Length: {len(urls)}')
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"}
rs = [grequests.get(url.split(' ')[0].strip(), headers=headers,timeout=10) for url in urls]
responses = grequests.map(rs)
for response in responses:
if response is None:
continue
if response.status_code == 200:
check_pattern = r'(pat1|pat2)'
match = re.search(check_pattern, response.text, re.IGNORECASE)
if match:
site = match.group(1)
print(f'Site {site}')
print(f'Chunck [{Fore.LIGHTCYAN_EX}{chunk_num}/{chunks}{Style.RESET_ALL}] ended!')
def test_sites_for_file(file,num_threads = 10,chunk_size=100):
print('Start check!')
urls = file.readlines()
with ThreadPoolExecutor(max_workers=num_threads) as executor:
parts = [urls[i:i + chunk_size] for i in range(0, len(urls), chunk_size)]
finals = [executor.submit(start_parting, part , part_num,len(parts)) for part_num,part in enumerate(parts)]
t = time.time()
for final in as_completed(finals):
pass
print(f'Resultate: {time.time()-t}')
您可以尝试切换到 HTTP HEAD(通过
grequests.head
)而不是 GET。原则上,这应该更快,因为这些页面的正文(无论如何你都会忽略它们)不必被传输。除此之外,如果您已经对其进行了并行化,我认为您无法纯粹通过软件来加快速度。发出大量 HTTP 请求需要时间。