首页 > 其他分享 >urllib+BeautifulSoup爬取并解析2345天气王历史天气数据

urllib+BeautifulSoup爬取并解析2345天气王历史天气数据

时间:2023-07-02 16:36:24浏览次数:62  
标签:2345 code temp list 天气 BeautifulSoup item weather data

urllib+BeautifulSoup爬取并解析2345天气王历史天气数据


网址:东城历史天气查询_历史天气预报查询_2345天气预报

image-20230702161423470

1、代码

import json
import logging
import urllib.parse
from datetime import date, datetime
from random import randint
from time import sleep

import pymysql
from bs4 import BeautifulSoup
# 定义目标URL
import requests

def weather_req():
    month_list = [1,2,3,4,5,6]  # 月份
    code_list = get_code()  # 获取所有的 天气code 和 地区code
    # 需要 2018 1月 到 2023 6月
    url = "https://tianqi.2345.com/Pc/GetHistory"   # 原始URL
    full_url = ""   # 最终拼好的url
    # 定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58',
    }
    # 定义GET参数
    params = {
        'areaInfo[areaId]': 70809,
        'areaInfo[areaType]': 2,
        'date[year]': 2023,
        'date[month]': 6
    }
    # 遍历 天气code 和 地区code 的列表
    for code_item in code_list:
        weather_code = code_item[0] # 拿到天气code
        area_code = code_item[1]    # 拿到地区code
        # 修改 url 参数 天气code的值
        params['areaInfo[areaId]'] = weather_code
        # 开始遍历月份列表
        for month_item in month_list:
            print(f"正在爬取天气ID为【{weather_code}】,地区ID为【{area_code}】的第【{month_item}】月的数据!")
            # 修改 month 的值为新值
            params['date[month]'] = month_item
            # 编码 GET参数
            encoded_params = urllib.parse.urlencode(params)
            # 拼接完整的URL
            full_url = url + '?' + encoded_params
            print(full_url)
            try:
                sleep(randint(1, 3))    # 睡眠(随机1-3秒)
                # 发起请求
                res = requests.get(full_url, headers=headers)
                res_data = json.loads(res.text)
                weather_data = res_data['data']
                # print(weather_data)
                # 解析数据
                soup = BeautifulSoup(weather_data, 'html.parser')
                # 拿到需要的table
                table_data = soup.find('table', attrs={'class': 'history-table'})
                # print(type(table_data),'\n',table_data)
                all_tr = table_data.find_all('tr')  # 拿到所有的tr
                # print(all_tr[0])
                weather_list = []   # 这是要存储数据的list
                # 开始遍历tr列表 一个列表存储了某地区的某年份的某月完整的数据
                for i in range(1, len(all_tr)):
                    temp_list = []  # 暂时存储一天的数据 每次循环都刷新
                    tr_item = all_tr[i] # 拿到一个tr数据
                    all_td = tr_item.find_all("td") # 拿到一个tr里的所有td,td里面的text就是需要的值
                    rdate = str(all_td[0].text)  # 日期 2023-01-01 周日
                    # 日期需要转化格式,去掉星期
                    rdate_new = rdate.split(" ")[0] # 拿到日期字符串
                    # 解析字符串为日期对象
                    date_object = datetime.strptime(rdate_new, "%Y-%m-%d")
                    # 将日期对象格式化为 MySQL 可存储的日期字符串
                    mysql_date = date_object.strftime("%Y-%m-%d")   # 最终被存储的日期
                    wind_and_power = all_td[4].text # 风向和风力是在一起的 需要解析
                    wind = str(wind_and_power).split("风")[0]    # 风向
                    winp = str(wind_and_power).split("风")[1]   # 风力
                    temp_max = str(all_td[1].text)  # 最高温
                    temp_min = str(all_td[2].text)  # 最低温
                    weather = str(all_td[3].text)   # 天气情况
                    # 把上面的变量存储到 temp_list 然后再一起存到 weather_list
                    temp_list.append(mysql_date)    # 日期
                    temp_list.append(weather_code)  # 天气编码
                    temp_list.append(area_code) # 地区编码
                    temp_list.append(wind)  # 风向
                    temp_list.append(winp) # 风力
                    temp_list.append(temp_max)  # 最高温度
                    temp_list.append(temp_min)  # 最低温度
                    temp_list.append(weather)   # 天气情况
                    weather_list.append(temp_list)
                print(weather_list)
                # 开始插入数据 【某个地区的,某一年的,某一个月份的数据】
                conn_his,cursor_his = get_conn()    # 建立数据库连接
                # 遍历数据
                for save_item in weather_list:
                    INSERT_SQL = "insert into w_weather_day_history (rdate,weather_code,area_code,wind,winp,temp_max,temp_min,weather) " \
                                 "values(%s,%s,%s,%s,%s,%s,%s,%s)" \
                                 "              "%("\""+save_item[0]+"\"",
                                                  "\""+save_item[1]+"\"",
                                                  "\""+save_item[2]+"\"",
                                                  "\""+save_item[3]+"\""
                                                 ,"\""+save_item[4]+"\""
                                                 ,"\""+save_item[5]+"\""
                                                 ,"\""+save_item[6]+"\""
                                                 ,"\""+save_item[7]+"\"")

                    print(INSERT_SQL)
                    cursor_his.execute(INSERT_SQL)  # 执行sql语句
                    conn_his.commit()  # 提交事务
                    print("--------------------------------------------------")
            except urllib.error.URLError as e:
                print("发生错误:", e)

