0


用Selenium爬取天气数据实践(附代码)

用Selenium爬取天气数据实践(附代码)

本文以实践为主,没有很深的知识点,大家放心食用,如果需要系统学习Selenium知识点,可以移步别的博主😘


本文运用Selenium动态爬取和Xpath进行元素定位

文章目录


一、selenium介绍

1、Selenium 是一个广泛使用的开源工具,主要用于自动化Web应用程序的测试。它提供了一套用于驱动浏览器的 API,可以模拟用户在网页上的各种操作,如点击、输入、提交表单、滚动页面等。Selenium 支持多种浏览器,包括 Chrome、Firefox、Safari、Edge 等,能够跨平台运行,支持多种编程语言,如 Python、Java、C#、Ruby 等。
2、Selenium 的核心组件包括:
·Selenium WebDriver:这是 Selenium 的核心,它直接与浏览器交互,可以模拟用户的所有操作。WebDriver 提供了一种编程接口,使得测试脚本能够操作浏览器中的页面元素(如按钮、输入框、链接等)。
·Selenium Grid:用于并行执行测试。它允许在不同的机器和不同的浏览器环境中并行运行测试,从而提高测试的效率。
·Selenium IDE:一个浏览器插件,用于录制和回放用户的操作。它适合没有编程经验的用户进行简单的自动化测试。它可以生成 Selenium WebDriver 测试脚本。
·Selenium RC (Remote Control):早期的 Selenium 组件,用于自动化测试。它使用一个代理服务器将测试脚本发送到浏览器,但在现代的 Selenium 测试中已经不再广泛使用,主要被 WebDriver 取代。
3、Selenium 的主要用途包括:
·自动化功能测试:确保 Web 应用程序的功能符合预期。
·回归测试:在代码更改后,自动化执行测试用例,验证新修改没有破坏现有功能。
·性能测试:通过模拟大量用户的操作,评估 Web 应用程序的性能。
·Web 抓取:虽然 Selenium 主要用于测试,但也有时候被用来抓取网页上的数据。
·Selenium 可以与其他工具结合使用,如 TestNG、JUnit 进行测试框架的搭建,或与 CI/CD 工具(如 Jenkins)集成,实现自动化的持续集成和持续交付流程。
上述这些都是一些官方语言,嘿嘿~
下面才是重点

简介

Selenium是一个开源工具,它是模拟用户在浏览器上进行各种操作,所以它可以用来自动化测试,并且,它的适用性很强大,因为它支持多个浏览器和多种编程语言。

1.现在让我来讲讲Selenium的主要组成部分

·WebDriver:它是 Selenium 的核心,就像我们的四肢,通过手我们可以拿桌上的食物,通过腿我们可以去散步,同理,Selenium通过WebDriver能直接控制浏览器,执行各种操作,比如点击、输入、查找元素等。
·Selenium Grid:可以在不同的机器和浏览器上同时运行多个测试,节省时间,提高效率。(可以把它理解为分身术,它可以帮助我们实现分布式爬取)
·Selenium IDE:这是一个浏览器插件,可以录制用户的操作,适合不懂编程的人,帮助自动生成测试脚本。
·Selenium RC:是 Selenium 的旧版本,现在已被 WebDriver 替代,不再常用。

2.Selenium 主要有以下几种用途:

·自动化功能测试:检查网站的功能是否正常。
·回归测试:在网站修改后,自动检查这些修改是否影响了原有功能。
·性能测试:模拟大量用户访问,检查网站是否能承受高流量。
·数据抓取:有时 Selenium 也用来从网站上提取数据。
·Selenium 可以与其他工具一起使用,比如 TestNG、JUnit 用于构建测试框架,或者与 Jenkins 等工具结合,支持自动化的持续集成和部署。

二、Selenium使用方法

1、安装Selenium(这里以Edge浏览器为示例,其他浏览器类似)

1、首先,先确定自己浏览器的版本号,输入该网址查询:edge://settings/help
在这里插入图片描述
这是我的浏览器目前的版本号。

