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

这篇具有很好参考价值的文章主要介绍了urllib+BeautifulSoup爬取并解析2345天气王历史天气数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

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()

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] 不用管

后面两个参数就是年份和月份了文章来源地址https://www.toymoban.com/news/detail-514598.html

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

到了这里,关于urllib+BeautifulSoup爬取并解析2345天气王历史天气数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • urllib爬取图片

    这段代码中,首先指定了要爬取的图片的 URL 链接,然后使用  urllib.request.urlretrieve()  函数将图片下载到指定的路径。你可以将  image_url  替换为实际的图片 URL,将  \\\"image.jpg\\\"  替换为保存图片的路径和文件名,如果路径不存在,系统会自动创建相应的文件夹。 需要注意的是

    2024年02月03日
    浏览(31)
  • 使用爬虫爬取百度搜索结果及各网站正文(request库、selenium库和beautifulsoup库)

    任务: 给定搜索词,获取百度搜索结果 根据各项结果获取对应网站正文部分 header实际为一个字典,为访问百度时提供必要的信息。 一般来讲只需要提供 Cookie 就可以访问大多数网站,其余可能需要的还有 Host 、 User-Agent 等 通过分析百度搜索url可以发现 https://www.baidu.com/s?wd=茅

    2024年03月27日
    浏览(54)
  • 爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

    在本篇博客中,我们将使用 Python 的 Selenium 和 BeautifulSoup 库来实现一个简单的网页爬虫,目的是爬取豆瓣电影TOP250的数据,并将结果保存到Excel文件中。 Selenium 是一个自动化测试工具,可以模拟用户在浏览器中的交互操作。我们将使用 Selenium 来打开网页、获取网页源码。 B

    2024年02月12日
    浏览(54)
  • Python--爬取天气网站天气数据并进行数据分析

     目的:从天气网站中爬取数据,生成excel表格,里面存储南昌市近十一年的天气情况,并对爬取产生的数据进行数据分析。   第一步:编写代码进行数据爬取 首先,导入 requests 模块,并调用函数 requests.get(),从天气的网站上面获 取该函数所需要的各种参数,然后对里面的参

    2024年02月04日
    浏览(42)
  • Python实战:使用selenium及BeautifulSoup4进行BOOS直聘信息爬取与数据累积【附源码】

    操作系统 :适用于Windows、macOS、Linux。 Python版本 :Python 3.6及以上。 依赖库 : selenium:用于模拟浏览器操作。 webdriver_manager:自动管理驱动程序。 BeautifulSoup4:解析HTML页面。 pandas:数据处理和CSV文件操作。 logging:日志记录。 本项目旨在通过Selenium模拟用户浏览器行为,获

    2024年04月27日
    浏览(48)
  • 【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片

    个人主页 :为梦而生~ 关注我一起学习吧! 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 往期推荐 : 【Python爬虫开发基础⑦】urllib库的基本使用 【Python爬虫开发基础⑧】XPath库及其基本用法 我们在之前已经有8篇文章讲述基础知识了,下面我们

    2024年02月11日
    浏览(74)
  • python 爬虫爬取天气

    爬虫5步曲: 1.安装requests and beacutifulsoup4库 2.获取爬虫所需的header 和cookie 3.获取网页,解析网页 4.分析得到的数据简化地址 5.爬取内容,清洗数据 1.安装requestsbeautifulsoup4         pip3 install requests         pip3 install beautifulsoup4 2.获取爬虫所需的header 和cookie 打开想爬取的

    2024年02月08日
    浏览(41)
  • Python:爬取天气并设计制作天气预报对话框

    考试周突然布置python大作业,本来打算网上找现成的拼接一下,但是要不然相同需求的要掏50块钱,要不然太过专业,一看就不是学生几天之内能完成的。于是打算自己做一个。 基于python语言实现 天气预报系统设计   (1)系统必须是界面操作方法,界面友好; (2)系统能够选择

    2024年02月04日
    浏览(57)
  • 【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡 往期推荐 : ⭐️首先,我们前面讲了多篇基础内容: 【Python爬虫开发基础④】爬虫原理 【Python爬虫开发基础⑤】HTML概述与基本标签详解 【P

    2024年02月12日
    浏览(48)
  • Python爬虫——urllib_ajax的get请求爬取豆瓣电影前十页

    ajax: 就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: 一定会有 url,请求方法(get, post),可能有数据 一般使用 json 格式 打开豆瓣电影,F12打开控制台(我这里是科幻类排行榜) 这是第一页 第二页 第

    2024年02月16日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包