我有一個抓取 url 串列的功能,200k 個 url,花了很多時間,有沒有辦法加快這個程序?
def get_odds(ids):
headers = {"Referer": "https://www.betexplorer.com",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
s = requests.Session()
matches=[]
for id in ids:
url = f'https://www.betexplorer.com{id}'
response = s.get(url, headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
season = url.split('/')[5]
"do stuff.."
ids 是一個 list
['/soccer/england/premier-league/brentford-norwich/vyLXXRcE/'
...]
uj5u.com熱心網友回復:
是的,您可以使用多處理。
就像是:
from multiprocessing import Pool
if __name__ == "__main__":
threads = 10 # The number of concurrent requests
p = Pool(threads)
p.map(get_odds, ids)
p.terminate()
其中 ids 是 id 串列,get_odds 是您提供的函式,但修改為僅對其中一個 id 進行操作。請記住,您一次將使用 10 個請求訪問他們的服務器,這可能會導致臨時 ip 阻塞(因為您被視為具有敵意)。您應該注意這一點并調整池大小和/或添加 sleep() 邏輯。
獲得賠率函式應該是這樣的:
def get_odds(id):
headers = {"Referer": "https://www.betexplorer.com",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
s = requests.Session()
matches=[]
url = f'https://www.betexplorer.com{id}'
response = s.get(url, headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
season = url.split('/')[5]
"do stuff.."
uj5u.com熱心網友回復:
您可以讓它們通過多執行緒并行運行。例如,創建 10 個執行緒并根據您的 id(0、1、2、3、...)的結尾知道它應該刮取哪個 ID 的執行緒。只有在足夠的計算能力和穩定的互聯網連接下才能作業。
編輯:由于 ID 是一個串列,請檢查索引以確定哪個執行緒應該抓取哪個網站。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361673.html