2、接着,下载对应的Selenium 的edgedriver(浏览器的不同,驱动也不同,eg.谷歌的驱动就叫chromedriver),请输入一下网址下载驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
在这里插入图片描述
通过浏览器版本号和电脑版本选取相应的webdriver版本下载(怎么看自己电脑的版本数?指路:https://baijiahao.baidu.com/s?id=1599865729643161638&wfr=spider&for=pc)

3、查看自己电脑的Python版本
打开cmd,输入python --version就可查看
在这里插入图片描述
这个步骤是为了避免电脑装了多个版本的python,然后不知道当前的环境下使用的python版本是哪一个导致后面将webdriver放错Scripts文件夹。

4、查找Scripts文件夹
打开系统环境变量
在这里插入图片描述
我的Scripts是在D:\Python3.8.10下,所以我们可以通过路径搜索或者一层层文件打开去打开Scripts文件夹。

5、存放webbdriver到Scripts文件夹

在这里插入图片描述
至此,Selenium驱动就安装完成了。
注意:因为浏览器经常自动更新,所以过一段时间就要去检查浏览器的版本号,一旦浏览器版本数太高,webdriver可能无法与其相匹配,所以要进行删除重装操作。

三、天气数据爬取(这里以广州天气为示例)

1、观察网页布局,并决定所要爬取的数据对象有哪些

在这里插入图片描述

打开多个网页可以发现该天气网站的url构成是非常有规则的:由https://lishi.tianqi.com/**你所要爬取城市的拼音**/**你所要爬取天气数据的年份日期**.html所构成(所以大家可以跟据自己的城市进行修改),其次我们爬取的内容则是红框框里的内容。
同时,我们可以发现只有我们点了查看更多,才会出现完整的数据,所以这也是本次实验使用Selenium进行数据爬取的最重要的原因

点了查看更多后
在这里插入图片描述

2、导入所需库

from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
import time

3、定义一个函数用于封装代码

在这里插入图片描述

4、用Selenium打开网页

在这里插入图片描述

5、用Selenium模拟鼠标切换页面

在这里插入图片描述
为避免爬取的时候网页没数据而报错,影响这个代码的运行,在Selenium模拟鼠标点击查看更多的代码上,我们用try和except进行操作,具体代码如下:

#点击展开更多按钮try:
                more = web.find_element(By.CLASS_NAME,"lishidesc2")
                more.click()# 点击展开更多按钮
                time.sleep(2)# 等待页面加载完except:print(f"无法展开 {j}年 {i}月的数据,跳过此月")continue# 如果展开按钮不可点击,则跳过该月数据

6、用Xpath进行元素定位

#获取天气信息try:
                resp = web.find_elements(By.XPATH,"//ul[@class='thrui']/li")for li in resp:
                    day_weather_info ={}#获取日期
                    date_time_element = li.find_element(By.XPATH,'./div[1]')
                    date_time = date_time_element.text.split(' ')[0]
                    day_weather_info['date_time']= date_time
                    #获取最高气温
                    high_element = li.find_element(By.XPATH,'./div[2]')
                    high = high_element.text
                    day_weather_info['high']= high[:high.find('℃')]if'℃'in high else high
                    #获取最低气温
                    low_element = li.find_element(By.XPATH,'./div[3]')
                    low = low_element.text
                    day_weather_info['low']= low[:low.find('℃')]if'℃'in low else low
                    #获取天气状况
                    weather_element = li.find_element(By.XPATH,'./div[4]')
                    weather = weather_element.text
                    day_weather_info['weather']= weather
                   #获取风向
                    wind_direction_element = li.find_element(By.XPATH,'./div[5]')
                    wind_direction = wind_direction_element.text.split(' ')[0]if' 'in wind_direction_element.text else wind_direction_element.text
                    day_weather_info['wind_direction']= wind_direction
                    # 将当前天气数据添加到总数据中
                    weather_info.append(day_weather_info)except Exception as e:print(f"在 {j}年 {i}月,无法获取数据: {e}")continue# 如果数据获取失败,跳过此月

7、关闭浏览器返回数据

在这里插入图片描述

8、查看所爬取的数据

weather_data = get_weather_info()print(weather_data)

9、保存文件

import csv# 打开并写入 CSV 文件withopen('guangzhou_weather.csv', mode='w', newline='', encoding='utf-8')as csvfile:
    writer = csv.writer(csvfile)# 写入表头
    writer.writerow(['日期','最高气温','最低气温','天气','风向'])# 写入数据行for day_weather_dict in weather_data:
        writer.writerow([day_weather_dict['date_time'], day_weather_dict['high'], day_weather_dict['low'], 
                         day_weather_dict['weather'], day_weather_dict['wind_direction']])

10、结果展示

在这里插入图片描述
csv文件展示:
在这里插入图片描述


结束啦!

创作不易,转载请说明出处喔~
需要全部代码的请私信,看见都会及时回复的~


本文转载自: https://blog.csdn.net/dorice_ssq/article/details/144290020
版权归原作者 dorice_ssq 所有, 如有侵权,请联系我们删除。

“用Selenium爬取天气数据实践(附代码)”的评论:

还没有评论