我目前正在使用 requests-futures 來加快網路抓取速度。問題是,它仍然很慢。大約每隔一秒 1 次。以下是 ThreadPoolExecutor 的外觀:
with FuturesSession(executor=ThreadPoolExecutor(max_workers=8)) as session:
futures = {session.get(url, proxies={
'http': str(random.choice(proxy_list).replace("https:/", "http:/")),
'https': str(random.choice(proxy_list).replace("https:/", "http:/")),
}, headers={
'User-Agent': str(ua.chrome),
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Content-Type': 'text/plain;charset=UTF-8',
}): url for url in url_list}
# ---
for future in as_completed(futures):
del futures[future]
try:
resp = future.result()
except:
print("Error getting result from thread. Ignoring")
try:
multiprocessing.Process(target=main_func, args=(resp,))
del resp
del future
except requests.exceptions.JSONDecodeError:
logging.warning(
"[requests.custom.debug]: requests.exceptions.JSONDecodeError: [Error] print(resp.json())")
我相信它很慢,因為 as_completed for 回圈,因為那不是并發回圈。至于我將回應傳遞給的 main_func,它是使用來自使用 bs4 的站點的資訊的函式。如果 as_completed for 回圈是并發的,那么它仍然會比這更快。我真的希望爬蟲更快,我覺得我想繼續使用 requests-futures,但如果有更快的東西,我很樂意改變。因此,如果有人知道比 requests-futures 快得多的東西,那么請隨時分享
是否有人可以提供幫助?謝謝
uj5u.com熱心網友回復:
這是代碼的重組,應該會有所幫助:
import requests
from concurrent.futures import ProcessPoolExecutor
import random
proxy_list = [
'http://107.151.182.247:80',
'http://194.5.193.183:80',
'http://88.198.50.103:8080',
'http://88.198.24.108:8080',
'http://64.44.164.254:80',
'http://47.74.152.29:8888',
'http://176.9.75.42:8080']
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36',
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Content-Type': 'text/plain;charset=UTF-8'}
url_list = ['http://www.google.com', 'http://facebook.com', 'http://twitter.com']
def process(url):
proxy = random.choice(proxy_list)
https = proxy.replace('http:', 'https:')
http = proxy.replace('https:', 'http:')
proxies = {'http': http, 'https': https}
try:
(r := requests.get(url, proxies=proxies)).raise_for_status()
# call main_func here
except Exception as e:
return e
return 'OK'
def main():
with ProcessPoolExecutor() as executor:
for result in executor.map(process, url_list):
print(result)
if __name__ == '__main__':
main()
proxy_list 可能不適合您。使用您自己的代理串列。
顯然 url_list 與您的不匹配。
重點是每個 URL 都在其自己的行程中處理。在這種情況下確實沒有必要混合執行緒和行程,尤其是當您在運行子行程之前等待執行緒完成時,它會增加一定程度的同步性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/433424.html
上一篇:如何停止執行緒內的整個代碼
