【爬虫实战】——Python爬取天气信息

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

   个人介绍: 研一|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

文章目录

  • 1 Python网页爬虫简介
  • 2 爬虫实战
    • 2.1 导入相关包
    • 2.2 爬取时间范围及城市设置
    • 2.3 爬取信息设置
    • 2.4 天气信息抓取
    • 2.4 结果存储
    • 2.5 效果展示
  • 3 完整代码

该篇将进行城市天气信息爬取实战,主要涉及到网页url解析、正则表达匹配等技术,可用作网页爬虫练手项目。

1 Python网页爬虫简介

  Python是一种流行的编程语言,用于开发各种应用程序,包括网页爬虫。网页爬虫(Web Crawler)是一种自动化程序,用于在互联网上浏览和收集数据。Python提供了许多库和工具,使开发人员能够轻松地构建网页爬虫。

  Python进行网页爬虫的基本原理是模拟人类在互联网上浏览网页的行为。爬虫程序会向目标网站发送请求,获取网页的HTML代码,然后解析这个HTML代码,提取出所需的数据。Python中的requests和BeautifulSoup库是实现这个过程的重要工具。

  Python爬虫架构主要由以下几个部分组成:

  1. 调度器(Scheduler):负责调度URL管理器、下载器、解析器之间的协调工作。
  2. URL管理器(URL Manager):包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL。
  3. 网页下载器(Web Downloader):负责从互联网上下载网页的HTML代码。
  4. 网页解析器(Web Parser):负责解析网页的HTML代码,提取出所需的数据。
  5. 应用程序(Application):从网页中提取的有用数据组成的一个应用。

  在Python中进行网页爬虫开发时,还需要注意遵守网站的robots.txt文件规定,以避免对网站造成不必要的负担或违反法律法规。同时,爬虫程序也需要处理各种网络异常和错误,以确保程序的稳定性和可靠性。

  总之,Python是一种非常适合进行网页爬虫开发的编程语言,通过掌握相关的库和工具,开发人员可以轻松地构建出高效、稳定的爬虫程序,从互联网上获取所需的数据。

2 爬虫实战

2.1 导入相关包

import requests
import pandas as pd
import re

2.2 爬取时间范围及城市设置

months = [1,2,3,4,5,6,7,8,9,10,11,12]
years = [2016,2017,2018,2019,2020,2021,2022,2023] 
citys = [59287]

此处城市代码选取‘59287’,实际操作可另选区域或多区域。

2.3 爬取信息设置

index_ = ['MaxTemp','MinTemp', 'WindDir', 'Wind', 'Weather','Aqi','AqiInfo','AqiLevel'] 
# 选取的气象要素

2.4 天气信息抓取

data = pd.DataFrame(columns=index_)  # 建立一个空dataframe
for c in citys:for y in years:for m in months:# 找到json格式数据的urlif (y<2017) or (y==2017)&(m<=11):url = "http://tianqi.2345.com/t/wea_history/js/"+str(c)+"_"+str(y)+str(m)+".js" # ?qq-pf-to=pcqq.c2celse:url = "http://tianqi.2345.com/t/wea_history/js/"+str(y)+str(m).zfill(2)+"/"+str(c)+"_"+str(y)+str(m).zfill(2)+".js"print(url)response = requests.get(url=url)if response.status_code == 200:  # 防止url请求无响应response2 = response.text.replace("'", '"')  # 这一步可以忽略#  利用正则表达式获取各个气象要素(方法不唯一)date = re.findall("[0-9]{4}-[0-9]{2}-[0-9]{2}", response2)[:-2]mintemp = re.findall('yWendu:"(.*?)℃', response2)maxtemp = re.findall('bWendu:"(.*?)℃', response2)winddir = re.findall('fengxiang:"([\u4E00-\u9FA5]+)',response2)wind = re.findall('fengli:"([\u4E00-\u9FA5]+)',response2)weather = re.findall('tianqi:"([[\u4E00-\u9FA5]+)~?', response2)aqi = re.findall('aqi:"(\d*)',response2)aqiInfo = re.findall('aqiInfo:"([\u4E00-\u9FA5]+)',response2)aqiLevel = re.findall('aqiLevel:"(\d*)',response2)data_spider = pd.DataFrame([maxtemp,mintemp, winddir, wind, weather,aqi,aqiInfo,aqiLevel]).Tdata_spider.columns = index_  # 修改列名data_spider.index = date  # 修改索引data = pd.concat((data,data_spider), axis=0)  # 数据拼接print('%s年%s月的数据抓取成功' % (y, m))else:print('%s年%s月的数据不存在' % (y, m))break

2.4 结果存储

data.to_excel('D:\\天气数据可视化\\天气数据可视化.xlsx')
print('爬取数据展示:\n', data)

2.5 效果展示

3 完整代码

