Python爬虫小白入门经典之爬取动态网页高德地图信息
前言:
以往几篇都是介绍的传统的静态界面的爬取,这次博主介绍一个爬取动态网页的超简单的一个小demo。部分方法来源于网络,若侵权请告知删除。
如果你想小白变大神,请学习我给你分享的资料,另外,想要获取Python免费资料,请关注公众号:“zhulin1028”;回复“python1"、“python2”、“python3”,即可免费获取。更有很多面试资料供你获取。
一、 分析网页结构
简单来说,要获取静态网页的网页数据只需要给服务器发送该网页url地址就行,而动态网页的数据因为是存储在后端的数据库里。所以要获取动态网页的网页数据,我们需要向服务器发送请求文件的url地址,而不是该网页的url地址。
本篇博文就以高德地图展开:https://www.amap.com/
在打开后,我们发现有一堆div标签,但是并没有我们需要的数据,这个时候就可以判定其为动态网页,这个时候,我们就需要找接口
点击网络标签,我们可以看到网页向服务器发送了很多请求,数据很多,找起来太费时间
我们点击XHR分类,可以减少很多不必要的文件,省下很多时间。
XHR类型即通过XMLHttpRequest方法发送的请求,它可以在后台与服务器交换数据,这意味着可以在不加载整个网页的情况下,对网页某部分的内容进行更新。也就是说,向数据库请求然后得到响应的数据是XHR类型的
然后我们就可以在XHR类型下开始一个个找,找到了如下的数据
通过查看Headers获得URL
打开之后,我们发现其为近两天的天气情况。
打开后我们可以看到上面的情况,这是个json格式的文件。然后,它的数据信息是以字典的形式来保存的,而数据是都保存在“data”这个键值里面。
????,找到了json数据,我们来对比下看是否是我们找的东西
通过对比,数据正好对应,那就说明咱们已经拿到数据了。
二、拿到相关网址
查询当前地点天气的url:https://www.amap.com/service/cityList?version=2020101417
各城市对应code的url:https://www.amap.com/service/weather?adcode=410700
备注:这两个url可以从Network中查看到
????,相关网址我们已经拿到了,下面就是具体的代码实现了。至于怎么实现,
我们知道json数据可以使用response.json()转字典,然后操作字典。
三、代码实现
知道了数据的位置后,我们开始来写代码。
3.1 查询所有城市名称和编号
先抓取网页,通过添加headers来伪装成浏览器来对数据库地址进行访问,防止被识别后拦截。
url_city = "https://www.amap.com/service/cityList?version=202092419"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
city = []
response = requests.get(url=url_city, headers=headers)
content = response.json()
print(content)
得到我们想要的数据之后,我们通过查找可以发现cityByLetter里的编号和名称是我们需要的,那么我们就可以盘它了。
if "data" in content:
cityByLetter = content["data"]["cityByLetter"]
for k,v in cityByLetter.items():
city.extend(v)
return city
3.2 根据编号查询天气
得到了编号和名称,下面肯定就是查询天气呀!
先来看接口
通过上图,可以确定最高温度,最低温度等内容。那么就以此来进行数据爬取。
url_weather = "https://www.amap.com/service/weather?adcode={}"
response = requests.get(url=url_weather.format(adcode), headers=headers)
content = response.json()
item["weather_name"] = content["data"]["data"][0]["forecast_data"][0]["weather_name"]
item["min_temp"] = content["data"]["data"][0]["forecast_data"][0]["min_temp"]
item["max_temp"] = content["data"]["data"][0]["forecast_data"][0]["max_temp"]
print(item)
????,我们的设想已经实现了。
四、完整代码
# encoding: utf-8
'''
@author 李华鑫
@create 2020-10-06 19:46
Mycsdn:https://buwenbuhuo.blog.csdn.net/
@contact: aaa@qq.com
@software: Pycharm
@file: 高德地图_每个城市的天气.py
@Version:1.0
'''
import requests
url_city = "https://www.amap.com/service/cityList?version=202092419"
url_weather = "https://www.amap.com/service/weather?adcode={}"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
def get_city():
"""查询所有城市名称和编号"""
city = []
response = requests.get(url=url_city, headers=headers)
content = response.json()
if "data" in content:
cityByLetter = content["data"]["cityByLetter"]
for k, v in cityByLetter.items():
city.extend(v)
return city
def get_weather(adcode, name):
"""根据编号查询天气"""
item = {}
item["adcode"] = str(adcode)
item["name"] = name
response = requests.get(url=url_weather.format(adcode), headers=headers)
content = response.json()
item["weather_name"] = content["data"]["data"][0]["forecast_data"][0]["weather_name"]
item["min_temp"] = content["data"]["data"][0]["forecast_data"][0]["min_temp"]
item["max_temp"] = content["data"]["data"][0]["forecast_data"][0]["max_temp"]
return item
def save(item):
"""保存"""
print(item)
with open("./weather.txt","a",encoding="utf-8") as file:
file.write(",".join(item.values()))
file.write("\n")
if __name__ == '__main__':
city_list = get_city()
for city in city_list:
item = get_weather(city["adcode"],city["name"])
save(item)
五、保存结果
哈哈结束了,祝你成功。
六.总结
首先,小编先声明一下:本程序参考代码仅供学习,切莫用于商业活动,一经被相关人员发现,本小编概不负责!如若侵权请告知删除。
另外,想要获取Python免费资料,请关注公众号:“zhulin1028”;回复“python1"、“python2”、“python3”,即可免费获取。更有很多面试资料供你获取。
上一篇: pandas和numpy笔记(不断更新)
下一篇: python爬虫-动态网站爬取