【爬虫】AOI

news2024/11/25 9:34:48

目前几个大厂,高德百度腾讯,都支持POI爬取,而AOI是需要自己找接口的。
换言之,爬虫需谨慎


1 百度AOI

参考链接是:
这两个链接是选定范围爬取范围内选定类别的AOI
黑科技 | 百度地图抓取地块功能(上)
黑科技 | 百度地图获取地块功能属性(下)

而这个链接是用名称爬取。我参考的是这个:利用名称爬取百度AOI
https://www.cnblogs.com/zhangqinglan/p/13301425.html

跟Amap一样,其实是找到了一个接口:
https://map.baidu.com/?newmap=1&qt=s&da_src=searchBox.button&wd=‘+Name+’&c=XXX

其中Name为要搜索的名称。c=XXX的XXX为城市的city_id。这个之前爬风向标的时候已经看过了。

比如我输入朝阳大悦城和c=131
在这里插入图片描述

1.1 获得AOI ID

第一步是先从https://map.baidu.com/?newmap=1&qt=s&da_src=searchBox.button&wd='+Name+'&c=XXX这个接口里找打aoi的id。
跟参考链接不一样的是,我的名字是上一篇爬虫博客中爬好的csv文件。所以这里改动了下,方便读取我的格式。
另外参考博客这个层层嵌套的for和try-except,乍一看挺唬人。

在测试时还有个问题,就是try-except有时候会报错,返回false,因此我没用它。
以及我开代理爬取时有时成功有时不成功,不知道会不会被锁ip

还有就是在request语句中,参考博客是用 verify=False。后续调试代码时多爬几次就服务器报错了。所以也删掉了。gpt显示这个错误是跟SSH证书有关
在这里插入图片描述

import requests
import pandas as pd
from urllib.parse import quote
import time
import random
import json

HEADERS = {'Accept':'*/*',
        'Accept-Encoding':'gzip, deflate, sdch, br',
        'Accept-Language':'zh-CN,zh;q=0.8',
        'Connection':'keep-alive',
        'Cookie':'BAIDUID=C4D08149D7EE627DC037119413418CA3:FG=1;'\
               'BIDUPSID=C4D08149D7EE627DC037119413418CA3; PSTM=1540284487;'\
               'pgv_pvi=9789244416; BDUSS=GF-S3Y5c1MybnhoTkhwMUxyWEhHM3ZreW1'\
               'UTURiQk1TUFllMWc5V1ZWeUVHNGhkRVFBQUFBJCQAAAAAAAAAAAEAAAA~7j4'\
               '5ztLKx8DtuaTIyzMyMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'\
               'AAAAAAAAAAAAAAAAAAAAAAAAAAISOYF2EjmBdV; session_id=1567581077599;'\
               'session_name=; validate=31187; MCITY=-%3A; M_LG_UID=960425535;'\
               'M_LG_SALT=2cf3bbbbd3e5466b66a2529c037b982b',
        'Host':'map.baidu.com',
        'Referer':'https://map.baidu.com/search/%E9%83%91%E5%B7%9E%E5%B8%82%E4'\
               '%BA%8C%E4%B8%83%E4%B8%87%E8%BE%BE%E4%B8%89%E5%8F%B7%E9%99%A2/@'\
               '12650489.832882352,4101769.7450000006,18.35z/maptype%3DB_EARTH_'\
               'MAP?querytype=s&da_src=shareurl&wd=%E9%83%91%E5%B7%9E%E5%B8%82%'\
               'E4%BA%8C%E4%B8%83%E4%B8%87%E8%BE%BE%E4%B8%89%E5%8F%B7%E9%99%A2&c'\
               '=268&src=0&pn=0&sug=0&l=18&b=(12650755.24571287,4101867.11178217'\
               '83;12651854.04020792,4102020.4126732675)&from=webmap&biz_forward='\
               '%7B%22scaler%22:1,%22styles%22:%22pl%22%7D&device_ratio=1',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) '
                    'AppleWebKit/537.36 (KHTML, like Gecko)'
                    'Chrome/55.0.2883.87 Safari/537.36',}


