阅读量:0
🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972
个人介绍: 研一|统计学|干货分享
擅长Python、Matlab、R等主流编程软件
累计十余项国家级比赛奖项,参与研究经费10w、40w级横向
文章目录
该篇将进行城市天气信息爬取实战,主要涉及到网页url解析、正则表达匹配等技术,可用作网页爬虫练手项目。
1 Python网页爬虫简介
Python是一种流行的编程语言,用于开发各种应用程序,包括网页爬虫。网页爬虫(Web Crawler)是一种自动化程序,用于在互联网上浏览和收集数据。Python提供了许多库和工具,使开发人员能够轻松地构建网页爬虫。
Python进行网页爬虫的基本原理是模拟人类在互联网上浏览网页的行为。爬虫程序会向目标网站发送请求,获取网页的HTML代码,然后解析这个HTML代码,提取出所需的数据。Python中的requests和BeautifulSoup库是实现这个过程的重要工具。
Python爬虫架构主要由以下几个部分组成:
- 调度器(Scheduler):负责调度URL管理器、下载器、解析器之间的协调工作。
- URL管理器(URL Manager):包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL。
- 网页下载器(Web Downloader):负责从互联网上下载网页的HTML代码。
- 网页解析器(Web Parser):负责解析网页的HTML代码,提取出所需的数据。
- 应用程序(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格式数据的url if (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.c2c else: 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]).T data_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 re months = [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格式数据的url if (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.c2c else: 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]).T data_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)