簡體   English   中英

用於網頁抓取的 Selenium 與 BeautifulSoup

[英]Selenium versus BeautifulSoup for web scraping

我正在使用 Python 從網站上抓取內容。 首先,我在 Python 上使用BeautifulSoupMechanize ,但我看到該網站有一個通過 JavaScript 創建內容的按鈕,所以我決定使用Selenium

鑒於我可以使用 Selenium 和driver.find_element_by_xpath類的方法找到元素並獲取它們的內容,那么當我可以將 Selenium 用於所有事情時,有什么理由使用BeautifulSoup

在這種特殊情況下,我需要使用 Selenium 來單擊 JavaScript 按鈕,那么使用 Selenium 來解析更好還是應該同時使用 Selenium 和 Beautiful Soup?

在直接回答您的問題之前,值得先說一下:如果您需要做的只是從靜態 HTML 頁面中提取lxml ,您可能應該使用urllib.request lxmlBeautifulSoup ,而不是 Selenium (盡管 Selenium 可能也足夠了)。 不需要不必要地使用 Selenium 的優點:

  • 帶寬和運行腳本的時間。 使用 Selenium 意味着獲取在瀏覽器中訪問頁面時通常會獲取的所有資源 - 樣式表、腳本、圖像等。 這可能是不必要的。
  • 穩定性和易於錯誤恢復。 Selenium 可能有點脆弱,根據我的經驗——即使是使用 PhantomJS——創建架構來殺死一個掛起的 Selenium 實例並創建一個新實例比在使用requests時設置簡單的異常重試邏輯更令人惱火。
  • 潛在地,CPU 和內存使用 - 取決於您正在爬行的站點,以及您嘗試並行運行的蜘蛛線程的數量,可以想象 DOM 布局邏輯或 JavaScript 執行可能會變得非常昂貴。

請注意,需要 cookie 才能運行的站點並不是破壞 Selenium 的理由 - 您可以輕松創建一個 URL 打開函數,該函數使用cookielib / cookiejar神奇地設置和發送帶有 HTTP 請求的 cookie。

好的,那你為什么要考慮使用 Selenium? 幾乎完全可以處理您要抓取的內容通過 JavaScript 添加到頁面的情況,而不是烘焙到 HTML 中。 即使這樣,您也可以在不破壞重型機器的情況下獲得所需的數據。 通常這些情況之一適用:

  • 與頁面一起提供的 JavaScript 已經將內容烘焙到其中。 JavaScript 只是用來進行模板化或其他將內容放入頁面的 DOM 操作。 在這種情況下,您可能想看看是否有一種簡單的方法可以使用正則表達式直接從 JavaScript 中提取您感興趣的內容。
  • JavaScript 正在使用 Web API 來加載內容。 在這種情況下,請考慮您是否可以識別相關的 API URL 並自己點擊它們; 這可能比實際運行 JavaScript 和從網頁上抓取內容更簡單、更直接。

如果您確實認為自己的情況值得使用 Selenium,請在無頭模式下使用它,(至少)Firefox 和 Chrome 驅動程序支持這種模式。 Web 爬蟲通常不需要實際以圖形方式呈現頁面,或使用任何特定於瀏覽器的怪癖或功能,因此無頭瀏覽器 - 具有較低的 CPU 和內存成本以及較少的崩潰或掛起的移動部件 - 是理想的。

我建議將 Selenium 用於諸如與網頁交互之類的事情,無論是在成熟的瀏覽器中,還是在無頭模式的瀏覽器中,例如無頭 Chrome。 我還想說,漂亮的湯更適合觀察和編寫依賴於是否找到元素或找到了什么的語句,然后如果用戶願意,可以使用 selenium 執行與頁面的交互任務。

使用 Selenium 進行網頁抓取,但這不是一個令人滿意的解決方案。 在我的上一個項目中,我使用了https://github.com/chromedp/chromedp 它是比 Selenium 更簡單的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM