全国历史天气查询/历史天气预报查询——全国各月份数据爬取

效果

图1 目标爬取数据 图2 最终实验效果

实验效果:最终可将官网已有的数据进行爬取整理,共363个城市,从2011年1月——至今

数据已上传至CSDN,若无C币的小伙伴可以自行爬取或至QQ群:782589269,群文件中免费下载使用

目录

  • 全国历史天气查询/历史天气预报查询——全国各月份数据爬取
  • 效果
  • 导入所需库
  • 分析官网HTML内容
  • 使用正则抽取所需的城市名信息
  • 爬取全部的城市名与链接
  • 保存城市名与基链接
  • 各城市的月份数据爬取

全国历史天气查询_历史天气预报查询_温度查询_天气后报官网,戳它直达!

导入所需库

import os
import re
import time
import pandas as pd
from tqdm import tqdm
import pickle
import requests

分析官网HTML内容

首先,进行官网HTML内容的分析,找出我们所需信息的代码段
官网链接:http://www.tianqihoubao.com/lishi/

url = "http://www.tianqihoubao.com/lishi/"
url_request = requests.get(url)
url_request.encoding = 'gb2312'
url_text = url_request.text
print(url_text)


可以看出我们要爬取的城市名在,诸如这样的<a>城市名</a>代码块

<a href="/lishi/bj.htm" title=“北京历史天气预报”><b>北京</b></a>

使用正则抽取所需的城市名信息

若不懂正则表达式,在此,你只需了解在正则表达式中可以用(\w+)来提取所需内容即可
比如对于上例中的链接,将其中的‘北京’换成(\w+)即可,对于各城市相同的部分保持不变,各城市不同的部分使用正则表达式替换,不加括号代表不提取,即\w+
因此,可以得到下述pattern提取公式

url ='<a href="/lishi/beijing.html" title="北京历史天气查询">北京 </a>'
pattern = '<a href="/lishi/(\w+.html)" title="\w+">(\w+) </a>'

实验测试

exapmle_text = '<a href="/lishi/beijing.html" title="北京历史天气查询">北京 </a>'
pattern =  re.compile(r'<a href="/lishi/(\w+.html)" title="\w+">(\w+) </a>')
example_city = pattern.findall(exapmle_text)
print(example_city)

爬取全部的城市名与链接

pattern =  re.compile(r'<a href="/lishi/(\w+.html)" title="\w+">(\w+) </a>')
citys = pattern.findall(url_text) # 获取363个城市名
print("已获取{}个城市名,第一个城市是{},最后一个城市是{}".format(len(citys),citys[0],citys[-1]))


进行城市各月份链接的爬取,以同样的方法分析其中一个城市的各月份链接地址,如北京
北京2011年1月的链接为
http://www.tianqihoubao.com/lishi/beijing/month/201101.html
北京2011年2月的链接为
http://www.tianqihoubao.com/lishi/beijing/month/201102.html

可以得到如下规律

  • 基地址:http://www.tianqihoubao.com/lishi/
  • 城市地址:beijing/
  • 月份地址:month/201101.html
  • 各个城市的月份链接地址=基地址+城市地址+月份地址

以此规律进行爬取即可?
不可,在笔者尝试N次后,发现必然部分城市数据爬取不全,为什么呢?因为这个网站的HTML语言不是均按照上述规律写的(可能官网的程序员中途换人了,真的太让人头秃了)

实验发现,大约对于同一个城市有大约这样四种神奇的HTML语言格式,在此就是一展你正则表达式的水平的时候了…(写了个爬虫,正则倒是进步了)

exapmle_text = '''<li><a href='/lishi/beijing/month/201101.html' title=\"北京2011年01月天气\">2011年1月北京天气</a></li><li><a href='/lishi/beijing/month/201604.html' >2016年4月北京天气</a></li><li><a href='/lishi/beijing/month/201605.html'>2016年5月北京天气</a></li><li><a href='beijing/month/201612.html'>2016年12月北京天气</a></li>
'''pattern =  re.compile(r"<li><a href='/lishi/(\w+/\w+/\w+.html)'\s?title=\"\w+\">\w+</a></li>|<li><a href='(?:/lishi/)?(\w+/\w+/\w+.html)'\s?>\w+</a></li>")
pattern.findall(exapmle_text)

进行城市月份数据的爬取

city_urls = {}
base_url = 'http://www.tianqihoubao.com/lishi/'for url_city in citys:url,city = url_citycity_base_url = base_url + urlcity_urls[city] = []pattern =  re.compile(r"<li><a href='/lishi/(\w+/\w+/\w+.html)'\s?title=\"\w+\">\w+</a></li>|<li><a href='(?:/lishi/)?(\w+/\w+/\w+.html)'\s?>\w+</a></li>") city_url_request = requests.get(city_base_url)for tuple_ in pattern.findall(city_url_request.text):i,j = tuple_if i.strip():i = base_url + icity_urls[city].append(i)else:j = base_url + jcity_urls[city].append(j)print('{}:{}份数据'.format(city,len(city_urls[city])))print('示例链接:',city_urls[city][0],'\n')

保存城市名与基链接

本地保存后,即使后面实验失败了,也可以从此再次断点重启
通过pickle保存字典

with open("city_urls.file", "wb") as f:pickle.dump(city_urls, f)
# 通过pickle读取字典
with open("city_urls.file", "rb") as f:city_urls = pickle.load(f)

各城市的月份数据爬取

df:将保存所有数据,以城市列为区分
df_city:将保存各个城市单独的数据
error:不断记录爬取失败的城市与对应链接

