首页 > 编程语言 >简单上手python爬虫实战:阜阳市历史天气数据爬取

简单上手python爬虫实战:阜阳市历史天气数据爬取

时间:2024-11-13 21:51:11浏览次数:3  
标签:temperature min python 爬虫 replace 爬取 weather li condition

        这里我们学校开始了见习,搞的是阜阳市历史天气数据看板,加了点大数据方面的技术栈,我这里就不讲了,出一期非常简单的爬虫代码吧。

1 数据来源

        这里我们用的网站是天气后报里的,网站如下:历史天气查询|天气记录|天气预报|气温查询|过去天气_天气后报icon-default.png?t=O83Ahttp://tianqihoubao.com/        然后选择安徽->阜阳,你就会发现如下页面。

 2 数据的爬取

        然后下滑找到历史数据,我们随便找一个月份的数据,点进去,开始检查!

        这里我们找到页面的url,选择网络,我们发现他后面的数字是202301,难道这是一个有规律的页面?在此,我们在随便打开一个月份,看看怎么样!

        看来跟我们想的一样,这确实是一个有规律的页面,网站末尾跟着查询的年份与月份,那我们再把UA复制粘贴一下这个代码不就完成了吗(年轻人你还是太嫩了!)现在我们把初步的代码写出来

for year in range(2020, 2025):
    for j in range(1, 13):
        month = str(j).zfill(2)
        k = f"{year}{month}"
        url = 'http://tianqihoubao.com/lishi/fuyang/month/{}.html'.format(k)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
        }
        re = requests.get(url, headers=headers).text
        print(re)

 

        最后也是成功获取到了页面 ,最后别忘了加break,不然你懂的。我们现在就可以看看我们需要的数据在哪吧!

        然后就是获取xpath路径了,让我们一键复制吧!(正则表达式写不了一点)

        然后开始写xpath代码,如下所示。

        tree = etree.HTML(re)
        list_li = tree.xpath('//*[@id="content"]/table/tbody/tr')
        print(list_li)

         你会突然发现咋啥都没有呢,是不是xpath路径有问题?还是代码有问题?其实这也就是最狗的一点,我现在就告诉你们,因为这也是反爬的一种机制,因为他的源代码里是没有tbody这个标签的。

        我们删掉tbody再试试看,就会发现能获取里面的数据

 

        然后我们开始遍历tr里面的每一行内容,看到我们是不需要第一行标签的,剩下的数据都在td下面,并且都是四个值。

 

        开始获取文档内容,并打印出来。代码如下:

        for li in list_li:
            date = li.xpath('./td[1]/text()')
            print(date)
            weather_condition = li.xpath('./td[2]/text()')
            print(weather_condition)
            max_min_temperature = li.xpath('./td[3]/text()')
            print(max_min_temperature)
            wind_direction = li.xpath('./td[4]/text()')
            print(wind_direction)

 

        我们可以发现数据是爬出来了,但是里面的内容咋这么多乱七八糟的东西,那我们把两边的符号都去掉在看看,

        for li in list_li:
            date = li.xpath('./td[1]/text()')
            date = [i.strip().replace('\r\n', '') for i in date]
            print(date)
            weather_condition = li.xpath('./td[2]/text()')
            weather_condition = [i.strip().replace('\r\n', '') for i in weather_condition]
            print(weather_condition)
            max_min_temperature = li.xpath('./td[3]/text()')
            max_min_temperature = [i.strip().replace('\r\n', '') for i in max_min_temperature]
            print(max_min_temperature)
            wind_direction = li.xpath('./td[4]/text()')
            wind_direction = [i.strip().replace('\r\n', '') for i in wind_direction]
            print(wind_direction)

        但他中间还是有很多空格存在,这里我们就采用替代,将里面的空格替代成无就行了,最后处理完成的代码如下,

        for li in list_li:
            date = li.xpath('./td[1]/text()')
            date = [i.strip().replace('\r\n', '').replace(' ', '') for i in date]
            print(date)
            weather_condition = li.xpath('./td[2]/text()')
            weather_condition = [i.strip().replace('\r\n', '').replace(' ', '') for i in weather_condition]
            print(weather_condition)
            max_min_temperature = li.xpath('./td[3]/text()')
            max_min_temperature = [i.strip().replace('\r\n', '').replace(' ', '') for i in max_min_temperature]
            print(max_min_temperature)
            wind_direction = li.xpath('./td[4]/text()')
            wind_direction = [i.strip().replace('\r\n', '').replace(' ', '') for i in wind_direction]
            print(wind_direction)

        现在我们就先把数据保存在pandas里面,代码如下,

