你的将来有我导航----教你如何爬取高德地图



 简单一文教你如何爬取高德地图


目录

  • 推荐python

  • 1、 分析网页结构数据库

  • 2、拿到相关网址json

  • 3、代码实现后端

    • 3.1 查询全部城市名称和编号浏览器

    • 3.2 根据编号查询天气服务器

  • 4、完整代码微信

  • 5、保存结果markdown


1、 分析网页结构

以往几篇都是介绍的传统的静态界面的爬取,此次博主介绍一个爬取动态网页的超简单的一个小demo

说到动态网页,你对它了解多少呢?网络

若是对动态网页不认识的童鞋,博主在此给出连接,能够看百度百科的详细解析动态网页_百度百科以及小马夫的静态页面和动态页面的区别app



简单来讲,要获取静态网页的网页数据只须要给服务器发送该网页url地址就行,而动态网页的数据由于是存储在后端的数据库里。因此要获取动态网页的网页数据,咱们须要向服务器发送请求文件的url地址,而不是该网页的url地址。

🆗,下面开始进入正题。

本篇博文就以高德地图展开:https://www.amap.com/

在打开后,咱们发现有一堆div标签,可是并无咱们须要的数据,这个时候就能够断定其为动态网页,这个时候,咱们就须要找接口


点击网络标签,咱们能够看到网页向服务器发送了不少请求,数据不少,找起来太费时间

咱们点击XHR分类,能够减小不少没必要要的文件,省下不少时间。

XHR类型即经过XMLHttpRequest方法发送的请求,它能够在后台与服务器交换数据,这意味着能够在不加载整个网页的状况下,对网页某部分的内容进行更新。也就是说,向数据库请求而后获得响应的数据是XHR类型的

而后咱们就能够在XHR类型下开始一个个找,找到了以下的数据

经过查看Headers得到URL

打开以后,咱们发现其为近两天的天气状况。

打开后咱们能够看到上面的状况,这是个json格式的文件。而后,它的数据信息是以字典的形式来保存的,而数据是都保存在“data”这个键值里面。

🆗,找到了json数据,咱们来对比下看是不是咱们找的东西

经过对比,数据正好对应,那就说明我们已经拿到数据了。

2、拿到相关网址

'''查询当前地点天气的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、代码实现

知道了数据的位置后,咱们开始来写代码。

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里的编号和名称是咱们须要的,那么咱们就能够盘它了。

  
  
   
   
            
   
   
  • 1

  • 2

  • 3

  • 4

  • 5

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)


🆗,咱们的设想已经实现了。

4、完整代码

# encoding: utf-8''' @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)


5、保存结果


正文结束!!!



欢迎关注公众号:Python爬虫数据分析挖掘

记录学习python的点点滴滴;

回复【开源源码】免费获取更多开源项目源码;

公众号每日更新python知识和【免费】工具;

本文已同步到【开源中国】、【腾讯云社区】、【CSDN】;

文章源:buwenbuhuo.blog.csdn.net/



本文分享自微信公众号 - Python爬虫数据分析挖掘(zyzx3344)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索