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

这篇具有很好参考价值的文章主要介绍了天气预报爬虫-多城市-更新版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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.text
    else:
        return None

def 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+'-'+dateDay
    weekendString = getWeekend(int(dateYear),int(dateMonth),int(dateDay)) 
    return dateString,weekendString

def 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')
        #temperature
        if 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 res

def operateSQL():
    #创建数据库链接
    db = pymysql.connect(
        host="localhost",
        port=3306,
        user="root",
        passwd='1234567',
        db='studenttest',
        charset='utf8'
    )
    # #创建数据库游标对象
    cursor = db.cursor()
    #创建数据表格
    return cursor,db


def 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 None

def 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'%value
        saveData(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.text
    else:
        return None

def 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+'-'+dateDay
    weekendString = getWeekend(int(dateYear),int(dateMonth),int(dateDay)) 
    return dateString,weekendString

def 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')
        #temperature
        if 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 res

def 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 None

def 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'%value
        saveData(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()

有问题可以随时私信我交流 最近较忙 回复较慢 见谅!文章来源地址https://www.toymoban.com/news/detail-798088.html

到了这里,关于天气预报爬虫-多城市-更新版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android制作天气预报软件 —— 天气查询

    天气查询功能包括信息显示和地区选择两个版块,二者均通过调用极速数据的相关接口进行实现。其中,信息显示界面作为软件首页,默认先显示系统设置的地区天气情况,用户可通过地区选择的界面进行修改信息。对于天气信息,受接口调用次数限制,系统设置每24小时更

    2024年02月12日
    浏览(45)
  • 【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

    一、资料链接 1、github地址 https://github.com/qq1534774766/wx-push 2、教程地址 https://blog.csdn.net/qq15347747/article/details/126521774 3、易客云API(自动发送天气) https://yikeapi.com/account/index 4、apispace-各种接口(名人名言) https://www.apispace.com/console/api?orgId=6356 5、微信公众平台 https://mp.weixin.qq.com/d

    2024年02月02日
    浏览(47)
  • QT实现天气预报

    public:     MainWindow(QWidget* parent = nullptr);     ~MainWindow();    protected: 形成文本菜单来用来右键关闭窗口     void contextMenuEvent(QContextMenuEvent* event); 鼠标被点击之后此事件被调用     void mousePressEvent(QMouseEvent *ev); 移动窗口     void mouseMoveEvent(QMouseEvent* ev);     //重写过滤器方法

    2024年02月12日
    浏览(45)
  • Java实现天气预报功能

    如果要实现类似百度天气、手机App这样的天气预报功能该如何实现?首先想到的是百度...                                         最近公司做了一个项目,天气预报的功能也做上去了,不仅有实时天气、未来7天预报的功能、还有气象预警的功能。 天气包括基本天气、白

    2024年02月05日
    浏览(91)
  • Vue中使用天气预报

    第一步 : 打开这个网站自己设置好想要的样式 和风天气插件 | 和风天气插件产品,免费、跨终端。适配你的网站、APP、公众号 一般选第一个就好 第二步 : 调整好样式 生成你的代码 最后记得点生成 第三步: 创建一个 新的组件(.vue文件) 在里面写入以下的代码 注意事项写

    2024年02月11日
    浏览(51)
  • 微信小程序天气预报实战

    api接口用的和风天气 代码如下 // pages/weather/weather.js Page({   /**    * 页面的初始数据    */   data: {     apiKey: \\\"1f5e75b8a3f0472aaf2f618268b30b4e\\\",     City: \\\'\\\',     Country:\\\'\\\',     locationid:\\\"\\\",     latlongFlag: false   },   /**    * 生命周期函数--监听页面加载    */   onL

    2024年02月19日
    浏览(46)
  • 微信小程序—天气预报查询

    前不久用安卓做了个天气预报,麻烦的要死,故想体验一下微信小程序开发(其实没有可比性) 发现了一个免费的天气接口 天气接口api 地址:http://wthrcdn.etouch.cn/weather_mini?city=城市名称 (1)index.wxml文件 (2)index.wxss文件 (3)index.js文件 主要是实现三个动作 一个是初始化加

    2024年02月12日
    浏览(49)
  • 【iOS】App仿写--天气预报

    最近完成了暑假的最后一个任务——天气预报,特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面—— 首页,搜索界面,添加界面,浏览界面 ,同时在天气预报中调用了较多的API,具体使用方法可以看这篇博客——【iOS】json数据解析以及简单的

    2024年02月13日
    浏览(53)
  • 微信小程序 - 简易天气预报

    预览图:   1:WXML: 2:WXSS: 3:JS: 4:下载地图包: 不了解的可以通过这个链接查看,其中有关于小程序定位的内容,本章也使用到过:微信小程序获取位置信息_微信小程序获取当前位置_鸢与浅忆的博客-CSDN博客  5:app.json: 和page、window同级 该项目使用的接口为nowapi平台提

    2024年02月06日
    浏览(91)
  • Android实现-心知天气API接口开发(天气预报app)

    自己开发app之心知天气APP程序代码粘贴即可用。完整代码附最后。 第一步:去知心天气注册开发者账号查看自己的token。注册好登录进去--控制台---免费版--秘钥。这里的秘钥就是自己的token。(有兴趣的可以看开发文档,这里就不多介绍了)  第二步,下载素材包。点击文档

    2024年02月03日
    浏览(112)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包