ITPub博客

首页 > 应用开发 > Python > 爬虫入门经典(五) | 简单一文教你如何爬取高德地图

爬虫入门经典(五) | 简单一文教你如何爬取高德地图

Python 作者:qwer1030274531 时间:2020-10-23 10:53:11 1 删除 编辑

一、 分析网页结构

以往几篇都是介绍的传统的静态界面的爬取,这次博主介绍一个爬取动态网页的超简单的一个小 demo
3
说到动态网页,你对它了解多少呢? http://ask.baikezh.com/anhui/

如果对动态网页不认识的童鞋,博主在此给出链接,可以看百度百科的详细解析 动态网页_百度百科以及小马夫的 静态页面和动态页面的区别

4
不要怪博主没有进行讲解,因为博主本人对与动态网页的概念也不是太过了解。等到博主整理好思绪的时候,博主会专门写一篇博文的 http://zzdxb.baikezh.com/zhumadian/

简单来说,要获取静态网页的网页数据只需要给服务器发送该网页 url地址就行,而动态网页的数据因为是存储在后端的数据库里。所以要获取动态网页的网页数据,我们需要向服务器发送请求文件的 url地址,而不是该网页的 url地址。 http://ask.baikezh.com/heilongjiang/

🆗,下面开始进入正题。

本篇博文就以高德地图展开: https://www.amap.com/
5
在打开后,我们发现有一堆 div标签,但是并没有我们需要的数据,这个时候就可以判定其为动态网页,这个时候,我们就需要找接口 http://ask.baikezh.com/hebei/ 8
6
点击网络标签,我们可以看到网页向服务器发送了很多请求,数据很多,找起来太费时间

我们点击 XHR分类,可以减少很多不必要的文件,省下很多时间。

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

然后我们就可以在 XHR类型下开始一个个找,找到了如下的数据
7
通过查看 Headers获得 URL
9
打开之后,我们发现其为近两天的天气情况。 http://dxb.myzx.cn/video/ 10

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

🆗,找到了 json数据,我们来对比下看是否是我们找的东西
11
通过对比,数据正好对应,那就说明咱们已经拿到数据了。

二、拿到相关网址 http://dxb.myzx.cn/guiyang/

'''
查询当前地点天气的url:https://www.amap.com/service/cityList?version=2020101417
各城市对应code的url:https://www.amap.com/service/weather?adcode=410700
备注:这两个url可以从Network中查看到
'''123456

12
🆗,相关网址我们已经拿到了,下面就是具体的代码实现了。至于怎么实现,

我们知道json数据可以使用 response.json()转字典,然后操作字典。
13

三、代码实现

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

3.1 查询所有城市名称和编号 http://ask.baikezh.com/

先抓取网页,通过添加 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)12345678910

14
得到我们想要的数据之后,我们通过查找可以发现 cityByLetter里的编号和名称是我们需要的,那么我们就可以盘它了。
15

    if "data" in content:
        cityByLetter = content["data"]["cityByLetter"]
        for k,v in cityByLetter.items():
            city.extend(v)
    return city12345

15

3.2 根据编号查询天气 http://dxb.myzx.cn

得到了编号和名称,下面肯定就是查询天气呀!

先来看接口
16
通过上图,可以确定最高温度,最低温度等内容。那么就以此来进行数据爬取。

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)12345678

17

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

四、完整代码 http://ask.baikezh.com/xian/

# encoding: utf-8'''
  @author 李华鑫
  @create 2020-10-06 19:46
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@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 citydef 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 itemdef 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)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263

五、保存结果 http://dxb.myzx.cn/chongqing/

18
19

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


21

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注我哦!

22
23


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30239065/viewspace-2729024/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-05-08

  • 博文量
    150
  • 访问量
    62574