高德地图美食

前言:今天讲下高德地图全国美食爬虫。

反爬点:

高德地图反爬主要是:

1.IP代理。

2.headers(referer,cookie必要的),referer:随便个可以不变。cookie:必要的参数:isg,l,cna(可自行数字大小写字母组合),uab_collina(固定值)

3.限制最大45页,可地区精确到区及二级分类精确到火锅来尽可能最大获取,避免最大页数问题.


import requests,random,string,time,pymongo,re,json,datetime,logging
from Config import Config
from urllib import parse
logging.basicConfig(filename="show.log",filemode="a",format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO)class Amap(object):def __init__(self):self.isg = 'XXXX'self.l = 'XXX'self.cna = 'XXXX' def get_pro(self):get_pro_list = self.post_city.find({})for get_pro in get_pro_list[9:]:print('begin......{}'.format(get_pro['pro_name']))pro_name = get_pro['pro_name']for every_city in get_pro['city_list']:choose_city = every_citycity_name = choose_city['city_name']print('begin city ....{}'.format(city_name))city_adcode = choose_city['city_adcode']# 1获取城市所有区及美食二级分类show_url = 'https://www.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=17&city={}&geoobj=121.9098|25.510585|111.923414|24.516816&_src=around&keywords=美食'.format(city_adcode)headers = self.get_headers(city_adcode)show_json = self.request_url(show_url,headers)# print('11111',show_json)if show_json:# 区分类area_list = []if 'bizAreaData' in show_json:districts = show_json['bizAreaData']['districts']for k in districts:area_dict = {}area_dict['area_name'] = k['name']area_dict['area_value'] = k['districts']area_list.append(area_dict)self.deal_areas(pro_name, city_name, city_adcode, area_list)else:print('该市并未有区......')area_list = []self.deal_areas(pro_name, city_name, city_adcode, area_list)else:print('{} 未获取到 json数据.......'.format(city_name))def deal_areas(self,pro_name,city_name,city_adcode,area_list):classify_list = Config.classify_listif len(area_list) > 0:for j in area_list:area_name = j['area_name']area_site_list = j['area_value']for k in area_site_list:if re.search('全部',k['name']):continueelse:area_site_adcode = k['adcode']area_site_name = k['name']for m in classify_list:classify_name = m['classify_name']classify_value = m['classify_value']print('{}...{}..{}.get shop {} begin.....'.format(city_name, area_name, area_site_name,classify_name))self.deal_information(pro_name,city_name,city_adcode,area_name,area_site_adcode,area_site_name,classify_name,classify_value)else:print('该市分区为0..........')area_name = ''area_site_adcode = ''area_site_name = ''classify_list2 = Config.classify_list2for m in classify_list2:classify_name = m['classify_name']second_classify_list = m['second_list']if len(second_classify_list) > 0:for l in second_classify_list:print('{}...{}..{}.get shop {} begin.....'.format(city_name, area_name, area_site_name,classify_name))self.deal_other_information(pro_name, city_name, city_adcode, area_name, area_site_adcode, area_site_name,classify_name,l)else:print('{}...{}..{}.get shop {} begin.....'.format(city_name, area_name, area_site_name,classify_name))self.deal_other_information(pro_name, city_name, city_adcode, area_name, area_site_adcode,area_site_name,classify_name, '')def deal_other_information(self,pro_name, city_name, city_adcode, area_name, area_site_adcode, area_site_name,classify_name,second_classify_str):if second_classify_str:second_un = parse.quote(second_classify_str)else:second_un = parse.quote(classify_name)geoobj = parse.quote('')i = 1a = 0while True:url = 'https://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum={}&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=14.18&city={}&geoobj={}&keywords={}'.format(str(i),city_adcode,geoobj,second_un)headers = self.get_headers(city_adcode)resp_json = self.request_url(url,headers)if resp_json:shop_total = int(resp_json['data']['total'])print('总共{}个店铺'.format(resp_json['data']['total']))if 'poi_list' in resp_json['data']:now_num = len(resp_json['data']['poi_list'])a += now_numelse:breakprint('当前已爬取{}个店铺'.format(a))if shop_total > 0:for j in resp_json['data']['poi_list']:shop_id = j['id']shop_name = j['name']# print(shop_name)shop_address = j['address']# print(shop_address)shop_tel = j['tel']shop_latitude = j['latitude']shop_longitude = j['longitude']if 'value' in j['domain_list'][8]:second_classify = j['domain_list'][8]['value']else:second_classify = ''self.save_info(pro_name, city_name, area_name, area_site_name, classify_name, shop_id, shop_name,shop_address, shop_tel, shop_latitude, shop_longitude, second_classify)else:print('shop num is none.......')breakelse:print('{}...{}..{}.get shop type  information failed'.format(city_name, area_name, area_site_name))breaki += 1def deal_information(self,pro_name,city_name,city_adcode,area_name,area_site_adcode,area_site_name,classify_name,classify_value):geoobj = parse.quote('')classify_data = parse.quote('business_area_flag=1;adcode={};custom=business_area:{}+{}+sort_rule=5;reserved_keywords=true'.format(area_site_adcode,area_site_name,classify_value))user_loc = parse.quote('')need_params = 'city={}&geoobj={}&_src=around&classify_data={}&user_loc={}&keywords=%E7%BE%8E%E9%A3%9F'.format(city_adcode, geoobj, classify_data, user_loc)i = 1a = 0while True:need_url1 = 'https://www.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum={}&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=17&'.format(str(i))every_url = need_url1 + need_paramsheaders = self.get_headers(city_adcode)resp_json = self.request_url(every_url,headers)# print('22222',resp_json)if resp_json:shop_total = int(resp_json['data']['total'])print('总共{}个店铺'.format(resp_json['data']['total']))if 'poi_list' in resp_json['data']:now_num = len(resp_json['data']['poi_list'])a += now_numelse:breakprint('当前已爬取{}个店铺'.format(a))if shop_total > 0:for j in resp_json['data']['poi_list']:shop_id = j['id']shop_name = j['name']shop_address = j['address']shop_tel = j['tel']shop_latitude = j['latitude']shop_longitude = j['longitude']if 'value' in j['domain_list'][8]:second_classify = j['domain_list'][8]['value']else:second_classify = ''self.save_info(pro_name,city_name,area_name,area_site_name,classify_name,shop_id,shop_name,shop_address,shop_tel,shop_latitude,shop_longitude,second_classify)else:print('shop num is none.......')breakelse:print('{}...{}..{}.get shop type  information failed'.format(city_name,area_name,area_site_name))breaki += 1def get_headers(self,city_adcode):headers = {'Accept': '*/*','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Host': 'www.amap.com','X-Requested-With': 'XMLHttpRequest','User-Agent': random.choice(Config.pc_user_agent_list),'Referer': 'XXXXXXXXXXXXXX'.format(city_adcode),isg={}; l={}'.format(cna,# isg, l)'Cookie': 'cna={}; _uab_collina=XXXXXXXX;isg={}; l={}'.format(cna,isg,l)}return headersdef request_url(self,url,headers):i = 0while i <=5:if i == 5:print('retry five times {}'.format(url))logging.info("get url five times failed %s" % url)return {}try:resp = requests.get(url, headers=headers, proxies=Config.proxies, verify=False,timeout=2)# print(resp.text)resp_json = json.loads(resp.text)if 'status' in resp_json:return resp_jsonelse:print('被反爬啦,重新尝试了....{}次'.format(str(i)))i +=1continueexcept Exception as f:print('get json data failed {}'.format(str(f)))i += 1

