python网页爬虫+简单的数据分析

news/2024/7/19 11:11:28 标签: 大数据, python, 爬虫, 数据分析

python_0">python网页爬虫+简单的数据分析

文章目录


1.我们今天爬取的目标网站是:http://pm25.in/
2.需要爬取的目标数据是:该网站所有城市的空气质量数据(主要包括AQI、PM2.5/1h、PM10/1h、CO/1h、NO2/1h、O3/1h、O3/8h、SO2/1h)。
3. 我们的最终目标是:将这些数据爬取出来,并写入到.csv/.xlsx文件中,最后通过读取.csv/.xlsx文件的数据,做一下简单的数据分析
使用的工具是Spyder(ps:个人觉得Spyder要PyCharm好使)

一、数据爬取

这里我用到的库和模块比较多,所有代码量比较少。缺少相关模块的同学自行下载应用即可,这里推荐通过镜像网址(pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests)下载,下载速度会快很多,具体使用方法请参考https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
1. 引入该项目需要用到的相关库和模块

python">import requests
import csv
from bs4 import BeautifulSoup

2. 接下来写get_all_cities()函数,用来获取所有城市名称及url
其实这里应该先写主函数,不过为了演示效果就先写了get_all_cities()函数。
2.1 创建一个空列表city_list
2.2 通过requests.get(url)构造一个向服务器请求资源的Request对象,设置请求超时时间为60s。
2.3 这里我们指定Beautiful的解析器为“html.parser”
2.4 接下来就要爬取网站中所有城市名称了。以北京市为例,我们首先需要打开待爬取网站并查看网页代码,可以看到“北京”这个城市是隶属于第一个“bottom”,接下来就是将所有“bottom”下的城市全部获取,这里我们使用BeautifulSoup来获取。
在这里插入图片描述
2.5 将获取到的城市名称写入列表city_list中,具体代码如下:

python">def get_all_cites():
#获取所有城市及url
    url = 'http://pm25.in/'
    city_list = []
    r = requests.get(url, timeout=60)
    soup = BeautifulSoup(r.text, 'html.parser')

    city_div = soup.find_all('div',{'class':'bottom'})[1]  #查找该网页的第2个bottom
    city_link_list = city_div.find_all('a')
    for city_link in city_link_list:
        city_name = city_link.text
        city_pinyin  = city_link['href'][1:]               #查找city_link_list的herf并从第2个字符取出
        city_list.append((city_name,city_pinyin))
    return city_list
city_list = get_all_cites()
print(city_list)

2.6 我们先来看一下运行该段函数代码的结果是什么样的。
在这里插入图片描述
2.7 可以看到已经成功读取到该网站所有城市名称了。

3.下面写get_city_aqi()函数,用来获取所有城市的AQI值
3.1 以北京市为例,如下图,我们需要获取的数据是AQI对应的44、PM2.5/1h对应的25、PM10/1h对应的43、CO/1h对应的0.5…;
在这里插入图片描述
3.2 接下来就是如何获取具体的“value”和“caption”了。
在这里插入图片描述
3.3 我们先用requests.get(url)构造一个向服务器请求资源的Reques,请求超时时间设置为60s。同样指定Beautiful的解析器为“html.parser”。接着新建一个div_list用来存放按内容查找到的节点的数值。然后创建一个空的city_aqi列表来存放for循环获取到的所有AQI、PM2.5/1h、PM10/1h、CO/1h、NO2/1h、O3/1h、O3/8h、SO2/1h,最后返回并通过.append写入列表。

具体代码如下:

python">def get_city_aqi(city_pinyin):

    #获取城市AQI
    url = 'http://pm25.in/' + city_pinyin
    r = requests.get(url,timeout=60)
    soup = BeautifulSoup(r.text,'html.parser')
    div_list = soup.find_all('div',{'class':'span1'})

    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()
        city_aqi.append(value)
    return city_aqi

4. 接下来写main函数,调用前面写的两个功能函数实现数据爬取与写入
这部分内容不是很多,主要设计一些文件操作,对文件操作不熟悉的需要重新学习下python文件操作的基础知识。这里在代码中添加了一些爬取的进度提示并print到窗口,使得过程更贴合实际情况。
4.1 具体实现代码如下:

