爬虫小技巧
爬虫小技巧
首先问一下大家都使用过哪些python爬虫模块呢?相信大多数人会回复requests或者scrapy吧,嗯我是说大多人。但是针对简单的爬虫我们还是习惯性的使用requests吧,或者升级版的requests_html,此时再使用scrapy,就有种杀鸡焉用宰牛刀的意味了。
现在我们有个简单的要求,去获取该网页http://www.air-level.com/air/beijing/的一个表格数据,然后保存起来。
相信此时很多人应该拿起requests敲起来了吧。这里由于代码比较简单就说下思路。
首先,我们要成功访问该网页,然后解析网页表格里面的内容,然后存储数据,这里简单我们就存csv好了。好了思路好了我们就可以写自己代码了,如果对xpath解析数据不很熟悉,应该会稍微耗点时,人生苦短,对于这么简单的任务怎么能浪费过多的时间呢?
经过调查我找到了应对这种静态单页面的更好的方法。。。
pandas模块
简介
提到pandas更多联想到也许是它的数据分析功能,但是在查它的api的时候我发现了这个方法
read_html:
下面是这个函数及其参数
pandas.read_html(io, match=\'.+\', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=\', \', encoding=None, decimal=\'.\', converters=None, na_values=None, keep_default_na=True, displayed_only=True)
安装
pip3 install pandas
爬虫代码
import pandas as pd
df = pd.read_html("http://www.air-level.com/air/beijing/", encoding=\'utf-8\',header=0)[0]
results = df.T.to_dict().values()
print(results)
然后我们看到输出一个mapping映射类型的数据
dict_values([{\'监测站\': \'北京天坛\', \'AQI\': 177, \'空气质量等级\': \'中度污染\', \'PM2.5\': \'134 μg/m3\', \'PM10\': \'176 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京顺义新城\', \'AQI\': 167, \'空气质量等级\': \'中度污染\', \'PM2.5\': \'127 μg/m3\', \'PM10\': \'163 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京农展馆\', \'AQI\': 155, \'空气质量等级\': \'中度污染\', \'PM2.5\': \'118 μg/m3\', \'PM10\': \'170 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京奥体中心\', \'AQI\': 152, \'空气质量等级\': \'中度污染\', \'PM2.5\': \'116 μg/m3\', \'PM10\': \'132 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京东四\', \'AQI\': 150, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'115 μg/m3\', \'PM10\': \'145 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京海淀区万柳\', \'AQI\': 142, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'109 μg/m3\', \'PM10\': \'143 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京万寿西宫\', \'AQI\': 142, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'109 μg/m3\', \'PM10\': \'143 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京古城\', \'AQI\': 137, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'105 μg/m3\', \'PM10\': \'120 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京官园\', \'AQI\': 137, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'105 μg/m3\', \'PM10\': \'144 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京怀柔镇\', \'AQI\': 121, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'92 μg/m3\', \'PM10\': \'143 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京定陵\', \'AQI\': 114, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'86 μg/m3\', \'PM10\': \'92 μg/m3\', \'首要污染物\': \'PM2.5\'}, {\'监测站\': \'北京昌平镇\', \'AQI\': 104, \'空气质量等级\': \'轻度污染\', \'PM2.5\': \'78 μg/m3\', \'PM10\': \'109 μg/m3\', \'首要污染物\': \'PM2.5\'}])
代码很简单但是实现的内容可不简单,第一行导入pandas包,
第二行的read_html核心功能实现是调用requests然后解析table标签里的每个td的数据
最后生成一个list对象里面是dataframe对象。所以通过小标0获取它的第一个dataframe数据,既然是dateframe我们就可以使用dataframe的方法了,
第三行首先做了个转秩操作,然后转为映射类型打印出来了。上面的代码为了演示其效果,下面我们对结果做一个存储操作
存入csv
df = pd.read_html("http://www.air-level.com/air/beijing/", encoding=\'utf-8\',header=0)[0]
df.to_csv("tq.csv",index=False)
执行代码之后就生成了tq.csv了,打开时候看正是我们要的数据。
让我们对比一下这是网页的数据:
这是我们保存的csv数据
可以发现我们成功的获取了网页表格的数据。
需要注意的是,read_html只能解析静态页面。
怎么样,简单不,赶紧动手试一试吧。