def get_code():
    conn,cursor = get_conn()
    SQL = "select fwc.weather_code,fwc.area_code from f_weather_area_code fwc;"
    cursor.execute(SQL)
    res = cursor.fetchall()
    print(res)
    return res

def get_conn():
    """
    :return: 连接,游标
    """
    # 创建连接
    conn = pymysql.connect(host="127.0.0.1",
                    user="root",
                    password="reliable",
                    db="weather",
                    charset="utf8")
    # 创建游标
    cursor = conn.cursor()  # 执行完毕返回的结果集默认以元组显示
    return conn, cursor

def close_conn(conn, cursor):
    if cursor:
        cursor.close()
    if conn:
        conn.close()

if __name__ == '__main__':
    # get_code()
    weather_req()

image-20230702161542526

2、分析

url构成如下:

基础url:https://tianqi.2345.com/Pc/GetHistory

参数:

params = {
        'areaInfo[areaId]': 70809,
        'areaInfo[areaType]': 2,
        'date[year]': 2023,
        'date[month]': 6
    }

areaInfo[areaId] 表示的是 某地区的天气编码,这个需要去自己获取。

areaInfo[areaType] 不用管

后面两个参数就是年份和月份了

3、发起请求demo

url = "https://tianqi.2345.com/Pc/GetHistory"   # 原始URL
    full_url = ""   # 最终拼好的url
    # 定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58',
    }
    # 定义GET参数
    params = {
        'areaInfo[areaId]': 70809,
        'areaInfo[areaType]': 2,
        'date[year]': 2023,
        'date[month]': 6
    }
    
    # 解析参数
    encoded_params = urllib.parse.urlencode(params)
    # 拼接完整的URL
    full_url = url + '?' + encoded_params
    sleep(randint(1, 3))    # 睡眠(随机1-3秒)
    # 发起请求
    res = requests.get(full_url, headers=headers)
    res_data = json.loads(res.text)
    weather_data = res_data['data']

4、解析数据demo

# 解析数据
soup = BeautifulSoup(weather_data, 'html.parser')
# 拿到需要的table
table_data = soup.find('table', attrs={'class': 'history-table'})
# print(type(table_data),'\n',table_data)
all_tr = table_data.find_all('tr')  # 拿到所有的tr

标签:2345,code,temp,list,天气,BeautifulSoup,item,weather,data
From: https://www.cnblogs.com/rainbow-1/p/17520928.html