table=pd.read_csv(r"文件")
result_df = pd.DataFrame()
# 依次读取每个城市的名称和内容
for city in table.columns:
    city_name = city
    if city_name=='XXX':
        code=aaa;
    elif city_name=='XXX':
        code=aaa

    city_content = table[city].values.tolist()
    city_content = list(filter(lambda x: str(x) != "nan", city_content))
    
    list_aoiid=[]
    for mall in city_content:
        encoded_mall = quote(mall)
        url = "https://map.baidu.com/?newmap=1&qt=s&da_src=searchBox.button&wd={}&c={}".format(
                encoded_mall, code)
        print(url)
        
        delay = random.randint(2, 5)  # 生成1到2之间的随机整数
        time.sleep(delay)  # 延时随机秒数

        r = requests.get(url,headers=HEADERS, allow_redirects=True)
        data = r.content
        data=data.decode('utf-8')
        data = json.loads(data)
        aoi_id = data['result']['profile_uid']
        print(aoi_id)
        list_aoiid.append(aoi_id)
        
    city_data = pd.DataFrame({
        city_name: city_content,
        'aoiid': list_aoiid})
    
    result_df = pd.concat([result_df, city_data], ignore_index=True, axis=1)
    print(result_df)

可以看见最后获得的dataframe结果是这样的。是的我个人很喜欢搞完一步就存dataframe。
没有表头自己加一下就好。然后我们随机挑选几个进行验证。
在这里插入图片描述

验证链接就是前面代码print(url)输出的链接,或者自己按照前面的方法,设置name和city id,也行。
也是很佩服参考链接的博主怎么找到这个是aoi id 的,以及发现aoi的接口
在这里插入图片描述
在这里插入图片描述

1.2 AOI获取

不知道博主从哪里找到的接口:
https://map.baidu.com/?newmap=1&qt=ext&uid=‘+AOI ID+’&ext_ver=new&ie=utf-8&l=1
更改里面的AOI ID就行。下图中的Geo就是我们需要的
在这里插入图片描述
根据黑科技 | 百度地图获取地块功能属性(下)链接中的讲解,
aoi抓取到的数据是百度米制坐标,也就是百度墨卡托投影坐标系。而我们一般使用的都是wgs84大地坐标系。
需要转换【百度米制】到【百度经纬度坐标】再到【wgs84】。也就是【bd09mc】到【bd09】到【wgs84】
也就是要将下图中右边各个点的坐标进行转换
在这里插入图片描述
这里的转换跟黑科技 | 百度地图获取地块功能属性(下)提供的下载包中的转换代码做了对比,【bd09mc】到【bd09】没有差别,是一样的,而【bd09】到【wgs84】有出入。看想要哪种吧。我懒得换了。

#from station import stations
import warnings
import  xdrlib ,sys
import xlrd
import time
import socket

#bd墨卡托转BD-09
import math
pi = 3.1415926535897932384626
def Yr(lnglat,b):
    if b!='':
        c=b[0]+b[1]*abs(lnglat[0])
        d=abs(lnglat[1]/b[9])
        d=b[2]+b[3]*d+b[4]*d*d+b[5]*d*d*d+b[6]*d*d*d*d+b[7]*d*d*d*d*d+b[8]*d*d*d*d*d*d
        if 0>lnglat[0]:
            bd=-1*c
        else:
            bd=c
        lnglat[0]=bd
        if 0 > lnglat[0]:
            bd2 = -1 * d
        else:
            bd2 = d
        lnglat[1] = bd2
        return lnglat
    return
