python 乡镇轮廓 高德_Python爬虫终极解决方案-以获取高德地图小区边界为例
0 前言
本文工具使用anaconda3.5+chrome
一般爬虫分为非可视化爬虫和可视化爬虫。
①非可视化爬虫:通过抓包获取数据接口,使用requests、urlib2、urlib3直接请求页面源码或异步加载的JSON数据。
②可视化爬虫:使用selenium工具模拟人为操作,获取页面源码解析数据。
1 高德地图
最近在研究高德地图小区边界经纬度坐标穿获取的问题,本来想先尝试使用requests,发现高德的反爬措施比一般网站都要严,单独通过非可视化爬虫请求基本上无法获取到想要的数据。
抓包
打开高德地图,在搜索框输入一个小区,如重庆大学B区,如下图所示。
我们发现了是通过这个接口https://ditu.amap.com/detail/get/detail?id=B0017819Q6 GET方法获取到的异步JSON数据,有我们想要的经纬度坐标串。但是想要自动获取有两个前提条件,一是需要知道兴趣面的ID,如上面的重庆大学B区ID B0017819Q6;你可以尝试只请求上述连接,你会发现很快就会失效, 即使携带现有的cookie也不一定能请求成功。因此二是如何能保证高德地图能返回正常的数据。
2 准备工作
SELENIUM
考虑到获取小区边界的事是一劳永逸,数据总量不大,可以降低请求频率。直接使用selenium工具模拟人为操作。
① 安装selenium
#安装selenium
pip install selenium
② 下载chromedriver
ChromeDriver仓库下载对应的版本,chrome版本在浏览器network任一请求中请求头USER-AGENT中可以查看。
然后将chromedriver.exe拷贝至anaconda安装目录下。
browsermob-proxy
BrowserMob Proxy,简称 BMP,它是一个 HTTP 代理服务,利用它我们可以截获 HTTP 请求和响应内容,另外还可以把 Performance data 输出成一个 HAR 文件。
① 下载地址,下载完后解压。
② browsermobproxy为Java开发的代理工具,因此还需要安装Java坏境,此处略过。
3 DEMO
代码
import random
import re
import time
from browsermobproxy import Server
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
server = Server(r'C:\Users\black\Downloads\browsermob-proxy-2.1.4-bin\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
server.start()
proxy = server.create_proxy()
chrome_options = Options()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy)) # 加代理抓包
chrome_options.add_argument('--ignore-certificate-errors') # 忽略无效证书的问题
driver = webdriver.Chrome(chrome_options=chrome_options)
base_url = 'https://www.amap.com/'
proxy.new_har("amap", options={'captureHeaders': True, 'captureContent': True})
driver.get(base_url)
input = driver.find_element_by_id('searchipt') #获取输入框
input.clear() #清空输入框
input.send_keys("重庆大学B区") #输入关键词
time.sleep(random.randint(2, 5))
select = driver.find_elements_by_class_name("autocomplete-suggestion") #获取联想词框
time.sleep(random.randint(2, 5))
select[0].click() #点击出来的第一个联想词
current_url = driver.current_url
time.sleep(5)
result = proxy.har
print(result)
hhh = re.findall('(\d{3}\.\d{6},\d{2}\.\d{6}_)', str(result)) #提取坐标串
print(hhh)
server.stop()
driver.quit()
打印出来的result如下图所示:
通过第一张图片的坐标串在上述结果中搜索,发现只有一个坐标串,每个经纬度之间有“_”隔开。而且点状数据是不存在该形式坐标串的。
解析的坐标串列表组合一下就OK了。
说明
① 必须要添加chrome_options.add_argument('--ignore-certificate-errors') 参数,否则每请求一个网页,都会提示“您的链接不是私密链接”。
② 可以通过请求的url筛选出请求明细,用解析json的方式逐层获取坐标串,但这里选择用正则表达式去提取坐标串更为简单。
4 总结
爬虫这东西只要显示在浏览器上的东西基本都是可以抓取的(但是要注意尺度,不要给别人服务器太大压力),但是往往有非常的反爬措施,结合fiddler4这种代理抓包软件联想应该能找到一个直接将chrome浏览器所有的请求记录全部导出来的方法,可以解决几乎所有的数据获取问题。
python 乡镇轮廓 高德_Python爬虫终极解决方案-以获取高德地图小区边界为例相关推荐
- python批量爬取小网格区域坐标系_Python爬虫实例_利用百度地图API批量获取城市所有的POI点...
上篇关于爬虫的文章,我们讲解了如何运用Python的requests及BeautifuiSoup模块来完成静态网页的爬取,总结过程,网页爬虫本质就两步: 1.设置请求参数(url,headers,co ...
- 高德地图小区边界获取(2017.05)
单个小区边界的获取: chrome打开高德地图,缩放到相应区域 打开控制台,搜索小区名,使得地图上就会出现小区正确的轮廓 控制台network中有个poiInfo的请求,打开这个请求,就会看到相应数据 ...
- python 乡镇轮廓 高德_Python调用高德地图API爬取经纬度
认识高德地图API 比起普通的静态网页爬虫,爬高德地图的麻烦之处在于API中存在参数.这需要我们首先要对高德地图API有个基本的了解. 登录高德地图API网站,点击"开发文档",找 ...
- python 乡镇轮廓 高德_基于高德地图api和Python的区县地理边界坐标提取
在工作中,经常想用到类似于地热图的方式进行数据展示,奈何工作环境是内网,无法在线进行地图关联,没办法,只好自己想办法上网找边界坐标. 查了很多文档和费心以后,最终发现高德地图api的方法和方式最简单, ...
- python 乡镇轮廓 高德_百度高德地图小区景点边界轮廓实现
经常的我们在使用地图功能时,会发现在选择一个小区或者一个热门景点的时候,地图上面会给出其边界轮廓,能够方便我们知道其范围大小,有时候在我们使用地图组件的时候,也会面临着类似的需求.比如在地图上面标识出 ...
- python用法查询笔记_Python爬虫学习笔记(三)
handler处理器自定义 - Cookies && URLError && json简单使用 Cookies: 以抓取https://www.yaozh.com/为例 ...
- python获取网站代码_python爬虫1——获取网站源代码(豆瓣图书top250信息)
# -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...
- python二手交易平台代码_PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)...
说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...
- python获取登录按钮_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。
昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...
- python 代理ip验证_python爬虫成长之路(二):抓取代理IP并多线程验证
上回说到,突破反爬虫限制的方法之一就是多用几个代理IP,但前提是我们得拥有有效的代理IP,下面我们来介绍抓取代理IP并多线程快速验证其有效性的过程. 一.抓取代理IP 提供免费代理IP的网站还挺多的, ...
最新文章
- Java SPI 源码解析及 demo 讲解
- 通过js让页面中的元素上下居中的写法
- C++ 容器适配器priority_queue的使用及实现
- vscode 国内镜像快速下载
- 【shell】echo不显示变量中的多个空格
- Golang map的底层实现
- [导入]玩 VSX 第一步,创建VsPkg
- 网络安全实验室 综合关 解析
- windown+cpu+Keras/Tensorflow+python+yolo3训练自己的数据集
- JavaScript混淆器
- 免费一年VPS,digitalocean加上GitHub学生包
- 基于java SSM框架的医院体检管理系统
- 计算机中完成全选的快捷键,怎么全选-很实用!word中全选的快捷键介绍及使用方法...
- 读书笔记软件调试之道 :问题的核心-重现问题
- Springboot+学生作业管理系统 毕业设计-附源码251208
- 全球及中国电动汽车产业产销规模与十四五发展方向调研报告2022版
- IBM System x3650 M5 安装 windows Server 2012系统经验
- 嵌入式linux和桌面linux的区别
- Cocos2d-x 手游聊天系统Demo实现(Lua实现)
- bootstrap网格设置等高度