爬虫小技巧
爬虫小技巧
首先问一下大家都使用过哪些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只能解析静态页面。
怎么样,简单不,赶紧动手试一试吧。