2015-10-14 53 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