result = pd.DataFrame(columns=['date', 'weather_condition', 'max_min_temperature', 'wind_direction'])

for year in range(2020, 2025):
    for j in range(1, 13):
        r = pd.DataFrame(columns=['date', 'weather_condition', 'max_min_temperature', 'wind_direction'])
        ...
        for li in list_li:
            ...
            data_to_add = {
                'date': date,
                'weather_condition': weather_condition,
                'max_min_temperature': max_min_temperature,
                'wind_direction': wind_direction
            }
            new_row = pd.DataFrame(data_to_add)
            r = pd.concat([r, new_row], ignore_index=True)
            print(r)
        break
    break

        最后也是成功保存下来了,但是他的第一行是空白,这种我们在他遍历完成之后就可以去掉第一行就OK了,然后在拼接一下就可以得到完整的数据了。

        r = r.iloc[1:]
        result = pd.concat([result, r], ignore_index=True)

 

3 数据的保存

         这里我因为要对接mysql的,所以我就保存在了虚拟机上的mysql了,大家按照自己的需求保存数据吧。

config = {
    'user': 'root',
    'password': '...',
    'host': 'hadoop101',
    'database': 'weather_db',
    'raise_on_warnings': True
}
engine = create_engine(
    f"mysql+pymysql://{config['user']}:{config['password']}@{config['host']}/{config['database']}")
result.to_sql('history_weather', con=engine, if_exists='replace', index=False)

4 完整代码

import requests
from lxml import etree
import pandas as pd
from sqlalchemy import create_engine

result = pd.DataFrame(columns=['date', 'weather_condition', 'max_min_temperature', 'wind_direction'])

for year in range(2020, 2025):
    for j in range(1, 13):
        r = pd.DataFrame(columns=['date', 'weather_condition', 'max_min_temperature', 'wind_direction'])
        if year == 2024 and j == 12:
            continue
        month = str(j).zfill(2)
        k = f"{year}{month}"
        url = 'http://tianqihoubao.com/lishi/fuyang/month/{}.html'.format(k)
        headers = {
            'User-Agent': '...'
        }
        re = requests.get(url, headers=headers).text
        tree = etree.HTML(re)
        list_li = tree.xpath('//*[@id="content"]/table/tr')
        for li in list_li:
            date = li.xpath('./td[1]/text()')
            date = [i.strip().replace('\r\n', '').replace(' ', '') for i in date]
            weather_condition = li.xpath('./td[2]/text()')
            weather_condition = [i.strip().replace('\r\n', '').replace(' ', '') for i in weather_condition]
            max_min_temperature = li.xpath('./td[3]/text()')
            max_min_temperature = [i.strip().replace('\r\n', '').replace(' ', '') for i in max_min_temperature]
            wind_direction = li.xpath('./td[4]/text()')
            wind_direction = [i.strip().replace('\r\n', '').replace(' ', '') for i in wind_direction]
            data_to_add = {
                'date': date,
                'weather_condition': weather_condition,
                'max_min_temperature': max_min_temperature,
                'wind_direction': wind_direction
            }
            new_row = pd.DataFrame(data_to_add)
            r = pd.concat([r, new_row], ignore_index=True)
        r = r.iloc[1:]
        result = pd.concat([result, r], ignore_index=True)
        print(result)
    break


config = {
    'user': 'root',
    'password': '...',
    'host': 'hadoop101',
    'database': 'weather_db',
    'raise_on_warnings': True
}
engine = create_engine(
    f"mysql+pymysql://{config['user']}:{config['password']}@{config['host']}/{config['database']}")
