2014-03-31 109 views
5

我正在一個項目中,我需要抓取幾個網站,並從中收集不同類型的信息。像文字,鏈接,圖像等信息刮HTML和JavaScript

我正在使用Python。我已經在HTML頁面上爲此嘗試了BeautifulSoup,並且它可以工作,但是當解析包含大量JavaScript的站點時,我被卡住了,因爲這些文件中的大部分信息都存儲在<script>標記中。

任何想法如何做到這一點?

+0

和另一個資源:http://stackoverflow.com/questions/22624255/how-to-scrape-search-results-if-returned-in-javascript-using-python/22630026#22630026 – Ehvince

+0

作爲一方請注意,硒比Ghost輕得多。 – Ehvince

回答

4

首先,從頁面中刪除和解析JS並不是微不足道的。但是,如果您使用無頭網絡客戶端,它可以大大簡化,它將像常規瀏覽器一樣爲您解析所有內容。
唯一的區別是它的主界面不是GUI/HMI,而是一個API。

這方面的一個例子是Ghost.py - 一個用python編寫的webkit web客戶端。

當然還有其他的選擇。您可以將Qt的QWebKit用於相同的目的,如this example所示。

你可以找到一個更完整的無頭瀏覽器列表here

+0

我能夠得到鬼的工作和加載頁面,但我應該做什麼,使整個網頁從它。該文檔描述了一個get_page函數,但即使在代碼本身中也不存在。 – user1934948

1

如果在頁面加載中涉及大量JavaScript動態加載,事情會變得更加複雜。

基本上,你有3種方式從網站抓取數據:

  • 使用瀏覽器的開發者工具看什麼AJAX請求會在頁面加載。然後在您的抓取工具中模擬這些請求。您可能需要jsonrequests模塊的幫助。
  • 使用利用真實瀏覽器的工具,如selenium。在這種情況下,你不關心網頁是如何加載的 - 你會得到一個真正的用戶看到的。注意:您也可以使用headless瀏覽器。
  • 看到,如果網站提供了一個API(如walmart API

而且看看Scrapy網絡刮框架 - 它不處理AJAX調用過,但這的確是在基於web的最佳工具刮過的世界我曾經與之合作過。

也看到這些資源:

希望有所幫助。

0

爲了幫助您開始使用硒和BeautifulSoup:

安裝與NPM phantomjs(節點包管理器):

apt-get install nodejs 
npm install phantomjs 

安裝硒:

pip install selenium 

,並得到類似的結果頁面這個,並像往常一樣用beautifulSoup解析:

from BeautifulSoup4 import BeautifulSoup as bs 
from selenium import webdriver 
client = webdriver.PhantomJS() 
client.get("http://foo") 
soup = bs(client.page_source) 
0

一個非常快速的方法是通過所有的標籤進行迭代,並得到textContent 這是JS代碼片段:

page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; 

或硒/蟒蛇:

import selenium 
from selenium import webdriver 
driver = webdriver.Chrome() 

driver.get("http://ranprieur.com") 
pagetext = driver.execute_script('page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; return page;') 

enter image description here