def Mecator2BD09(lng,lat):
    lnglat=[0,0]
    Au=[[1.410526172116255E-8, 8.98305509648872E-6, -1.9939833816331, 200.9824383106796, -187.2403703815547,
          91.6087516669843, -23.38765649603339, 2.57121317296198, -0.03801003308653, 1.73379812E7],
         [- 7.435856389565537E-9, 8.983055097726239E-6, -0.78625201886289, 96.32687599759846, -1.85204757529826,
          -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 1.026014486E7],
         [- 3.030883460898826E-8, 8.98305509983578E-6, 0.30071316287616, 59.74293618442277, 7.357984074871,
          -25.38371002664745, 13.45380521110908, -3.29883767235584, 0.32710905363475, 6856817.37],
         [- 1.981981304930552E-8, 8.983055099779535E-6, 0.03278182852591, 40.31678527705744, 0.65659298677277,
          -4.44255534477492, 0.85341911805263, 0.12923347998204, -0.04625736007561, 4482777.06],
         [3.09191371068437E-9, 8.983055096812155E-6, 6.995724062E-5, 23.10934304144901, -2.3663490511E-4,
          -0.6321817810242, -0.00663494467273, 0.03430082397953, -0.00466043876332, 2555164.4],
         [2.890871144776878E-9, 8.983055095805407E-6, -3.068298E-8, 7.47137025468032, -3.53937994E-6, -0.02145144861037,
          -1.234426596E-5, 1.0322952773E-4, -3.23890364E-6, 826088.5]]
    Sp=[1.289059486E7, 8362377.87, 5591021, 3481989.83, 1678043.12, 0 ]
    lnglat[0]=math.fabs(lng)
    lnglat[1] =abs(lat)
    for d in range(0,6):
        if lnglat[1]>=Sp[d]:
            c=Au[d]
            break
    lnglat=Yr(lnglat,c)
    return lnglat
def BD092WGS84(lnglat):
    #bd09-gcj

    x_pi = 3.14159265358979324 * 3000.0 / 180.0
    pi = 3.1415926535897932384626  # π
    a = 6378245.0  # 长半轴
    ee = 0.00669342162296594323  # 扁率
    x = lnglat[0] - 0.0065
    y = lnglat[1] - 0.006
    z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
    theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
    lnglat[0] = z * math.cos(theta)
    lnglat[1] = z * math.sin(theta)

    dlat = tranlat1(lnglat[0] - 105.0, lnglat[1] - 35.0)
    dlng = tranlng1(lnglat[0] - 105.0, lnglat[1] - 35.0)
    radlat = lnglat[1] / 180.0 * pi
    magic = math.sin(radlat)
    magic = 1 - ee * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
    dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
    mglat = lnglat[1] + dlat
    mglng = lnglat[0] + dlng
    return [lnglat[0]* 2 - mglng, lnglat[1] * 2 - mglat]
def tranlat1(lng, lat):
    ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
    ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
            math.sin(2.0 * lng * pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lat * pi) + 40.0 *
            math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
    ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
            math.sin(lat * pi / 30.0)) * 2.0 / 3.0
    return ret
