天气预报爬虫-多城市-更新版

2023-12-13 19:52

本文主要是介绍天气预报爬虫-多城市-更新版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下是直接保存到数据库版本的

import pandas as pd
from bs4 import BeautifulSoup
import re
import time
import requests
import pymysql
import datetime#请求页面方法
def getPage(url):#设置请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}#请求页面html = requests.get(url,headers=headers)#查看网页状态码,如果为200则为正常if html.status_code == 200:#返回网页文本内容return html.textelse:return Nonedef getWeekend(year,month,day):week_list = ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]return week_list[datetime.date(year,month,day).weekday()] def concatDate(dateString):date = re.findall('>(.*?)</a>',dateString)[0]dateYear = date[:4]dateMonth = date[4:6]dateDay = date[6:]dateString = dateYear+'-'+dateMonth+'-'+dateDayweekendString = getWeekend(int(dateYear),int(dateMonth),int(dateDay)) return dateString,weekendStringdef analysisPage(url,city):html = getPage(url)page = BeautifulSoup(html,'html.parser')#气温lowerTemperature,higherTemperature = [],[]#日期dateList,weekList = [],[]#天气weatherList = []#风向windList = []dataList = page.find_all('tr')for item in dataList:date = item.find_all('a')weatherInformation = item.find_all('td')#temperatureif date!=[]:date,weekend = concatDate(str(date))dateList.append(date)weekList.append(weekend)temperatureInfo = weatherInformation[1]temperatureInfo = re.findall('>(.*?)</td>',str(temperatureInfo))[0]HigherTemperatureInfo = re.findall('~(.*?)℃',temperatureInfo)lowerTemperatureInfo = re.findall('(.*?)~',temperatureInfo)higherTemperature.append(HigherTemperatureInfo[0])lowerTemperature.append(lowerTemperatureInfo[0])weatherInfo = weatherInformation[2]weatherInfo = re.findall('>(.*?)</td>',str(weatherInfo))[0]weatherList.append(weatherInfo)windDirection = weatherInformation[3]windDirection = re.findall('>(.*?)</td>',str(windDirection))[0]windLevel = weatherInformation[4]windLevel = re.findall('>(.*?)</td>',str(windLevel))[0]windList.append(windDirection+' '+windLevel)else:pass#获取爬取时间crawlingTime,cityList = [],[]for i in range(len(dateList)):crawlingTime.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))cityList.append(city)res = {'日期':dateList,'星期':weekList,'天气':weatherList,'最高气温':higherTemperature,'最低气温':lowerTemperature,'风速信息':windList,"城市":cityList,"抓取时间":crawlingTime}return res#梳理数据 方便后面保存到数据库
def concatData(Dataframe):res = []for i in range(len(Dataframe)):#print(list(Dataframe.iloc[i][:]))res.append(list(Dataframe.iloc[i][:]))return resdef operateSQL():#创建数据库链接db = pymysql.connect(host="localhost",port=3306,user="root",passwd='1234567',db='studenttest',charset='utf8')# #创建数据库游标对象cursor = db.cursor()#创建数据表格return cursor,dbdef saveData(url,cityName,tableName):# url = 'https://tianqi.2345.com/today-59493.htm'res = analysisPage(url,cityName)data = pd.DataFrame(res)#保存数据data.to_csv('Resfile{}_{}.csv'.format(cityName,time.strftime('%Y-%m-%d', time.localtime(time.time())),encoding='utf-8'))#tableName = 'future_data'cursor,db = operateSQL()cursor.execute("CREATE TABLE IF NOT EXISTS %s ( ID INT AUTO_INCREMENT PRIMARY KEY, DATETIMES VARCHAR(255) , WEATHER VARCHAR(255) ,WEEKEND VARCHAR(255), LOWER_TEMPERATURE VARCHAR(255), HIGH_TEMPERATURE VARCHAR(255), WIND VARCHAR(255), CITY VARCHAR(255) ,CRAWLING_TIME DATE)"%tableName)#keys = list(res.keys())#cursor.execute("deleted from 表 where CRAWLING_TIME = '{}'"%time.strftime('%Y-%m-%d', time.localtime(time.time())))keysBox = ['DATETIMES','WEEKEND','WEATHER','HIGH_TEMPERATURE','LOWER_TEMPERATURE','WIND','CITY','CRAWLING_TIME']b = concatData(data)for item in b:#执行插入语句sql="INSERT INTO {0} ({1},{2},{3},{4},{5},{6},{7},{8}) VALUES({9},{10},{11},{12},{13},{14},{15},{16})".format(tableName,keysBox[0],keysBox[1],keysBox[2],keysBox[3],keysBox[4],keysBox[5],keysBox[6],keysBox[7],repr(item[0]),repr(item[1]),repr(item[2]),repr(item[3]),repr(item[4]),repr(item[5]),repr(item[6]),repr(item[7]))#sql="INSERT INTO test_data ({0},{1},{2},{3},{4},{5},{6},{7}) VALUES({8},{9},{10},{11},{12},{13},{14},{15})".format(keysBox[0],keysBox[1],keysBox[2],keysBox[3],keysBox[4],keysBox[5],keysBox[6],keysBox[7],repr(item[0]),repr(item[1]),repr(item[2]),repr(item[3]),repr(item[4]),repr(item[5]),repr(item[6]),repr(item[7]))print('正在执行sql语句:%s'%sql)print('--- --- ---')#执行插入语句cursor.execute(sql)db.commit()return Nonedef getHistoryWeather(): #cityList为需要爬取的城市列表的拼音cityDict = {'长沙':'changsha','杭州':'hangzhou','南宁':'nanning','深圳':'shenzhen','苏州':'suzhou','西安':'xian','厦门':'xiamen'}tableName = 'future_data'cursor,db = operateSQL()cursor.execute('DROP TABLE {}'%tableName)for key,value in cityDict.items():url = 'https://www.tianqishi.com/lishi/%s.html'%valuesaveData(url,cityName=key,tableName=tableName)time.sleep(5)print('%s执行完毕'%key)if __name__ == '__main__':# url = 'https://www.tianqishi.com/lishi/changsha.html'# res = analysisPage(url,'长沙')# print(res)getHistoryWeather()

