用Selenium爬取天气数据实践(附代码)_使用selenium爬取张家界2023年天气数据并保存
用Selenium爬取天气数据实践(附代码)
本文以实践为主,没有很深的知识点,大家放心食用,如果需要系统学习Selenium知识点,可以移步别的博主😘
本文运用Selenium动态爬取和Xpath进行元素定位
文章目录
- 用Selenium爬取天气数据实践(附代码)
- 一、selenium介绍
-
- 简介
- 1.现在让我来讲讲Selenium的主要组成部分
- 2.Selenium 主要有以下几种用途:
- 二、Selenium使用方法
-
- 1、安装Selenium(这里以Edge浏览器为示例,其他浏览器类似)
- 三、天气数据爬取(这里以广州天气为示例)
-
- 1、观察网页布局,并决定所要爬取的数据对象有哪些
- 2、导入所需库
- 3、定义一个函数用于封装代码
- 4、用Selenium打开网页
- 5、用Selenium模拟鼠标切换页面
- 6、用Xpath进行元素定位
- 7、关闭浏览器返回数据
- 8、查看所爬取的数据
- 9、保存文件
- 10、结果展示
- 结束啦!
一、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 Edgefrom selenium.webdriver.common.by import Byimport 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 文件with open(\'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文件展示:
结束啦!
创作不易,转载请说明出处喔~
需要全部代码的请私信,看见都会及时回复的~