2013-07-02 93 views
18

我從使用Python的網站上刮取內容。首先,我在Python上使用了BeautifulSoupMechanize,但是我看到該網站有一個通過JavaScript創建內容的按鈕,因此我決定使用SeleniumSelenium與BeautifulSoup for web scraping

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

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

+0

我從來沒有用Selenium解析HTML,但BeautifulSoup非常強大。這就是說,既然你已經在使用Selenium來做什麼了,爲什麼不把它用於兩者,直到你知道爲什麼你需要別的東西? – crowder

+0

@crowder是的,現在我正在用Selenium做所有的事情,但是之前我使用過BS,所以我想知道哪些是最好的。關於解析,我認爲它與Selenium有點相同,我們有driver.find_elements_by_class_name(「...」)和BS,我們有soup.findAll('...',{'class' : '....'})。 我看到BS有點慢,你怎麼看? – elie

+0

@elie:這真的是你想要達到的目標。 Selenium被設計爲web ui自動化工具,如果你只是想解析html,這是一個矯枉過正的行爲。如果您需要與頁面進行某種交互,請使用Selenium。 –

回答

32

在直接回答您的問題之前,有必要說明一下的一個出發點:如果您只需從靜態HTML頁面提取內容,則應該使用HTTP庫(如Requests或內置urllib.requestlxmlBeautifulSoup,而不是硒(儘管硒也可能足夠)。不必使用硒的優點:

  • 帶寬。使用Selenium意味着獲取當您在瀏覽器中訪問頁面時通常會獲取的所有資源 - 樣式表,腳本,圖像等。這可能是不必要的。
  • 穩定性和容易的錯誤恢復。根據我的經驗(即使使用PhantomJS),Selenium可能會有點脆弱,並且創建架構來殺死掛起的Selenium實例並創建新的Selenium實例比使用requests時設置簡單的異常重試邏輯更加刺激。
  • 潛在地,CPU和內存使用情況 - 取決於您要爬行的網站以及您試圖並行運行多少個spider線程,可以想象,DOM佈局邏輯或JavaScript執行可能會非常昂貴。

需要注意的是需要cookies來功能的網站是不是一個理由擺脫硒 - 您可以輕鬆創建一個URL打開函數奇蹟般地設置和使用cookielib/cookiejar HTTP請求發送的cookie。

好吧,那麼爲什麼你會考慮使用硒?幾乎完全是爲了處理您想要抓取的內容正在通過JavaScript添加到頁面的情況,而不是烘焙到HTML中。即使那樣,你也許可以在不破壞重型機械的情況下獲得你想要的數據。通常情況下,其中一種情況適用:

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

如果使用Selenium決定你的情況的優點,與PhantomJS驅動程序,而不是,比方說,FireFox的默認驅動程序使用它。Web spidering通常不需要實際上以圖形方式呈現頁面,或使用任何瀏覽器特定的怪癖或功能,因此無頭瀏覽器(具有較低的CPU和內存成本以及較少的運動部件崩潰或掛起)是理想選擇。