相关文章

  • 盘古天气大模型
    摘要:ERA5数据训练。创新:1.三维transformer2.层级结构的时间聚合算法,能够缓解误差累积硬件:华为云192个英伟达Tesla-V100,100epoch训15天方法:预训练任务就是预测和Climax一样,没有采用迭代预测,而是指定Δt,直接进行预测。但是前者使用的是时间编码,让模型来识别需要预测多久的,这......
  • 杰森气象——实况天气小程序(内附完整源码)
    项目介绍当今社会,天气的变化对我们的生活产生着越来越大的影响。为了更好地了解天气状况,越来越多的人开始使用天气查询小程序。今天,介绍的是一款实用的天气查询小程序——杰森气象。杰森气象是一款功能强大的天气查询小程序,它可以帮助我们随时了解天气状况,包括实时天气、预警信息、......
  • 天气预报接口 与 对应地区代码
    http://t.weather.itboy.net/api/weather/city/地区代码   北京市101010100海淀101010200朝阳101010300顺义101010400怀柔101010500通州101010600......
  • 百度 之天气预报API接口
    文档:https://lbsyun.baidu.com/index.php?title=webapi/weather一、申请APIKey百度ak申请地址:http://lbsyun.baidu.com/apiconsole/key二、接口示例https://api.map.baidu.com/weather/v1/?district_id=行政区划编码&data_type=now&ak=应用AK返回结果:{"status":0,"result......
  • beautifulSoup找不到元素
    问题:页面F12可以定位元素,但把网页下载到本地,无法定位2种原因:1、内容在一个标签中,放在json字符串里 #内容在input里inputInfo=soup.find_all('input')[3]['value']#页面所有内容xmInfo=json.loads(inputInfo)Agency=xmInfo['author']xmContent=xmInfo['conte......
  • beautifulSoup查找元素常用汇总
    0、初始化:frombs4importBeautifulSouppageSource=driver.page_sourcesoup=BeautifulSoup(pageSource,'html.parser')1、标签名定位方法1:soup.body方法2:li.select('a')2、查找2.1、单个查找2.1.1、按text内容查找xmSoup.find(text=re.compile(......
  • esp8266制作太空人天气时钟
    背景简单来说,就是最近太闲了,然后下班也无所事事,在B站上刷着一众up们的diy视频,一次又一次地激起了我应该做点啥的想法,于是在这一阵又一阵的激励下,我再次燃起了对diy硬件的兴趣,于是我便又一次把自己年前买到的一些硬件翻出来,开始自己的新一轮arduino之旅。材料准备本次项目的总......
  • 【视频】Python的天气数据爬虫实时抓取采集和可视化展示
    全文链接:http://tecdat.cn/?p=32715原文出处:拓端数据部落公众号分析师:XiaoyangZhou本文以天气数据实时抓取和可视化展示为主题,旨在探讨如何使用Python编写程序来实现对天气数据的抓取、可视化和预测。从中国气象局天气预报网来获取数据首先,我们需要从中国气象局天气预报网上......
  • Python网络爬虫--选定地区对未来7天天气情况的分析
    (一)、选题背景在当今信息化时代,天气情况是人们生活中非常重要的一部分。因此,将Python网络爬虫和数据可视化技术应用到天气预报分析中,可以为人们提供更加精确、直观的未来天气预报信息。通过使用Python网络爬虫技术获取最新的天气数据,并结合数据可视化技术,将数据以图表、地图等形......
  • python爬虫——爬取泉州2022年天气数据并做可视化分析
     一、选题的背景为什么要选择此选题?要达到的数据分析的预期目标是什么?从社会、经济、技术、数据来源等方面进行描述(200字以内)(10分)天气作为日常生活中不可忽视的因素,对人们的出行、衣食住行等方面均有影响。此次选题旨在通过对泉州市2022年天气数据的收集和分析,了解该地区......