2012-03-06 23 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这里也提到了。)