python">def main():
    city_list = get_all_cites()

    header = ['city','AQI','PM2.5/1h','PM10/1h','CO/1h','NO2/1h','O3/1h','O3/8h','SO2/1h']

    with open('china_city_aqi.csv','w',encoding='utf-8',newline='') as f:
        writer =csv.writer(f)
        writer.writerow(header)
        for i,city in enumerate(city_list):
            if (i+1)%10 == 0:
                print('已经处理{}条数据。(共有{}条数据)'.format(i+1,len(city_list)))
            city_name = city[0]
            city_pinyin = city[1]
            city_aqi = get_city_aqi(city_pinyin)
            row = [city_name]+city_aqi
            writer.writerow(row)

5. 最后写两行代码防止在被其他文件导入时显示多余的程序主体部分。

python">if __name__ == '__main__':
    main()

5. 最后看下运行结果。
最终爬取到的数据会写入到china_city_aqi.csv中,我们打开.csv文件看下结果是什么样的。
在这里插入图片描述

二、数据分析

上面我们已经成功爬取到网站的数据了,接下来我们对.csv文件中的数据进行分析。数据分析涉及的知识点非常多,这里只对空气质量指数数据做简单的排名分析。当然,也可以根据需要对所有城市的单项数据进行分析。
1. 引入该项目需要用到的相关库和模块

python">import pandas as pd
import matplotlib.pyplot as plt

2. 解决中文不能正常显示问题

python">#解决中文不能正常人显示问题
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

3. 接下来写main函数
主要涉及到python的图表操作和数据预处理,具体实现代码如下:

python">def main():
    aqi_data = pd.read_csv('china_city_aqi.csv')  #??csv??
    print('爬取数据类别')
    print(aqi_data.info())

    print('测试数据')
    print(aqi_data.head())

    #????????AQI???0???
    clean_aqi_data = aqi_data[aqi_data['AQI']>0]
    print('AQI最大值:',clean_aqi_data['AQI'].max())
    print('AQI最小值:',clean_aqi_data['AQI'].min())
    print('AQI平均值:',clean_aqi_data['AQI'].mean())

    #?????AQI?50????
    top_50_cities = clean_aqi_data.sort_values(by=['AQI']).head(50)
    top_50_cities.plot(kind='bar',x='city',y='AQI',title='AQI五十强',figsize=(32,18))
    plt.savefig('top_50_cities_bar.png')
    plt.show()

4. 最后写两行代码防止在被其他文件导入时显示多余的程序主体部分。

python">if __name__ == '__main__':
    main()

5. 看一下运行结果
在这里插入图片描述
 China AQI五十强
附录:完整代码

python"># -*- coding: utf-8 -*-

import requests
import csv
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt


#解决中文不能正常人显示问题
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False


def get_city_aqi(city_pinyin):

    #获取城市AQI
    url = 'http://pm25.in/' + city_pinyin
    r = requests.get(url,timeout=60)
    soup = BeautifulSoup(r.text,'html.parser')
    div_list = soup.find_all('div',{'class':'span1'})

    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()
        city_aqi.append(value)
    return city_aqi

def get_all_cites():
    #获取所有城市及url
    url = 'http://pm25.in/'
    city_list = []
    r = requests.get(url, timeout=60)
    soup = BeautifulSoup(r.text, 'html.parser')

    city_div = soup.find_all('div',{'class':'bottom'})[1]  #查找该网页的第2个bottom
    city_link_list = city_div.find_all('a')
    for city_link in city_link_list:
        city_name = city_link.text
        city_pinyin  = city_link['href'][1:]               #查找city_link_list的herf并从第2个字符取出
        city_list.append((city_name,city_pinyin))
    return city_list