来源:高德地图美食爬虫_高德,cookie-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字身份发展趋势前瞻:身份韧性与安全

身份韧性与安全是身份与访问管理IAM发展的重要趋势&#xff0c;身份既是防御者的盾牌&#xff0c;也是攻击者的目标。面对日益复杂的网络威胁和不断增长的身份盗窃风险&#xff0c;身份韧性与安全不仅仅涉及产品的防御能力&#xff0c;还包括应对突发事件、快速恢复的弹性和灵活…

QChart中柱形图的简单使用并实现【Qt】

预备工作 如果qt没下载去下载一个&#xff0c;下载太慢了可以试试它[点击跳转]  (https://blog.csdn.net/qq_19319481/article/details/131655379)。   如果已经下载了qt发现自己的组件中没有QCharts&#xff0c;可以去试试它点击跳转。 都搞定了以后在pro文件里面添加QT …

智能语音机器人智能在哪里?AI人工智能电话机器人部署

随着科技的不断进步&#xff0c;人工智能已经成为了我们生活中不可或缺的一部分。AI人工智能机器人电话正是其中的一种形式&#xff0c;可以帮助企业或组织更好地实现电话营销的目标&#xff0c;那么智能语音机器人智能在哪里?我们来看看&#xff1a; 智能语音机器人&#xf…

UI自动化测试 —— CSS元素定位实践!

前言 自动化测试元素定位是指在自动化测试过程中&#xff0c;通过特定的方法或策略来准确识别和定位页面上的元素&#xff0c;以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

Unity 使用Netcode实现用户登录和登出

Unity之NetCode for GameObjets 基本使用 说明思路相关API代码实现Tips 说明 最近项目需要联机&#xff0c;项目方案选用Unity提供的NetCode for GameObjets&#xff08;以下简称NGO&#xff09;&#xff0c;踩了不少坑&#xff0c;本文不介绍基础使用&#xff0c;围绕双端&…

专业网页设计服务重要是什么