import requests
import pandas as pd
import remonths = [1,2,3,4,5,6,7,8,9,10,11,12]
years = [2016,2017,2018,2019,2020,2021,2022,2023] 
citys = [59287] index_ = ['MaxTemp','MinTemp', 'WindDir', 'Wind', 'Weather','Aqi','AqiInfo','AqiLevel']  # 选取的气象要素
data = pd.DataFrame(columns=index_)  # 建立一个空dataframe
for c in citys:for y in years:for m in months:# 找到json格式数据的urlif (y<2017) or (y==2017)&(m<=11):url = "http://tianqi.2345.com/t/wea_history/js/"+str(c)+"_"+str(y)+str(m)+".js" # ?qq-pf-to=pcqq.c2celse:url = "http://tianqi.2345.com/t/wea_history/js/"+str(y)+str(m).zfill(2)+"/"+str(c)+"_"+str(y)+str(m).zfill(2)+".js"print(url)response = requests.get(url=url)if response.status_code == 200:  # 防止url请求无响应response2 = response.text.replace("'", '"')  # 这一步可以忽略#  利用正则表达式获取各个气象要素(方法不唯一)date = re.findall("[0-9]{4}-[0-9]{2}-[0-9]{2}", response2)[:-2]mintemp = re.findall('yWendu:"(.*?)℃', response2)maxtemp = re.findall('bWendu:"(.*?)℃', response2)winddir = re.findall('fengxiang:"([\u4E00-\u9FA5]+)',response2)wind = re.findall('fengli:"([\u4E00-\u9FA5]+)',response2)weather = re.findall('tianqi:"([[\u4E00-\u9FA5]+)~?', response2)aqi = re.findall('aqi:"(\d*)',response2)aqiInfo = re.findall('aqiInfo:"([\u4E00-\u9FA5]+)',response2)aqiLevel = re.findall('aqiLevel:"(\d*)',response2)data_spider = pd.DataFrame([maxtemp,mintemp, winddir, wind, weather,aqi,aqiInfo,aqiLevel]).Tdata_spider.columns = index_  # 修改列名data_spider.index = date  # 修改索引data = pd.concat((data,data_spider), axis=0)  # 数据拼接print('%s年%s月的数据抓取成功' % (y, m))else:print('%s年%s月的数据不存在' % (y, m))break
data.to_excel('D:\\天气数据可视化\\天气数据可视化.xlsx')
print('爬取数据展示:\n', data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511113.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样

Tomcat(二) 动静分离

一、(TomcatNginx)动静分离 1、单机反向代理 利用 nginx 反向代理实现全部转发至指定同一个虚拟主机 客户端curl www.a.com 访问nginx服务&#xff0c;nginx服务通过配置反向代理proxy_pass www.a.com:8080&#xff0c;最终客户端看到的是www.a.com 实验中&#xff1a;7-3 做客…

wordpress模板官网

移民wordpress主题 移民代办wordpress主题&#xff0c;适合做海外移民咨询的代理公司搭建wordpress企业官方网站使用。 https://www.jianzhanpress.com/?p5130 夏令营wordpress主题 绿色夏令营wordpress主题&#xff0c;适合做夏令营或户外拓展的公司搭建wordpress官方网站…

【小白学机器学习6】真实值,观测值,拟合值,以及数据的误差的评价:集中趋势,离散度,形状等

目录 1 世界上有哪几种值&#xff1f;只有3种值 1.1 真值/真实值/理想值/主观值&#xff08;形而上学世界里&#xff09; 1.2 实际值/现实值/观测值/样本值&#xff08;看到的/记录下来的&#xff09; 1.3 拟合值/预测值&#xff08;算出来的&#xff09; 2 对数据的各种…

Python 语句(二)【循环语句】

循环语句允许执行一个语句或语句组多次&#xff0c;其程序流程图如下&#xff1a; 在python中有三种循环方式&#xff1a; while 循环 当判断条件为 true 时执行循环体&#xff0c;否则退出循环体。for 循环 重复执行语句嵌套循环 &#xff08;在while循环体中嵌套for循环&…

达梦、金仓、南大、瀚高、优炫:从社区建设看企业技术自信心

正文约950字&#xff0c;预计阅读时间2分钟 国产技术厂商在面对自身产品问题时&#xff0c;往往保持回避态度&#xff0c;不愿公之于众&#xff0c;主要原因有2方面&#xff1a; 1&#xff0c;产品技术层面问题较多&#xff0c;如某些根本性缺陷难以攻克&#xff0c;或问题发…

12-Java享元模式 ( Flyweight Pattern )

Java享元模式 摘要实现范例 享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能 享元模式尝试重用现有的同类对象&#xff0c;如果未找到匹配的对象&#xff0c;则创建新对象 享元模式属于结构型模式&…

Python字符串中%d,%.f的用法

在字符串中&#xff0c;我们经常需要改变其中的一些几个字符&#xff0c;比如 第一个d%就是epoch1&#xff0c;会随着epoch的变化而变化。同理&#xff0c;后面的也是。打印出的结果就是 其中&#xff0c;epoch迭代了3次&#xff0c;从0开始。会发现 d%&#xff0c;是整数&…

RabbitMQ(三):AMQP协议

目录 1 AMQP协议1.1 AMQP协议介绍1、AMQP是什么2、消息代理中间件的职责 1.2 AMQP 0-9-1模型1、AMQP的工作过程2、交换器和交换器类型3、队列队列属性队列名称队列持久化 1.3 几个概念1、绑定2、消费者3、消息确认4、预取消息5、消息属性和有效载荷&#xff08;消息主体&#x…

electron+vue3全家桶+vite项目搭建【29】封装窗口工具类【3】控制窗口定向移动

文章目录 引入实现效果思路声明通用的定位对象主进程模块渲染进程测试效果 引入 demo项目地址 窗口工具类系列文章&#xff1a; 封装窗口工具类【1】雏形 封装窗口工具类【2】窗口组&#xff0c;维护窗口关系 封装窗口工具类【3】控制窗口定向移动 很多时候&#xff0c;我们想…

Stream流(Java)

目录 一、介绍 二、Stream流的使用步骤 三、Stream流常见的中间方法 四、Stream流常见的终结方法 一、介绍 Stream也叫Stream流&#xff0c;是JDK8开始新增的一套API&#xff0c;可以用于操作集合或者数组的数据。 优势&#xff1a;Stream流大量的结合了Lambda的语法风格来…

基于springboot+vue的球队训练信息管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…