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

爬虫入门经典(五) | 简单一文教你如何爬取高德地图  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/。PS:由于现在越来越多的人未经本人同意直接爬取博主本人.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/
1

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!


2


推荐

31
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
30

一、 分析网页结构

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

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

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

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

?,下面开始进入正题。

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

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

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

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

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

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

二、拿到相关网址

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

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

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

三、代码实现

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

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)

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

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

15

3.2 根据编号查询天气

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

先来看接口
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)

17

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

四、完整代码

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

五、保存结果

18
19

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


21

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

22
23

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159499.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • H2数据库集群_数据库集群搭建

    H2数据库集群_数据库集群搭建H2数据库集群1.H2数据库简介1.1H2数据库优势常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独立的客户端和服务器端。H2的优势:1、h2采用纯Java编写,因此不受平台的限制。2、h2只有一个jar文件,十分适合作为嵌入式数据库试用。3、性能和功能的优

    2022年10月12日
  • Laravel引入第三方库的方法

    Laravel引入第三方库的方法

    2021年10月25日
  • datax(8):TaskGroupContainer源码解读

    datax(8):TaskGroupContainer源码解读继续深挖datax里的container,任务一个任务进入datax都会判断是jobContainer还是TaskGroupContainer。那后者要做哪些事情。一,TaskGroupContainer概述JobContainer将所有的task分配到TaskGroup中执行,TaskGroup启动5个线程去消费所有的taskTaskGroupContainer里的主入口为start方法,实现自AbstractContainer.startTaskGroupContainer.start.

  • 无线网出现叉怎么回事_无线网络出现红叉怎么解决

    无线网出现叉怎么回事_无线网络出现红叉怎么解决1.查看了驱动,是正常的2.查看了控制面板,“无线”是开启的2.win + r 输入 services.msc进入策略这个三个改为自动,重启电脑

  • es6数组方法find()、findIndex()与filter()的总结

    es6数组方法find()、findIndex()与filter()的总结find()该方法主要应用于查找第一个符合条件的数组元素。它的参数是一个回调函数。在回调函数中可以写你要查找元素的条件,当条件成立为true时,返回该元素。如果没有符合条件的元素,返回值为undefined。以下代码在myArr数组中查找元素值大于4的元素,找到后立即返回。返回的结果为查找到的元素:constmyArr=[1,2,3,4,5,6];varv=myArr.find(value=>value>4);console.log(v);//5没有符合元素,返回undefi

  • 【iOS】iOS之Button segue弹出popOver消除(dismiss)问题

    【iOS】iOS之Button segue弹出popOver消除(dismiss)问题

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号