Python爬虫实战系列6:高德地图充电站数据采集

一、分析需求

本次实验案例是采集地图APP上的充电站数据,为了演示方便,这里只展示一些基础字段采集。

首先分析网页版数据请求 https://amap.com/ 发现代码写完后,反爬措施比较厉害,频繁出现滑块验证码,可能这是阿里系的特点吧。

所以后来不得不采用直接调用高德API的形式获取poi列表

二、代码实现

2.1、获取POI列表

直接在高德开放平台注册账号,开通一个应用,个人免费版,申请key即可。

经过查看文档,我们采用搜索POI2.0接口

API文档地址:https://lbs.amap.com/api/webservice/guide/api-advanced/newpoisearch

官方文档比较详细,根据文档写对应请求代码即可。



import json

import requests


class GaodeAPI:
    """
    高德API接口版本
    """

    def __init__(self, key, city='北京', keyword=None):
        self.key = key
        self.keyword = keyword
        self.city = city
        self.offset = 20

    def get_poi_total_list(self):
        """
        获取POI列表
        :return:
        """
        first_page = self.get_poi_page(pagenum=1)
        if first_page['infocode'] == '10044':
            raise Exception('当日查询已限额,请明天再试.')
        page_count = int(first_page['count'])
        iterate_num = round(page_count / self.offset) + 1
        final_result = []
        for i in range(1, iterate_num):
            temp_result = self.get_poi_page(i)
            final_result.extend(temp_result['pois'])

        return final_result

    def get_poi_page(self, pagenum):
        """
        获取POI详情
        :param pagenum:
        :return:
        """
        url = f'https://restapi.amap.com/v3/place/text?city={self.city}&offset={self.offset}&page={pagenum}&key={self.key}&types=011100|011102|011103|073000|073001|073002&extensions=all'

        response = requests.get(url)
        result = json.loads(response.text)

        return result

通过以上代码可以获取到POI列表,这里解释下POI就相当于地图上任意一个点,在地图APP上,一个外卖店,洗车店,充电桩都是一个个点,这些点在地图APP上的概念叫POI。*

不管对不对,总之我是这么理解的~ *

2.2、获取POI详情

我们获取到所有POI后,接下来需要获取POI的详细信息,这个我在官方文档中没找到详情接口,所以采用别的方案实现。

通过分析web端浏览器请求明显看出请求的详情接口

浏览器地址:https://amap.com/place/B0JU3U634F place后面的是POI的id

详情接口:https://amap.com/detail/get/detail?id=B0JU3U634F

但是如果你写代码访问的时候就会出现哎哟喂,被挤爆啦,请稍后重试的错误

{'ret': ['FAIL_SYS_USER_VALIDATE', 'RGV587_ERROR::SM::哎哟喂,被挤爆啦,请稍后重试'],

好像这个接口风控比较厉害,只能请求一次,如果仔细逆向分析估计也能解决,但是太费时费力了,并且后续还会有滑块验证码的问题需要解决。

这里推荐另外一种技术方案:既然浏览器打开网页可以请求到数据,那就监听浏览器请求包,从请求包里获取数据内容

纵观Python的这些库,没找到几个可以监听浏览器请求的库,最后还是采用国人开发的drissionpage来实现。

文档地址:https://www.drissionpage.cn/ChromiumPage/listener/#-listenwait

代码如下:

   ``def handle_detail(poi_list):`    `"""`    `处理POI详情信息`    `:return:`    `"""`    `try:`        `base_url = "https://amap.com/place/"``   `        `page = ChromiumPage()`        `page.get(base_url)  # 访问网址,这行产生的数据包不监听``   `        `page.listen.start('amap.com/detail/get/detail')  # 开始监听,指定获取包含该文本的数据包`        `for poi in poi_list:`            `poi_id = poi['id']`            `page.get(base_url + poi_id)`            `res = page.listen.wait()  # 等待并获取一个数据包`            `detail_json = res.response.body`            `detail_json = detail_json['data']`            `db.update(table='gaode_pois',`                      `data={'detail_json_data': json.dumps(detail_json)},`                      `condition=f" poi_id = '{poi_id}'"`                      `)`            `Print.green(f"{poi_id}详细信息采集完成.")``   `    `except Exception as e:`        `print(e)``   

以上代码则实现了获取POI列表和POI详情的数据,我们把这两个json格式数据存入数据库即可。

三、导出数据

获取到数据后就简单了,直接写个函数导出Excel方便分析。

   ``def to_excel():`    `"""`    `导出Excel`    `:return:`    `"""`    `detail_list = db.query("select poi_id,detail_json_data,create_time from gaode_pois")`    `result = []`    `for detail in detail_list:`        `detail_json_data = json.loads(detail['detail_json_data'])``   `        `poi_id = detail['poi_id']`        `create_time = detail['create_time']`        `city_name = detail_json_data['base']['city_name']`        `name = detail_json_data['base']['name']`        `address = detail_json_data['base']['address']`        `brand_desc = detail_json_data['charging']['brand_desc']`        `charge_price = detail_json_data['charging']['charge_price']`        `price_parking = detail_json_data['deep']['price_parking']`        `result.append({`            `'city_name': city_name,`            `'poi_id': poi_id,`            `'name': name,`            `'address': address,`            `'brand_desc': brand_desc,`            `'charge_price': charge_price,`            `'price_parking': price_parking,`            `'create_time': create_time,`        `})`    `df = pd.DataFrame(result)`    `df.columns = ['城市', 'id', '名称', '地址', '品牌', '价格', '价格标记', '采集时间']`    `output_path = f"高德导出数据_{get_now_time()}.xlsx"`    `df.to_excel(output_path, index=False)`    `Print.green(f"数据导出完成:{output_path}")``   

最终导出结果如下:

总结

1.阿里系的产品基本都有风控,且滑块都基本长一个样,虽然滑块看起来简单(往右一滑的样子)但是不管你怎么滑,都很难滑过。感觉这滑块就是个小游戏~2.爬虫过程中,也可以多想想其他解决方案,比如监听浏览器数据包。

由于信息安全问题,这里不放完整源码。本文章内容及代码只做学习交流使用,作者不负责任何由此引起的任何法律责任。您在引用该代码时代表您已同意该协议,由此引起的任何法律责任由您承担。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值