2015-10-14 85 views
1

我仍然不明白使用BeautifulSoup的情況。我可以用它來解析網頁,這裏的「example_website.com」的原始HTML:通過使用BeautifulSoup的超鏈接訪問表格數據

from bs4 import BeautifulSoup # load BeautifulSoup class 
import requests 
r = requests.get("http://example_website.com") 
data = r.text 
soup = BeautifulSoup(data) 
# soup.find_all('a') grabs all elements with <a> tag for hyperlinks  

然後,檢索和打印與「HREF」屬性的所有元素,我們可以使用一個for循環:

for link in soup.find_all('a'): 
    print(link.get('href')) 

我不明白:我有一個包含多個網頁的網站,每個網頁都會列出幾個帶有表格數據的超鏈接。

我可以使用BeautifulSoup來解析主頁,但是如何使用相同的Python腳本來抓取第2頁,第3頁等等?你如何「訪問」通過'href'鏈接找到的內容?

有沒有辦法編寫一個python腳本來做到這一點?我應該使用蜘蛛嗎?

回答

1

肯定可以用requests + BeautifulSoup這樣做。這將是一種阻塞性質,因爲您將逐個處理提取的鏈接,並且直到完成當前操作後纔會繼續下一個鏈接。示例實現:

from urlparse import urljoin 

from bs4 import BeautifulSoup 
import requests 

with requests.Session() as session:  
    r = session.get("http://example_website.com") 
    data = r.text 
    soup = BeautifulSoup(data) 

    base_url = "http://example_website.com" 
    for link in soup.find_all('a'): 
     url = urljoin(base_url, link.get('href')) 

     r = session.get(url) 
     # parse the subpage 

雖然,它可能會很快變得複雜和緩慢。

您可能需要切換到Scrapy web-scraping framework這使得網頁抓取,抓取,下面的鏈接輕鬆(看看CrawlSpider與鏈接提取),快速和非阻塞性質(它是基於扭曲)。

+1

「複雜而緩慢」這就是問題所在。我想我必須逐一處理鏈接。對於「目錄」類型的網站(例如,想想Yelp),這會變得乏味。你將不得不編寫多個for循環,並確保你沒有跳過任何東西。 (我可能是錯的!) – ShanZhengYang