df = pd.DataFrame(columns = ['日期', '天气状况', '气温', '风力风向','城市'])
error = []for city in tqdm(city_urls.keys()):df_city = pd.DataFrame(columns = ['日期', '天气状况', '气温', '风力风向','城市'])if city + '.csv' in os.listdir('./output/'):continuefor month_url in city_urls[city]:try:dataframe = pd.read_html(month_url,encoding = 'gb2312')[0]if dataframe.shape[0] == 0:dataframe = pd.DataFrame(columns = ['日期', '天气状况', '气温', '风力风向','城市'])dataframe.loc[0,:] = [None,None,None,None,city]else:dataframe = dataframe.loc[1:,:]dataframe.columns = ['日期', '天气状况', '气温', '风力风向']dataframe['城市'] = citydf_city = df_city.append(dataframe)df = df.append(dataframe)except:print('Error')print(month_url)error.append((city,month_url))continuedf_city.to_csv('./output/'+city+'.csv',index=False)   print('城市:\t',city,'数据收集完毕')
print('所有城市数据,已收集完成!')

全国历史天气查询/历史天气预报查询——全国各月份数据爬取相关推荐

  1. Scrapy全国历史天气数据爬取

    Scrapy全国历史天气数据爬取 历史天气网站http://www.tianqihoubao.com/lishi/ 1.解析网页 我们要爬取每个城市,近10年的历史天气数据,我们需要进到每个城市历史数 ...

  2. 轻松实现全国高校地理位置数据爬取(文末附源码和数据集)

    大家好,我是小一 一个城市的历史底蕴,不光可以从经济.文化和人文景点,还可以从高校的数量可以看出来.所以,今天就来试试如何爬取全国高校的分布数据. 以下文章比较适合初学者,老读者请酌情加速阅读. 今天 ...

  3. 猫眼网历史日票房数据爬取

    文章目录 前言 一.分析猫眼网榜单网页和票房明细网页 二.使用步骤 1.引入库 2.获取并分析源码函数 3.主函数部分 若需要额外的榜单外的电影,可以直接去猫眼查询电影名称, 然后查看网页源码,使用c ...

  4. 轻松实现全国高校地理位置数据爬取

    一个城市的历史底蕴,不光可以从经济.文化和人文景点,还可以从高校的数量可以看出来.所以,今天就来试试如何爬取全国高校的分布数据. 天要爬取的网站是:中国教育在线,对应的网址是:https://gkcx ...

  5. [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势

    思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图显示.情感分析.舆情分析.主题挖掘.威胁情报溯源.知识图谱.预测预警及AI和NL ...

  6. power BI 天气数据爬取

    简介 本篇案例主要介绍如何通过power BI 构建爬虫抓取历史天气数据 数据爬取 如何从power bi 获取网页的数据 首先,打开需要爬起天气数据的网站,点击历史天气,之后可以看到全国各个省份和城 ...

  7. Python爬虫 —— 以北京天气数据爬取为例

    本文以北京天气为例讲解数据爬取的整个流程,不涉及网络爬虫的原理,直接讲爬取代码怎么写! 1.首先找到你要爬取的网站url:'http://www.tianqihoubao.com/lishi/beij ...

  8. scrapy爬取天气存MySQL_Scrapy实战篇(五)之爬取历史天气数据

    本篇文章我们以抓取历史天气数据为例,简单说明数据抓取的两种方式: 1.一般简单或者较小量的数据需求,我们以requests(selenum)+beautiful的方式抓取数据 2.当我们需要的数据量较 ...

  9. python实现天气数据爬取实现数据可视化和天气查询gui界面设计

    在学校大一实训中,我的实训项目就是使用python爬取天气数据并且实现gui图形界面的设计. 实训结束了,希望自己的代码可以帮助大家的学习.(代码是大一时候写的,比较青涩,大家多包涵) 第一个部分是g ...

最新文章

  1. 题目 1093:【蓝桥杯】【入门题】字符逆序
  2. 又一位!26岁当上985博导,读博期间也曾两次想要退学......
  3. [20160303]显示bbed x命令格式.txt
  4. Vc2003可以直接跑quake3
  5. Ubuntu中安装Pycharm
  6. windows2008的功能介紹及其与2003的差异
  7. 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)
  8. 学习旧岛小程序 (5) 自定义组件的自定义事件
  9. SIT和UAT有什么区别?
  10. 特朗普的《AI 倡议》存在一个致命问题
  11. 网络工程师交换试验手册之十八:SWITCH的基本配置
  12. MongoDB主键是您的朋友
  13. Anaconda如何重新在开始菜单显示
  14. java中为按钮添加图片_如何在Java中为字符串添加双引号?
  15. vim 文本编辑器_标志性的文本编辑器Vim庆祝成立25周年
  16. 【Kafka】Kafka IllegalArgumentException: Could not find a ‘KafkaClient‘ entry in the JAAS configuratio
  17. OCR——PaddleOCR之文字识别的学习笔记
  18. gdi win7奔溃_gdiplus.dll 32/64位
  19. Spring集成ESAPI
  20. java ftps 证书_java – 连接到FTPS服务器

热门文章

  1. linux 中了挖矿病毒
  2. progressview_SwiftUI中的ProgressView
  3. scoped和deep的关系/写在scoped里css失效
  4. 120行python代码解锁10000分微信跳一跳
  5. excel通过sumproduct和countifs不重复计数(数据中包含空白单元)
  6. heritrix3 java_heritrix 3.2.0 详解 1 -- 环境搭建
  7. 力扣春季编程大赛(LCCUP‘21)
  8. mac anaconda 安装 opencv2 python3.6
  9. Linux学习笔记——ubuntu必会背景知识及系统目录结构详解
  10. ADMM算法相关资源