用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文件展示:
结束啦!
创作不易,转载请说明出处喔~
需要全部代码的请私信,看见都会及时回复的~
版权归原作者 dorice_ssq 所有, 如有侵权,请联系我们删除。