result.to_sql('history_weather', con=engine, if_exists='replace', index=False)

标签:temperature,min,python,爬虫,replace,爬取,weather,li,condition
From: https://blog.csdn.net/2301_77408198/article/details/143752053

相关文章

  • 带你理解Python面向对象
    一、面向对象编程1.1面向过程与面向对象面向过程:更加注重通过函数来组织代码,适合任务明确、结构简单的程序。面向对象:则注重通过对象和类来组织代码,适合复杂且需要长期维护和扩展的大型项目。面向过程和面向对象都是一种编程方式,只不过再设计上有区别。三大基本特性:封装......
  • 【Python教程】python如何把数据导出生成excel
    博主介绍:✌全网粉丝21W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。感兴趣的可以先......
  • Python——专栏:跳动的心跳(橘粉爱心)——完整代码
    运行展示完整代码importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=980#画布的宽CANVAS_HEIGHT=720#画布的高CANVAS_CENTER_X=CANVAS_WIDTH/2#画布中心的X轴坐标CANVAS_CENTER_Y=CANVAS_HEIGHT/2#画布中......
  • Python 面向对象编程
    一、面向对象编程1.1面向过程与面向对象在理解面向对象编程(OOP)之前,我们先要了解 面向过程(POP) 和 面向对象(OOP) 的区别。1.1.1面向过程(POP)-面向过程的编程思想将一个功能分解为一个一个小的步骤,我们通过完成一个一个的小的步骤来完成一个程序-这种编程方式,符合我们......
  • 【进阶系列】带你看懂python的面向对象编程#类 #对象 #继承 #封装 #多态
    进阶系列一、面向对象编程1.1面向过程与面向对象1.1.1面向过程pop:1.1.2面向对象oop:1.2类、对象1.2.1类的定义与实例化对象1.2.2访问属性/方法1.2.3对象与类的关系1.2.5⭐魔方——构造函数与析构函数1.2.6⭐类属性/方法与实例对象属性/方法与静态方法小练习1......
  • python用selenium打开浏览器后浏览器关闭---解决办法
    脚本成功打开浏览器后,代码执行完毕浏览器又关闭了,解决办法:1、检查代码,代码中没有写driver.quit()或driver.close()方法,也没有其它错误提示;2、检查版本号,浏览器版本号,驱动版本号,确认版本号没有问题;3、加代码:fromseleniumimportwebdriveroptions=webdriver.ChromeOptions()......
  • Python语法:循环语句,掌握程序运行的节奏
    引言在当今数字化飞速发展的时代,编程已经成为一项不可或缺的技能,而Python作为一门简洁、高效且应用广泛的编程语言,备受开发者青睐。循环语句是Python编程中的基础结构之一,它在数据处理、算法实现、自动化任务等众多场景中都发挥着至关重要的作用。无论是专业的软件开发人员......
  • more Layer Architecture in Python and postgreSQL17.0
    postgreSQLscript:createtableSchool--創建表(SchoolIdchar(5)NOTNULLPRIMARYKEY,SchoolNamevarchar(500)NOTNULLDEFAULT'',SchoolTelNovarchar(8)NULLDEFAULT'');model:#encoding:utf-8#版权所有20......
  • canny 算法 python实现, 双边滤波--自适应阈值改进--形态学操作
    #-*-coding:utf-8-*-importnumpyasnpimportcv2importosimportcsv#高斯滤波defsmooth(image,sigma=1.4,length=5):#Computegaussianfilterk=length//2gaussian=np.zeros([length,length])foriinrange(length):for......
  • Python中的面向对象编程,类,对象,封装,继承,多态
    一、面向对象编程1.面向过程和面向对象面向过程和面向对象都是一种编程方式,只不过再设计上有区别。面向过程C语言细分成每一个过程优点:简单直观、性能高效、代码简洁。缺点:不易维护、不易扩展、代码重用性低。面向对象python、java、C++要使用某个功能,直接找到对应的......