目录
1. 简介
接下来我将通过三篇文章介绍如何通过天气网 (weather.com.cn)爬取天气信息。本文将介绍爬取地区名称与地区ID的对应关系,为爬取天气信息打下基础。
您可以访问我的主页查看另外两篇文章。代码写不完了的博客代码写不完了擅长Python项目,python操作文件,系统环境配置,等方面的知识,代码写不完了关注pandas,python,django,pygame,spark,pip,virtualenv,numpy,flask领域.https://blog.csdn.net/spx_0108
2. 信息收集
(1)点击进入天气网的首页:
(2)随机搜索一个地区,进入到以下界面,注意URL:
再换一个地区,再次查看URL :
两个地区天气的URL如下:
南京天气:http://www.weather.com.cn/weather1d/101190101.shtml
北京天气:http://www.weather.com.cn/weather1d/101010100.shtml
看的出来,每个地区对应着一个9位数的ID,只需要替换URL中的ID即可查看到对应地区的天气。打开开发者工具(这里我使用的是微软浏览器),刷新界面,查看资源加载情况:
(3)看到这个city.js的资源名,点进去看一下:
(4) 就是它了!响应的数据是地区名称和地区ID对应关系:
查看一下这个资源的标头信息:
3. 编写爬虫
(1)我们已经得到了地区名称与地区ID的请求URL,请求方法,请求头等信息,编写area_id_spider.py
'''
爬取地区名称与对应的id
'''
import json
import requests
import re
URL = 'https://j.i8tq.com/weather2020/search/city.js'
UA = {
'Referer': 'http://www.weather.com.cn/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43'
}
class GetAreaID():
def get_area_id(self):
areas = requests.get(url=URL, headers=UA)
if areas.status_code == 200:
areas.encoding = 'utf-8'
# print(areas.text)
# 使用正则表达式,匹配地区名称和地区ID
matches = re.findall(r'"AREAID":\s*"(\d+)"\s*,\s*"NAMECN":\s*"([\u4e00-\u9fa5]+)"', areas.text)
# 将匹配结果转换为字典
result = {match[1]: match[0] for match in matches}
# 保存匹配结果到json文件
with open('../data/area_id.json', 'w', encoding='utf-8') as f:
json.dump(result, f, indent=4, ensure_ascii=False)
return "请到 data/area_id.json 文件里查看地区id"
else:
return "地区id信息爬取失败..."
if __name__ == '__main__':
msg = GetAreaID().get_area_id()
print(msg)
上述代码中保存到json文件的步骤,你需要修改为你保存的路径, 以下是我的项目的结构:
4. 测试验证
(1)运行上面的爬虫程序,控制台输出:
(2)查看area_id.json文件:
至此,已完成收集该网站中地区与ID的对应关系!