2012-03-06 65 views
0

我試圖從本網站訪問不同的魚家族的網址:http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Salmon通過BeautifulSoup解析存儲在URL中的數據?

我希望能夠運行打開某一網站的鏈接,然後能夠解析腳本存儲在頁面中的信息。我是相當新的網絡抓取,所以任何幫助將不勝感激。提前致謝!

這是我到目前爲止有:

import urllib2 
import re 
from bs4 import BeautifulSoup 
import time 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Salmon' 
page = urllib2.urlopen(fish_url) 
html_doc = page.read() 
soup = BeautifulSoup(html_doc) 

page = urllib2.urlopen('http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Salmon').read() 
soup = BeautifulSoup(page) 
soup.prettify() 
for fish in soup.findAll('a', href=True): 
    print fish['href'] 

回答

3

Scrapy是這個完美的工具。這是一個python網頁抓取框架。 http://doc.scrapy.org/en/latest/intro/tutorial.html

您可以傳入您的網址與您的術語,並創建爬網規則。

在使用正則表達式的示例中,您將添加一條規則以刪除路徑爲/Summary的所有鏈接,然後使用XPath或美麗的湯提取信息。

此外,您可以設置一個規則來自動處理分頁,即在您的示例url中它可以自動跟隨下一個鏈接。

基本上,你正在嘗試做的很多東西都是在scrapy中免費包裝的。我會去看看它。

+0

Python 3是否有任何開源Web Scraping框架? Scrapy是隻有2.7 .. – Erik 2013-03-22 15:42:31

+0

@Erik檢查出[BeautifulSoup](crummy.com/software/BeautifulSoup/) – 2014-01-21 03:32:24

+0

感謝Steinar,我最終完全移出Python ..現在利用CasperJS和PhantomJS。這是本地DOM樹遍歷真正加快了速度。 – Erik 2014-01-21 21:56:56

1

如果你只是寫一個一次性的腳本從這個網站抓住所有的數據,你可以這樣做:

fish_url_base = "http://www.fishbase.org/ComNames/%s" 
fish_urls = [fish_url_base%a['href'] for a in soup.find_all('a')] 

這給你一個鏈接列表遍歷,你可以傳遞給urllib2.urlopenBeautifulSoup

for url in fish_urls: 
    fish_soup = BeautifulSoup(urllib2.urlopen(url).read()) 
    # Do something with your fish_soup 

(注1:我還沒有測試此代碼,您可能需要調整基本URL,以適應href屬性,所以你能正確的網站。)

(注2:我看到你正在使用bs4,但在湯上叫findAllfindAll是正確的BS3,但它是在bs4改爲find_all

(注3:如果你這樣做是實用,而不是學習的目的/好玩的,也有刮的更有效的方法,如scrapy這裏也提到了。)