zoukankan      html  css  js  c++  java
  • 爬虫小技巧

    爬虫小技巧

    首先问一下大家都使用过哪些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)
    

    https://pandas.pydata.org/**

    安装

    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数据
    csv数据
    可以发现我们成功的获取了网页表格的数据。

    需要注意的是,read_html只能解析静态页面。

    怎么样,简单不,赶紧动手试一试吧。

  • 相关阅读:
    Linux应急响应(三):挖矿病毒
    Linux应急响应(二):捕捉短连接
    Linux应急响应(一):SSH暴力破解
    Window应急响应(四):挖矿病毒
    Window应急响应(三):勒索病毒
    Window应急响应(二):蠕虫病毒
    openresty开发系列10--openresty的简单介绍及安装
    openresty开发系列4--nginx的配置文件说明
    openresty开发系列3--nginx的平滑升级
    openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍
  • 原文地址:https://www.cnblogs.com/c-x-a/p/10334624.html
Copyright © 2011-2022 走看看