前面几节讲到网络爬虫,但是在分析数据时效率不高。
鉴于网页中HTML的树形结构,我们可以引入一个新的库--BeautifulSoup4用于解析HTML或XML。
如何安装第三方库:BeautifulSoup4?(我会新增一篇文章讲如何安装第三方库,此节不多说。)
1、默认是安装在Anaconda中
2、如果没有安装可以在命令窗口cmd中执行以下命令:
pip install beautifulsoup4
import bs4
使用BeautifulSoup库的步骤:
1、创建BeautifulSoup对象
2、查询节点
find,找到第一个满足条件的节点
find_all 找到所有满足条件的节点
可按节点类型、属性或内容访问
例如:有这样一段HTML:<a href='abcd' class='efgh'>a_value</a>
按照类型查找节点:
bs.find_all('a')
按照属性查找节点:
bs.find_all('a', href='abcd')
bs.find_all('a', class_='efgh')
注意:是class_ (因为:class是关键字)
或者:bs.find_all('a', {'class': 'efgh')
按照内容查找节点:
bs.find_all('a', href='abcd', string='a_value')
可以查看网页的HTML代码(选中部分就是需要抓取的内容),右键鼠标--查看网页源代码:
那么就开始获取一个城市所有的AQI指标值:
"""
作者:lanxingbudui
日期:2020-02-25
功能:AQI计算
版本:6.0
"""
import requests
from bs4 import BeautifulSoup
def get_city_aqi(city_pinyin):
"""
获取一个城市的所有AQI指标
"""
url = 'http://pm25.in/' + city_pinyin
r = requests.get(url, timeout=30) #链接网页请求
print(r.status_code) #打印返回结果,200成功 400失败
soup = BeautifulSoup(r.text, 'lxml') #创建BeautifulSoup对象
div_list = soup.find_all('div', {'class': 'span1'}) #查找所有spen1属性的节点
# 或者 = soup.find_all('div', class_ = 'spanl') # 不推荐这样写,因为class是关键字,有时容易忘记下划线。
city_aqi = []
for i in range(8):
div_content = div_list[i]
caption = div_content.find('div', {'class': 'caption'}).text.strip()
value = div_content.find('div', {'class': 'value'}).text.strip()
# .text是获取属性值,并且.strip()移除上步骤中 text 字符串头尾的空格或换行符
city_aqi.append((caption, value))
return city_aqi
def main():
"""
主函数
"""
city_pinyin = input('请输入城市拼音:')
city_aqi = get_city_aqi(city_pinyin)
print(city_aqi)
if __name__ == '__main__':
main()