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

文章目录

  • 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. 引入该项目需要用到的相关库和模块

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中,具体代码如下:

def get_all_cites():
#获取所有城市及urlurl = '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个bottomcity_link_list = city_div.find_all('a')for city_link in city_link_list:city_name = city_link.textcity_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写入列表。

具体代码如下:

def get_city_aqi(city_pinyin):#获取城市AQIurl = 'http://pm25.in/' + city_pinyinr = 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 具体实现代码如下:

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_aqiwriter.writerow(row)

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

if __name__ == '__main__':main()

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

二、数据分析

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

import pandas as pd
import matplotlib.pyplot as plt

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

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

3. 接下来写main函数
主要涉及到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. 最后写两行代码防止在被其他文件导入时显示多余的程序主体部分。

if __name__ == '__main__':main()

5. 看一下运行结果


附录:完整代码

# -*- 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'] = Falsedef get_city_aqi(city_pinyin):#获取城市AQIurl = 'http://pm25.in/' + city_pinyinr = 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_aqidef get_all_cites():#获取所有城市及urlurl = '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个bottomcity_link_list = city_div.find_all('a')for city_link in city_link_list:city_name = city_link.textcity_pinyin  = city_link['href'][1:]               #查找city_link_list的herf并从第2个字符取出city_list.append((city_name,city_pinyin))return city_listdef 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_aqiwriter.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()

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

python网页爬虫+简单的数据分析相关推荐

  1. python网页爬虫-Python网页爬虫

    曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选 ...

  2. python与excel结合能做什么-Python网络爬虫与文本数据分析

    原标题:Python网络爬虫与文本数据分析 课程介绍 在过去的两年间,Python一路高歌猛进,成功窜上"最火编程语言"的宝座.惊奇的是使用Python最多的人群其实不是程序员,而 ...

  3. Python 网页爬虫 文本处理 科学计算 机器学习 数据挖掘兵器谱 - 数客

    曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选 ...

  4. Python网络爬虫简单教程——第一部

    Python网络爬虫简单教程--第一部 感谢,如需转载请注明文章出处:https://blog.csdn.net/weixin_44609873/article/details/103384984 P ...

  5. Python 网页爬虫 文本处理 科学计算 机器学习 数据挖掘兵器谱

    Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱 2015-04-27 程序猿 程序猿 来自:我爱自然语言处理,www.52nlp. ...

  6. python网络爬虫实训报告-Python网络爬虫与文本数据分析

    原标题:Python网络爬虫与文本数据分析 在过去的两年间,Python一路高歌猛进,成功窜上"最火编程语言"的宝座.惊奇的是使用Python最多的人群其实不是程序员,而是数据科学 ...

  7. python网页爬虫-python网页爬虫浅析

    Python网页爬虫简介: 有时候我们需要把一个网页的图片copy 下来.通常手工的方式是鼠标右键 save picture as ... python 网页爬虫可以一次性把所有图片copy 下来. ...

  8. python多线程爬虫实例-Python多线程爬虫简单示例

    python是支持多线程的,主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. ...

  9. Python网页爬虫--

    pycharm里安装beautifulSoup以及lxml,才能使爬虫功能强大. 做网页爬虫需要,<网页解析器:从网页中提取有价值数据的工具 http://blog.csdn.net/ochan ...

最新文章

  1. Sobel算子及cvSobel
  2. 面试|图解kafka的高可用机制
  3. Android locksettings/gatekeeper代码导读
  4. 检测到python编程环境中存在多个版本_linux下多个python版本怎么管理?
  5. 字扩展、位扩展、字位同时扩展
  6. 敲了 10000 小时代码,我也没能成为一名高级程序员
  7. jQuery的getter和setter
  8. java guava map创建,数组合并,数组分割连接
  9. 转载]转如何理解 File's Owner 与 First Responder
  10. 记录一个好用的压缩软件 HandBrake
  11. 习惯养成android软件,7款好用的习惯养成与打卡APP推荐
  12. 使用Origin绘制弦图全流程
  13. JSON值的获取以及遍历 [JSON]
  14. 如何使用php写爬虫,PHP能写爬虫吗?(PHP实现爬虫技术示例)
  15. D630,vista sp2,4GB Turbo Memory,ITMService.exe(SmartPinService),Posses lots of CPU Resources
  16. 锐龙r7 4800U和i7-10710U 哪个好
  17. mergeField解析(构造函数)
  18. 一次百度网盘的悲惨经历
  19. android手机如何设置提高网速,安卓手机网速慢怎么办 安卓手机网速慢解决办法【详解】...
  20. java ipc pgsql_[转]PostgreSQL源码结构

热门文章

  1. 126邮箱设置html发送邮件,126邮箱设置pop3
  2. 2.4、PHP数组与数组结构
  3. WIFI协议及ESP8266 AT指令
  4. 三菱Q系列QJ71C24N模块 MODBUS通信(含完整步骤+源代码)
  5. SSH工具Putty,Psftp,Pageant,Puttygen实用技巧
  6. PHP之高并发解决方案
  7. 视频会议高清桌面共享
  8. C语言的按位取反符号~(详解)
  9. (转)ISV英文全称是Independent Software Vendors ,意为“独立软件开发商”
  10. 原谅我不是一个阳光的男孩