def main():
    city_list = get_all_cites()

    header = ['city','AQI','PM2.5/1h','PM10/1h','CO/1h','NO2/1h','O3/1h','O3/8h','SO2/1h']

    with open('china_city_aqi.csv','w',encoding='utf-8',newline='') as f:
        writer =csv.writer(f)
        writer.writerow(header)
        for i,city in enumerate(city_list):
            if (i+1)%10 == 0:
                print('已经处理{}条数据。(共有{}条数据)'.format(i+1,len(city_list)))
            city_name = city[0]
            city_pinyin = city[1]
            city_aqi = get_city_aqi(city_pinyin)
            row = [city_name]+city_aqi
            writer.writerow(row)
    
    
    aqi_data = pd.read_csv('china_city_aqi.csv')  #??csv??
    print('爬取数据类别')
    print(aqi_data.info())

    print('测试数据')
    print(aqi_data.head())

    #????????AQI???0???
    clean_aqi_data = aqi_data[aqi_data['AQI']>0]
    print('AQI最大值:',clean_aqi_data['AQI'].max())
    print('AQI最小值:',clean_aqi_data['AQI'].min())
    print('AQI平均值:',clean_aqi_data['AQI'].mean())

    #?????AQI?50????
    top_50_cities = clean_aqi_data.sort_values(by=['AQI']).head(50)
    top_50_cities.plot(kind='bar',x='city',y='AQI',title='AQI五十强',figsize=(32,18))
    plt.savefig('top_50_cities_bar.png')
    plt.show()

if __name__ == '__main__':
    main()

各位的鼓励就是我创作的最大动力,如果哪里写的不对的,欢迎评论区留言进行指正,如有收获请给博主一个免费的赞鼓励下呗📝


http://www.niftyadmin.cn/n/1213513.html

相关文章

micropython移植教程_移植MicroPython到NUCLEO_L476RG开发板

在最新的 MicroPython 源码中,已经加入了STM32L476DISC开发板,但是还没有NUCLEO-L476RG开发板。而我只有NUCLEO-L476RG开发板,要在NUCLEO-L476RG开发板上跑MicroPython,只有自己移植一下了。好在两个开发板使用的MCU是一样的&…

求图像中指定颜色区域的相对面积问题

一、问题描述 下图为一张医学图像,图中的阴影面积为坏死需要切除的脑组织,其中黑色的圆圈为AI所画,红色的圆圈为临床医生所画,现在需要计算阴影面积大小。 二、解决思路 思路一:由图可见,两个圆圈均为椭…

神经网络原理一个简单的神经网络模型搭建

神经网络基本原理 文章目录神经网络基本原理前言一、神经网络是什么?1.1 神经网络的分类1.2 神经网络结构图1.3 神经元1.4 为什么神经网络能预测?二、 一个最简单的神经网络模型1.去不去爬山?2.案例代码2.1 引入类库2.2 创建数据2.3 初始假设2.4 神经元…

python编辑器哪个好用_PDF编辑器哪个好用?附操作教程

现在我们平时无论是工作还是学习中日常文档使用最多的几乎都是PDF格式,但相较Word打开就能直接修改,PDF文档应该如何编辑呢?如果使用PDF编辑器进行修改呢?目前市面上的PDF编辑器很多,以下自己经常使用的一款免费的极速…

diy台式机_台式机组装教程 教你台式机怎么组装

自己动手组装台式电脑也称之为DIY电脑,该行为一直是很多电脑玩家首选的购机方式,DIY电脑一直都是电脑爱好者非常喜欢的,电脑组装通常包括电脑硬件的选择,DIY硬件组装以及操作系统安装三个部分。针对很多还不清楚如何自动动手组装台…

如何理解数据的保密性与完整性?如何保证数据的保密性与完整性?

文章目录前言第一章、数据第二章、OSI七层网络模型&TCP/IP四层模型2.1 数据封装与解封2.2 应用层2.3 传输层2.4 网络层2.5 数据链路层2.6 物理层2.7 小结第三章、数据的保密性与完整性3.1 数据可用性3.2 数据完整性3.3 数据保密性第四章、为什么说HTTPS能保证数据传输的完整…

redis 保存 array list 区别_整理了一篇文章让你快速了解Redis底层数据结构

前言在互联网和大数据时代,特别是分布式系统大行其道的今天,Redis是一个广泛被应用在我们系统之中,不论是传统的ERP、CRM还是互联网高并发的系统。Redis是一款开源、高性能、基于C语言开发的键值对存储的NoSql数据库。所以我们应该需要对Redi…

GB/T 28448-2019 《信息安全技术 网络安全等级保护测评要求》之安全物理环境测评解读

文章目录引言一、物理位置选择二、物理访问控制三、防盗窃和破坏四、防雷击五、防火六、防水和防潮七、防静电八、温湿度控制九、电力供应十、电磁防护总结引言 2019年12月1日,我国已经进入等保2.0时代,2017年6月1日《网络安全法》正式实施,…