小流星 发表于 2021-8-7 09:16:03

解决传统天气API失效办法——爬取完整页面再提取数据

本帖最后由 小流星 于 2021-8-7 10:00 编辑

如题,现在稳定免费无需注册只需一个HTTP链接即可查询指定城市天气的WebAPI已经绝迹了,最好的办法是爬取整个HTML页面再分析页面内容,用正则表达式提取数据,这种方法非常稳,基本不会失效,除非网站布局改变需要修改正则表达式。
以weather.com为例:
打开官方网站搜索某一城市天气,地址栏会变成https://weather.com/weather/today/l/xxxxxx...xxxxxxx字样,最后的那段xxx代表查询参数,记下这个就行。
然后右键点击显示的温度或者天气,在弹出菜单上选择Inspect/查看元素,就能找出负责显示温度天气的HTML部分,分析这部分HTML就能发现有两个部分是需要的数据:图中红线部分,一个是温度(华氏度85),一个是天气描述Fair。

也就是说整个网页里,需要的HTML只是这一部分:
<div class="CurrentConditions--primary--39Y3f"><span data-testid="TemperatureValue" class="CurrentConditions--tempValue--1RYJJ">85°</span><div data-testid="wxPhrase" class="CurrentConditions--phraseValue--17s79">Fair</div></div>据此可编写一个简单的正则表达式,为了以防万一class类名中的"39Y3f, 1RYJJ, 17s79"字样会随着访问者或者访问时间不同而发生变化,在正则表达式里这一块不写死,用\w+代替,需要的数据部分加上( )用分组捕获,放到Rainmeter的ini文件里则写成:
RegExp="(?siU).*<div class="CurrentConditions--primary--\w+"><span data-testid="TemperatureValue" class="CurrentConditions--tempValue--\w+">(\d+)°</span><div data-testid="wxPhrase" class="CurrentConditions--phraseValue--\w+">(.+)</div>.*"Rainmeteor执行之后会返回两个捕获到的分组StringIndex1和StringIndex2,分别代表华氏温度和天气描述。华氏温度转摄氏度需要用Rainmeter给的Formulas语法做一次运算。
参考文档:
https://docs.rainmeter.net/tips/webparser-lookahead-assertions-in-regexp/
https://docs.rainmeter.net/manual/formulas/
注:weather.com网站页面复杂,解析一次需要花上些时间,需要快速得到天气数据的可以解析中国天气网http://www.weather.com.cn/,同样是显示当天天气,中国天气网的页面体积70KB,而weather.com传输140KB,原始880KB。


小流星 发表于 2021-8-7 09:22:18

本帖最后由 小流星 于 2021-8-7 10:12 编辑

目前在做一个示例皮肤,以Harmo Clock皮肤为基础,修改它的天气功能{:10_443:}
https://bbs.rainmeter.cn/thread-290755-1-1.html

lcyboy871010 发表于 2021-8-8 18:28:36

好东西谢谢分享

fnca 发表于 2021-8-10 10:32:19

手残党,等大佬分享

ThetaBot 发表于 2022-3-19 14:41:44

感谢大佬分享资源和技术

xtftjb 发表于 2022-3-24 10:31:05


辛苦了·感谢分享~~~

ThetaBot 发表于 2022-4-15 21:34:59

万分感谢大佬分享

houyaheng 发表于 2023-4-25 15:26:13

学习学习。感谢楼主
页: [1]
查看完整版本: 解决传统天气API失效办法——爬取完整页面再提取数据