def tranlng1(lng, lat):
    ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
          0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
    ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
            math.sin(2.0 * lng * pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(lng * pi) + 40.0 *
            math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
    ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
            math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
    return ret

大体跟按照名称进行aoi提取的代码是一样的,没怎么改动。只不过原代码因为是id和aoi坐标嵌套的,所以最后输入坐标时可以直接用名称。我这里还需要自己再改改。

import requests
import pandas as pd
from urllib.parse import quote
import time
import random
import json

table=pd.read_csv(r"XXXXX")
none_aoiid=[]
with open(r"J:/【23.06-xx】政策评估论文/【23.7】mall name/aoi_info.txt", 
          'a',newline='') as f:
    for z in range(0,4):
        print('现在的数字是',z)
        city_mall=table.iloc[:,2*z]
        id_mall=table.iloc[:,2*z+1] 
        id_content = id_mall.values.tolist()
        id_content = list(filter(lambda x: str(x) != "nan", id_content))

        for aoiid in id_content:
            url_AOI = 'https://map.baidu.com/?newmap=1&qt=ext&uid={}'\
                        '&ext_ver=new&ie=utf-8&l=11'.format(aoiid)
            print('处理链接',url_AOI)
            r_AOI = requests.get(url_AOI,headers=HEADERS, allow_redirects=True)
            data = r_AOI.content.decode('utf-8')
            data = json.loads(data)

            if 'geo' in data['content']:
                geo_AOI = data['content']['geo']
                geo_AOI = geo_AOI.split('|')
                point = geo_AOI[2].split(",")

                point_transform=[]
                for i in range(int(len(point)/2)):#全部点的坐标,分别是x,y,的形式
                    if i==0: #[2:]的作用:删除第一个坐标的‘1-’字符
                        point[2*i] = point[2*i][2:] 
                    if i==int((len(point)/2)-1):  #删除最后一个坐标的‘;’字符
                        point[2*i+1] = point[2*i+1][:-1]
#                     print('第'+str(i)+'个点的坐标',float(point[2*i]),float(point[2*i+1]))#打印出各点的坐标
                    point_Mecator2BD09 = Mecator2BD09(float(point[2*i]),float(point[2*i+1]))
                    point_BD092WGS84 = BD092WGS84(point_Mecator2BD09)
                    point_transform.append(point_BD092WGS84)
                    point_str = '' #这是创建一个文本存储
                for j in range(len(point_transform)):
                    point_str = point_str+(str(point_transform[j])).replace(' ','')[1:-1]+';'
                print(str(aoiid)+' 处理完毕。开始写入')
                line=aoiid+' '+point_str+'\n'
                f.write(line)
            else:
                print(aoiid+'没有找到坐标')
                none_aoiid.append(aoiid)
    print('没有信息的aoi',str(none_aoiid))

将txt的iaoiid和csv文件进行匹配替换,最后结果是下面这样
在这里插入图片描述

1.3 小结

Amap的爬虫是我之前就做过的,用到就是下面的链接方法。需要一个个自己输入,比较麻烦。
但是抓包工具比自己的代码更强大,能搞定Amap的反扒机制。很强。

由于信息做过筛选所以百度这里只有坐标,最后生成AOI的shapefile的话也没有什么信息。这个还需要改进其实。毕竟信息都爬下来了。

Amap AOI

这个是一个半自动化的抓取方式。用抓包工具Fiddler
POI的体量 - AOI数据获取脚本分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepSpeed-Chat 打造类ChatGPT全流程 笔记二之监督指令微调

文章目录 系列文章0x0. 前言0x1. 🐕 Supervised finetuning (SFT) 教程翻译🏃 如何训练模型🏃 如何对SFT checkpoint进行评测?💁 模型和数据☀️来自OPT-1.3B及其SFT变体(使用不同微调数据)的提示示例☀️…

关于layui实现按钮点击添加行的功能

关于layui实现按钮点击添加行的功能 实现效果 代码实现 <!DOCTYPE html> <html lang"zh" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>Title</title><link rel"styl…

帅气的头像-InsCode Stable Diffusion 美图活动一期

1.运行地址 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 界面截图&#xff1a; 2.模型版本及相关配置 模型&#xff1a;chilloutmix-Ni.safetensor [7234b76e42] 采样迭代步数&#xff08;steps&#xff09;: 30 采样…

QtDesigner的使用

QtDesigner的使用 1、快速入门2、布局管理 1、快速入门 主窗口 菜单栏、工具栏、状态栏 快捷预览方式&#xff0c;工具箱 对象查看器 属性编辑器 英文名作用objectName控件对象名称geometry相对坐标系sizePolicy控件大小策略minnimumSize最小宽度、高度maximumSize最大宽度…

基于jsp+Servlet+mysql学生信息管理系统V2.0

基于jspServletmysql学生信息管理系统V2.0 一、系统介绍二、功能展示1.项目骨架2.数据库表3.项目内容4.登陆界面5.学生-学生信息6、学生-修改密码7、管理员-学生管理8、管理员-添加学生9.管理员-修改学生信息10.管理员-班级信息11.管理员-教师信息 四、其它1.其他系统实现五.获…

旅游卡系统旅行社小程序APP

旅游业的不断发展&#xff0c;旅游卡系统、旅行社小程序APP等数字化工具已经成为了旅行社提升业务效率、提高客户体验的重要手段。下面&#xff0c;我们将为您介绍旅游卡系统旅行社小程序APP的相关内容。 一、旅游卡系统 旅游卡系统是一种将旅游门票、优惠券等资源整合…

实时包裹信息同步:WebSocket 在 Mendix 中的应用

场景介绍 在现代物流中&#xff0c;能够实时跟踪包裹信息&#xff0c;尤其是包裹重量&#xff0c;是非常重要的。在这种场景中&#xff0c;我们可以使用称重设备获取包裹的信息&#xff0c;然后实时将这些信息同步给 Mendix 开发的 App&#xff0c;并在 App 的页面上实时显示包…

获取java对象被更新的属性和值

业务场景 更新User信息后&#xff0c;需要收集哪些字段的哪些值被更新了。 思路 比较originUser和newUser&#xff0c;收集值不同的属性以及变化前后的值。 代码实现 public static Map<String, Map<String, Object>> getChange(Object originObject, Object ne…

Java 9 - 模块化系统

定义要导出的模块 package com.lfsun.java9study.mypackage;public class MyClass {public static void sayHello() {System.out.println("Hello from com.lfsun.java9study.mypackage!");}public static void main(String[] args) {System.out.println("test&…

【Linux】LVS负载均衡群集 DR模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LVS负载均衡群集 DR模式 数据包流向分析DR 模式的特点LVS-DR中的ARP问题VIP地址相同导致响应冲突返回报文时源地址使用VIP&#xff0c;导致网关设备的ARP缓存表紊乱 DR模式 L…

Pycharm配置解释器(interpreter)

关于pycharm编译器的解释器&#xff0c;网友朋友的分享 Pycharm配置&#xff08;1&#xff09;——解释器&#xff08;interpreter&#xff09; 详细了解PyCharm支持的4种Python Interpreter和配置方法 对大多数人而言就只需要 分清虚拟解释器和系统解释器&#xff0c;使用虚拟…

关闭Win10的预览窗口

关闭Win10的预览窗口 每次拖拽文件都显示那个黑边的模型一样的东西&#xff0c;通过上面可以关闭该功能。

MBD开发 STM32 外部仿真

要接一个串口&#xff0c;用来设备和simulink的通信 烧录即可 烧录时选择串口

.360勒索病毒的加密数据怎么处理?|.360勒索病毒数据解密恢复

.360勒索病毒是一种恶意软件&#xff0c;它对用户的计算机文件进行加密&#xff0c;并要求支付赎金才能解密恢复数据。这种勒索病毒以其广泛传播和严重破坏性而闻名&#xff0c;给个人用户和企业带来了巨大的困扰和损失。 一家中型制造企业&#xff0c;名为XYZ制造有限公司&…

用科技智造新未来!在线开发平台强力助推数字化发展

在科技智造新时代&#xff0c;科技的力量是无处不见的。运用科技可以创造美好的生活&#xff0c;可以实现数字化发展&#xff0c;帮助企业实现流程化管理。在线开发平台将科技元素注入到平台中&#xff0c;将科技与办公需求相连接&#xff0c;创造高效率办公及流程化发展。 1…

# hub.docker.com镜像加速站点仓库的搭建与使用

hub.docker.com镜像加速站点仓库的搭建与使用 文章目录 hub.docker.com镜像加速站点仓库的搭建与使用1 镜像仓库搭建1.1 创建目录及docker-compose.yaml1.2 如果要开启密码验证&#xff0c;需要先生成密码1.3 启动服务 2 用户端使用3 最后 前段时间由于拉取docker镜像&#xff…

初出茅庐的小李博客之链表知识2

链表知识点2 通过malloc函数动态创建节点&#xff1a; #include <stdio.h> #include <stdlib.h>typedef struct List Node_t;struct List {/*数据区域有两个变量*/int a;float b;/*地址区域有一个指针*/Node_t* pNext; };Node_t Head_Node; //表头变量 Node_t Bo…

ChatGPT与Excel结合_编写VBA宏

先来解释下什么是Excel vba宏 ⭐Excel VBA宏&#xff08;Visual Basic for Applications&#xff09;是一种用于在Microsoft Excel中自动化和扩展功能的编程语言。VBA允许用户编写自定义的脚本或宏&#xff0c;以便通过执行一系列指令来自动完成特定任务。 使用Excel VBA宏&a…

分布式——监控平台zabbix的认识与搭建

作为一个运维&#xff0c;需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等&#xff0c;利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●…

自学软件测试

自学软件测试体系&#xff08;1&#xff09; 前言&#xff1a;很多小伙伴想要自学软件测试课程走上测试工程师道路&#xff0c;基于此目的给出想要自学软件测试的一些小伙伴一些学习的方向。软件测试工程师的职业发展方向包括功能测试&#xff0c;自动化测试&#xff0c;专项测…