鱼C论坛

 找回密码
 立即注册
查看: 271|回复: 5

[已解决]求助,想爬取msn的历史天气数据

[复制链接]
发表于 2024-7-18 22:42:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
因为工作需要,想爬取天气数据,但是某些网站的我能爬取到(3个w~tianqi~com),但是MSN的天气好像涉及到动态图片,不知道如何提取,求教各位大佬~
最佳答案
2024-7-19 16:10:10
hitmanyzp 发表于 2024-07-19 16:08
如果我不是用的谷歌浏览器,可以帮我把代码换成edge的 ...


当然可以!下面是使用Selenium和Edge浏览器来抓取数据的示例代码:

首先,安装必要的库:
pip install selenium
pip install webdriver-manager

然后,编写Python代码:
from selenium import webdriver
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.common.by import By
import time

# 设置浏览器选项
options = webdriver.EdgeOptions()
options.add_argument("--headless")  # 无头模式,不打开浏览器窗口

# 启动浏览器
driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=options)

# 打开MSN天气页面
url = "https://www.msn.com/en-us/weather"
driver.get(url)

# 等待页面加载完成
time.sleep(5)  # 根据实际情况调整等待时间

# 查找并提取所需数据
weather_elements = driver.find_elements(By.CSS_SELECTOR, ".weather-element-selector")  # 根据实际情况调整选择器
for element in weather_elements:
    print(element.text)

# 关闭浏览器
driver.quit()

这个示例代码中,`url`需要替换成MSN天气页面的实际URL,`.weather-element-selector`也需要替换成实际的CSS选择器。你可以通过浏览器的开发者工具(F12)来找到你需要的数据所在的元素和相应的选择器。

### 说明

1. 我们使用了`webdriver_manager.microsoft.EdgeChromiumDriverManager`来自动管理Edge驱动程序。
2. 将`webdriver.Chrome`替换为`webdriver.Edge`。
3. 将Chrome的服务对象替换为Edge的服务对象:`Service`变为`EdgeService`。

希望这些代码对你有帮助!如果有更多问题,欢迎继续讨论。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-18 22:42:35 | 显示全部楼层
你好!爬取天气数据其实是一个挺有趣的挑战。你提到MSN的天气页面涉及到动态图片,这通常意味着页面内容是通过JavaScript动态加载的。这种情况我们可以用一些特殊的方法来处理。

### 方法一:使用Selenium模拟浏览器操作

Selenium 是一个强大的工具,可以用来模拟浏览器的操作,从而获取动态加载的数据。下面是一个简单的示例代码,展示了如何使用Selenium来获取MSN天气页面的数据。

首先,安装必要的库:
pip install selenium
pip install webdriver-manager

然后,编写Python代码:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

# 设置浏览器选项
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # 无头模式,不打开浏览器窗口

# 启动浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

# 打开MSN天气页面
url = "https://www.msn.com/en-us/weather"
driver.get(url)

# 等待页面加载完成
time.sleep(5)  # 根据实际情况调整等待时间

# 查找并提取所需数据
weather_elements = driver.find_elements(By.CSS_SELECTOR, ".weather-element-selector")  # 根据实际情况调整选择器
for element in weather_elements:
    print(element.text)

# 关闭浏览器
driver.quit()

这个示例代码中,`url`需要替换成MSN天气页面的实际URL,`.weather-element-selector`也需要替换成实际的CSS选择器。你可以通过浏览器的开发者工具(F12)来找到你需要的数据所在的元素和相应的选择器。

### 方法二:使用API

有时候,网站的页面数据其实是通过后台API请求获取的。你可以通过浏览器的网络监控功能(Network tab)来找到这些API请求,并直接调用API来获取数据。

例如,你可以按以下步骤操作:

1. 打开MSN天气页面。
2. 按F12打开开发者工具,切换到“网络”标签页(Network)。
3. 刷新页面,观察所有的网络请求。
4. 找到可能的API请求,查看请求的URL、参数和响应格式。
5. 使用Python的`requests`库来直接请求这些API,获取你需要的数据。

### 总结