当在搜索引擎中键入“网页设计”&#xff0c;您将获得超过2000万个相关结果。在如此众多的网站制作公司中&#xff0c;应该如何做出明智的选择呢&#xff1f;首先&#xff0c;让我们深入探讨一下网页设计的重要性。网站设计需要综合各种不同领域的专业知识&#xff0c;它是一个…

【UART异步串口协议及verilog实现】

UART异步串口协议 1 UART1.1 数据格式1.2 波特率 2 UART的发送和接收模块2.1 uart发送模块2.2 uart的接收模块 【博客首发于微信公众号《 漫谈芯片与编程》】 本篇文章介绍常用的芯片外围低速协议&#xff1a;UART&#xff1b; 1 UART UART是异步串行传输协议&#xff0c;即…

彻底解决idea不识别java项目

需求背景 下载了一个java swing的项目,通过idea导入后,项目无法识别。打开java文件,也不会报错,也不编译。 无法识别效果图 可以看到左侧的菜单,项目是没有被识别。 打开java文件,可以看到没有识别,java的图标也没有出现。 解决方法 1、打开Project Structure 2、修改…

仿真APP助力汽车零部件厂商打造核心竞争力

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。 在汽车产业快速发展的今天&#xff0c;汽车零部件…

【Nginx】前端项目开启 Gzip 压缩大幅提高页面加载速度

背景 Gzip 是一种文件压缩算法&#xff0c;减少文件大小&#xff0c;节省带宽从而提减少网络传输时间&#xff0c;网站会更快更丝滑。 // nginx roothcss-ecs-1d22:/etc/nginx# nginx -v nginx version: nginx/1.24.0// node ndde v18.20.1// dependencies "vue": …

【Linux】从零开始使用多路转接IO --- epoll

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 epoll的作用和定位2 epoll 的接口3 epoll工作原理4 实现epollserverV1 1 epoll的作用和定位 之前提过的多路转接方案select和poll 都有致命缺点…

CSS中常见的两列布局、三列布局、百分比和多行多列布局!

目录 一、两列布局 1、前言&#xff1a; 2. 两列布局的常见用法 两列布局的元素示例&#xff1a; 代码运行后如下&#xff1a; 二、三列布局 1.前言 2. 三列布局的常见用法 三列布局的元素示例&#xff1a; 代码运行后如下&#xff1a; 三、多行多列 1.前言 2&…

DCRNN解读(论文+代码)

一、引言 作者首先提出&#xff1a;空间结构是非欧几里得且有方向性的&#xff0c;未来的交通速度受下游交通影响大于上游交通。虽然卷积神经网络&#xff08;CNN&#xff09;在部分研究中用于建模空间相关性&#xff0c;但其主要适用于欧几里得空间&#xff08;例如二维图像&a…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…

Unreal5从入门到精通之如何解决在VR项目在头显中卡顿的问题

前言 以前我们使用Unity开发VR,Unity提供了非常便利的插件和工具来做VR。但是由于Unity的渲染效果不如Unreal,现在我们改用Unreal来做VR了,所有的VR相关的配置和操作都要重新学习。 今天就来总结一下,我在开发VR过程中碰到的所有问题。 1.编辑器,以VR运行 默认运行方式…

centos7 kafka高可用集群安装及测试

前言 用三台虚拟机centos7 搭建高可用集群&#xff0c;及测试方法 高可用搭建的方法&#xff0c;参考&#xff1a;https://blog.csdn.net/u011197085/article/details/134070318 高可用搭建 1、安装配置zookeeper集群 下载zookeeper 注&#xff1a;zookeeper链接如果失效&a…

Redis(2):内存模型

一、Redis内存统计 工欲善其事必先利其器&#xff0c;在说明Redis内存之前首先说明如何统计Redis使用内存的情况。 在客户端通过redis-cli连接服务器后&#xff08;后面如无特殊说明&#xff0c;客户端一律使用redis-cli&#xff09;&#xff0c;通过info命令可以查看内存使用情…

C++笔试题之实现一个定时器

一.定时器&#xff08;timer&#xff09;的需求 1.执行定时任务的时&#xff0c;主线程不阻塞&#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用&#xff0c;一个timer需要能够管理多个定时任务&#xff0c;所以timer要支持增删任务…

0.STM32F1移植到F0的各种经验总结

1.结构体的声明需放在函数的最前面 源代码&#xff1a; /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructu…

在Microsoft Outlook日历中添加多个时区

在Microsoft Outlook日历中添加多个时区 1.单击Outlook中的文件选项卡&#xff0c;单击选项 2.左侧菜单中选择日历 3.向下滚动到时区部分&#xff0c;并标记当前时区&#xff0c;比如China 4.选中“显示第二个时区”框 5.选择第二个时区并给它一个标签&#xff0c;比如Germa…