我正在嘗試從 url 串列中抓取單個資料點到動態加載的站點。我已經用硒實作了一個刮板,但它太慢了。我嘗試使用scrapy,但意識到scrapy 不適用于動態加載的網站。我已經看過有關使用scrapy 的splash 的檔案——但這似乎是splash 加載一個動態站點并且scrapy 決議來自一個站點的資料的情況;我有一個巨大的網址串列。我正在考慮使用多重處理,但不確定從哪里開始/它是否適用于硒。
def get_cost(url):
driver.get(url)
try:
element = WebDriverWait(driver, 4).until(
EC.presence_of_element_located((By.XPATH,'/html/body/c-wiz[2]/div/div[2]/c-wiz/div/c-wiz/c-wiz/div[2]/div[2]/ul[1]/li[1]/div/div[2]/div/div[9]/div[2]/span'))
)
cost = element.get_attribute('textContent')
except:
cost = "-"
finally:
driver.quit()
return cost
這是一個給定 url 的功能,獲取網站上最便宜的航班費用。我對網路抓取非常陌生,因此我將不勝感激有關前進的最佳方式的一些建議。
uj5u.com熱心網友回復:
此腳本使用threading(而不是multiprocessing)打開瀏覽器的多個獨立視窗(實體)。這意味著函式get_cost中包含的代碼在每個視窗中同時運行。
由于每個執行緒都會打開一個新視窗,因此如果您有很多 url,您應該一次只打開少量 url,例如一次打開 10 個 url,否則計算機可能會死機
from selenium import webdriver
import threading
def get_cost(url, costs):
driver = ...
driver.get(url)
try:
element = WebDriverWait(driver, 4).until(
EC.presence_of_element_located((By.XPATH,'/html/body/c-wiz[2]/div/div[2]/c-wiz/div/c-wiz/c-wiz/div[2]/div[2]/ul[1]/li[1]/div/div[2]/div/div[9]/div[2]/span'))
)
cost = element.get_attribute('textContent')
except:
cost = "-"
finally:
driver.quit()
costs.append(cost)
thread_list = []
costs = []
urls = ['...', '...', '...'] # each one is opened in a separate browser)
for idx, url in enumerate(urls):
t = threading.Thread(name=f'Thread {idx}', target=get_cost, args=(url, costs))
t.start()
print(t.name ' started')
thread_list.append(t)
# wait for all threads to complete
for thread in thread_list:
thread.join()
print(costs)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/489828.html