无论是使用Selenium模拟浏览器操作,还是直接调用API,都能有效地获取动态加载的数据。希望这些方法对你有帮助!如果有更多问题,欢迎继续讨论。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 16:08:54 | 显示全部楼层
如果我不是用的谷歌浏览器,可以帮我把代码换成edge的吗?谢谢  @AI小助手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 16:10:10 | 显示全部楼层    本楼为最佳答案   
hitmanyzp 发表于 2024-07-19 16:08
如果我不是用的谷歌浏览器,可以帮我把代码换成edge的 ...


当然可以!下面是使用Selenium和Edge浏览器来抓取数据的示例代码:

首先,安装必要的库:
pip install selenium
pip install webdriver-manager

然后,编写Python代码:
from selenium import webdriver
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.common.by import By
import time

# 设置浏览器选项
options = webdriver.EdgeOptions()
options.add_argument("--headless")  # 无头模式,不打开浏览器窗口

# 启动浏览器
driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=options)

# 打开MSN天气页面
url = "https://www.msn.com/en-us/weather"
driver.get(url)

# 等待页面加载完成
time.sleep(5)  # 根据实际情况调整等待时间

# 查找并提取所需数据
weather_elements = driver.find_elements(By.CSS_SELECTOR, ".weather-element-selector")  # 根据实际情况调整选择器
for element in weather_elements:
    print(element.text)

# 关闭浏览器
driver.quit()

这个示例代码中,`url`需要替换成MSN天气页面的实际URL,`.weather-element-selector`也需要替换成实际的CSS选择器。你可以通过浏览器的开发者工具(F12)来找到你需要的数据所在的元素和相应的选择器。

### 说明

1. 我们使用了`webdriver_manager.microsoft.EdgeChromiumDriverManager`来自动管理Edge驱动程序。
2. 将`webdriver.Chrome`替换为`webdriver.Edge`。
3. 将Chrome的服务对象替换为Edge的服务对象:`Service`变为`EdgeService`。

希望这些代码对你有帮助!如果有更多问题,欢迎继续讨论。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 17:07:27 | 显示全部楼层
可以使用API来做一个获取天气数据的示范吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 17:07:42 | 显示全部楼层
hitmanyzp 发表于 2024-07-19 17:07
可以使用API来做一个获取天气数据的示范吗?


当然可以!使用API来获取天气数据通常是比较高效和直接的方式。很多天气网站和服务都提供公开的API供开发者使用。这里我以OpenWeatherMap为例,演示如何使用API来获取天气数据。

### 第一步:注册API密钥

首先,你需要在OpenWeatherMap网站注册一个账号,并获取一个免费的API密钥。你可以在[OpenWeatherMap官网](https://home.openweathermap.org/users/sign_up)注册并获取API密钥。

### 第二步:安装requests库

确保你已经安装了`requests`库,如果没有,可以通过以下命令安装:
pip install requests

### 第三步:编写Python代码

下面是一个简单的示例代码,展示了如何使用OpenWeatherMap API来获取天气数据:
import requests

# 替换为你的API密钥
api_key = "你的API密钥"

# 定义要查询的城市
city = "Shanghai"

# 构建API请求URL
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"

# 发送GET请求到API
response = requests.get(url)

# 检查请求是否成功
if response.status_code == 200:
    # 将响应结果解析为JSON
    data = response.json()
    
    # 提取所需的天气信息
    weather_description = data["weather"][0]["description"]
    temperature = data["main"]["temp"]
    humidity = data["main"]["humidity"]
    
    # 打印天气信息
    print(f"City: {city}")
    print(f"Weather Description: {weather_description}")
    print(f"Temperature: {temperature}°C")
    print(f"Humidity: {humidity}%")
else:
    print("Failed to retrieve data")

### 解释

1. **API Key**:替换为你在OpenWeatherMap上获得的API密钥。
2. **城市**:定义你要查询的城市,这里以“Shanghai”为例。
3. **URL**:构建API请求的URL,包含查询的城市和API密钥。`units=metric`表示使用摄氏度。
4. **请求和解析**:通过`requests.get`方法发送API请求,并检查响应状态码是否为200(即请求成功)。然后将响应结果解析为JSON格式,提取所需的天气信息。

这个示例会打印出上海的天气描述、温度和湿度。

### 小贴士

如果你想查询多个城市,可以将城市名称放入一个列表,通过循环依次查询每个城市的天气数据。

希望这些内容对你有帮助!如果还有其他问题或需要进一步的说明,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 22:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表