
2.2.2 抓取一个静态页面中的天气数据
由于整个历史天气数据按月份分布在多个网页中,为了将问题简化,本节先尝试抓取一个网页(某月)中的天气数据。下面这段代码便实现了对2020年11月历史天气数据的抓取:


抓取过程主要包括以下几个步骤。
1.设置请求头信息
由于现行网站大都有一定的反爬措施,为了顺利抓取数据,有时需要将爬虫进行伪装,设置请求头,可以让抓取过程更像是一个用户在使用浏览器浏览数据。关于浏览器请求头信息的获得,可以参照附录A。
2.使用Requests库发送网络请求
本例使用requests.get()获取一个名为html的Response对象,访问成功之后就可以获得所有网页的信息,并且可以通过html.text进行展示。前几行信息如下:


3.使用BeautifulSoup库提取数据
BeautifulSoup是一个可以从HTML或XML文件中提取数据的库,其本身并不能访问网页,需要Requests等库获取网页代码之后,再由BeautifulSoup库处理。这里使用效率更高的lxml作为解析器,通过BeautifulSoup(html.text,'lxml')方法解析这段代码,能够得到一个BeautifulSoup对象。
除了可以使用find()、findall()等函数提取数据,BeautifulSoup库还支持大部分CSS选择器,在BeautifulSoup对象的.select()方法中传入字符串参数,可以使用CSS选择器的语法找到标签。经过前面对网页的解析,月度天气数据设置在<ul class="thrui">中。每日的天气数据集中在每个<li>中,具体的天气信息分布在每个<div>中。
先通过soup.select('ul[class="thrui"]')语句,选择了2020年11月的天气情况数据;然后通过两层循环,使用.select()方法获取了每天的天气数据;最后保存在空DataFrame数据框中,生成包含日期(“date”列)、当日最高气温(“maxTem”列)、当日最低气温(“minTem”列)、当日天气情况(“weather”列)、当日风向风力情况(“wind”列)的数据,并以Excel表格的形式存储。抓取的2020年11月深圳历史天气数据如表2-1所示。
表2-1 抓取的2020年11月深圳历史天气数据

续表

关于BeautifulSoup库更详细的使用方法,读者可以参考“Beautiful Soup 4.4.0文档”,以及《Requests:让HTTP服务人类》。