以下是直接保存到本地csv文件的代码:

import pandas as pd
from bs4 import BeautifulSoup
import re
import time
import requests
import pymysql
import datetime#请求页面方法
def getPage(url):#设置请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}#请求页面html = requests.get(url,headers=headers)#查看网页状态码,如果为200则为正常if html.status_code == 200:#返回网页文本内容return html.textelse:return Nonedef getWeekend(year,month,day):week_list = ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]return week_list[datetime.date(year,month,day).weekday()] def concatDate(dateString):date = re.findall('>(.*?)</a>',dateString)[0]dateYear = date[:4]dateMonth = date[4:6]dateDay = date[6:]dateString = dateYear+'-'+dateMonth+'-'+dateDayweekendString = getWeekend(int(dateYear),int(dateMonth),int(dateDay)) return dateString,weekendStringdef analysisPage(url,city):html = getPage(url)page = BeautifulSoup(html,'html.parser')#气温lowerTemperature,higherTemperature = [],[]#日期dateList,weekList = [],[]#天气weatherList = []#风向windList = []dataList = page.find_all('tr')for item in dataList:date = item.find_all('a')weatherInformation = item.find_all('td')#temperatureif date!=[]:date,weekend = concatDate(str(date))dateList.append(date)weekList.append(weekend)temperatureInfo = weatherInformation[1]temperatureInfo = re.findall('>(.*?)</td>',str(temperatureInfo))[0]HigherTemperatureInfo = re.findall('~(.*?)℃',temperatureInfo)lowerTemperatureInfo = re.findall('(.*?)~',temperatureInfo)higherTemperature.append(HigherTemperatureInfo[0])lowerTemperature.append(lowerTemperatureInfo[0])weatherInfo = weatherInformation[2]weatherInfo = re.findall('>(.*?)</td>',str(weatherInfo))[0]weatherList.append(weatherInfo)windDirection = weatherInformation[3]windDirection = re.findall('>(.*?)</td>',str(windDirection))[0]windLevel = weatherInformation[4]windLevel = re.findall('>(.*?)</td>',str(windLevel))[0]windList.append(windDirection+' '+windLevel)else:pass#获取爬取时间crawlingTime,cityList = [],[]for i in range(len(dateList)):crawlingTime.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))cityList.append(city)res = {'日期':dateList,'星期':weekList,'天气':weatherList,'最高气温':higherTemperature,'最低气温':lowerTemperature,'风速信息':windList,"城市":cityList,"抓取时间":crawlingTime}return res#梳理数据 方便后面保存到数据库
def concatData(Dataframe):res = []for i in range(len(Dataframe)):#print(list(Dataframe.iloc[i][:]))res.append(list(Dataframe.iloc[i][:]))return resdef saveData(url,cityName,tableName):# url = 'https://tianqi.2345.com/today-59493.htm'res = analysisPage(url,cityName)data = pd.DataFrame(res)#保存数据data.to_csv('Resfile{}_{}.csv'.format(cityName,time.strftime('%Y-%m-%d', time.localtime(time.time())),encoding='utf-8'))#tableName = 'future_data'# cursor,db = operateSQL()# cursor.execute("CREATE TABLE IF NOT EXISTS %s ( ID INT AUTO_INCREMENT PRIMARY KEY, DATETIMES VARCHAR(255) , WEATHER VARCHAR(255) ,WEEKEND VARCHAR(255), LOWER_TEMPERATURE VARCHAR(255), HIGH_TEMPERATURE VARCHAR(255), WIND VARCHAR(255), CITY VARCHAR(255) ,CRAWLING_TIME DATE)"%tableName)# #keys = list(res.keys())# #cursor.execute("deleted from 表 where CRAWLING_TIME = '{}'"%time.strftime('%Y-%m-%d', time.localtime(time.time())))# keysBox = ['DATETIMES','WEEKEND','WEATHER','HIGH_TEMPERATURE','LOWER_TEMPERATURE','WIND','CITY','CRAWLING_TIME']# b = concatData(data)# for item in b:#     #执行插入语句#     sql="INSERT INTO {0} ({1},{2},{3},{4},{5},{6},{7},{8}) VALUES({9},{10},{11},{12},{13},{14},{15},{16})".format(tableName,keysBox[0],keysBox[1],keysBox[2],keysBox[3],keysBox[4],keysBox[5],keysBox[6],keysBox[7],repr(item[0]),repr(item[1]),repr(item[2]),repr(item[3]),repr(item[4]),repr(item[5]),repr(item[6]),repr(item[7]))#     #sql="INSERT INTO test_data ({0},{1},{2},{3},{4},{5},{6},{7}) VALUES({8},{9},{10},{11},{12},{13},{14},{15})".format(keysBox[0],keysBox[1],keysBox[2],keysBox[3],keysBox[4],keysBox[5],keysBox[6],keysBox[7],repr(item[0]),repr(item[1]),repr(item[2]),repr(item[3]),repr(item[4]),repr(item[5]),repr(item[6]),repr(item[7]))#     print('正在执行sql语句:%s'%sql)#     print('--- --- ---')#     #执行插入语句#     cursor.execute(sql)#     db.commit()return Nonedef getHistoryWeather(): #cityList为需要爬取的城市列表的拼音cityDict = {'长沙':'changsha','杭州':'hangzhou','南宁':'nanning','深圳':'shenzhen','苏州':'suzhou','西安':'xian','厦门':'xiamen'}tableName = 'future_data'#cursor,db = operateSQL()#cursor.execute('DROP TABLE {}'%tableName)for key,value in cityDict.items():url = 'https://www.tianqishi.com/lishi/%s.html'%valuesaveData(url,cityName=key,tableName=tableName)time.sleep(5)print('%s执行完毕'%key)if __name__ == '__main__':# url = 'https://www.tianqishi.com/lishi/changsha.html'# res = analysisPage(url,'长沙')# print(res)getHistoryWeather()

有问题可以随时私信我交流 最近较忙 回复较慢 见谅!

这篇关于天气预报爬虫-多城市-更新版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489761

相关文章

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo

Python 爬虫入门 - 基础数据采集

Python网络爬虫是一种强大且灵活的工具,用于从互联网上自动化地获取和处理数据。无论你是数据科学家、市场分析师,还是一个想要深入了解互联网数据的开发者,掌握网络爬虫技术都将为你打开一扇通向丰富数据资源的大门。 在本教程中,我们将从基本概念入手,逐步深入了解如何构建和优化网络爬虫,涵盖从发送请求、解析网页结构到保存数据的全过程,并讨论如何应对常见的反爬虫机制。通过本教程,你将能够构建有效的网络爬

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情