[python 爬虫]数据抓取

现在我们已经成功地把网页下载下来了,可是光下载下来有什么用呢?我们需要把这个数据抓取下来而完成整个爬虫功能的实现。

分析网页

我们还是以http://example.webscraping.com作为实例,建议用Chrome浏览器,比如我们想要抓取某个国家的面积(area)那么我们只需选中那一行然后再右键Inspect Element

就会弹出一个相应的页面高亮这一元素

如此这一个元素的位置我们便可以一清二楚地知道了(这个面积值包含在ID为places_area__row的<>tr元素的<td>子元素,class为w2p_fw之中)。那么我们该如何抓取这个数据并把它储存到文件之中呢?

三种抓取网页的方法

互联网上普遍流行的是正则表达式,还有Beautiful Soap以及lxml,由于正则表达式太过复杂而且缺乏效率,而且我们在网页爬虫下绝大多部分条件下不需要用上,所以在此不赘述,以后有机会我们再单独拿出一章节作介绍

Beautiful Soup

安装:

pip install beautifulsoup4

我们可以通过调用find()和find_all()函数的方法来提取数据find是找到第一个符合条件的数据,find_all是找到所有的符合条件的数据

抓取数据:
以下是实例代码,提取的是阿富汗国家的人口

import requests
from bs4 import BeautifulSoap
url = 'http://example.webscraping.com/places/default/view/Afghanistan-1'
html = requests.get(url) #通过requests下载网页
soup = BeautifulSoup(html.text) #解析该网页
tr = soup.find(attrs = {'id':'places_population__row'}) #找到id为places_population__row的子类
td = tr.find(attrs = {'class':'w2p_fw'}) #找到该子类下class为w2p_fw的子类
area = td.text
print(area) #结果为29,121,286

LXML

LXML也十分好用,安装方法在http://lxml.de/installation.html#ms-windows上有详细的讲解,在这里不在赘述,同时我们也要安装cssselect
以下为示例代码:

import cssselect
import requests
import lxml.html
url = 'http://example.webscraping.com/places/default/view/Afghanistan-1'
html = requests.get(url)
tree = lxml.html.fromstring(html.text)
td = tree.cssselect('tr#places_population__row > td.w2p_fw')[0]
#选择id(#)为places_population__row的tr标签的class(.)为w2p_fw的td子标签
area = td.text_content()
print(area)  #打印结果为29,121,286

综合到性能以及使用难度的考虑,LXML兼备性能快,使用难度低等优点,所以在我认为是爬取数据的最好的选择

 

Leave a Reply

Your email address will not be published. Required fields are marked *