#获取百度地图POI数据一(详解百度返回的POI数据) http://lbsyun.baidu.com/index.php?title=webapi
数据量标准可以参看 http://lbsyun.baidu.com/apiconsole/key#/home 额度管理=>开发者权益
余慕白 博客 https://www.cnblogs.com/yumubaime/p/7172954.html
1.模拟HTTP请求的方式获取其上的POI数据
打开网页的调试面板可以清楚的看到这些请求 ,以及服务器返回的数据 ,这些数据都是JSON格式的
在地址栏中输入请求的url
http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=%E4%BA%BA%E5%90%8D%E5%B9%BF%E5%9C%BA&c=289&src=0&wd2=&sug=0&l=17&b=(13522376.995,3640442.635;13522548.995,3641718.635)&from=webmap&biz_forward={%22scaler%22:1,%22styles%22:%22pl%22}&sug_forward=&tn=B_NORMAL_MAP&nn=0&u_loc=13506522,3642064&ie=utf-8&t=1500039457397
之后便能看到返回的JSON数据 将这些JSON文本复制到JSON在线校验的网站(如 www.json.cn)上可以更清楚的看到其中的信息
要想通过程序模拟构建url来发送http请求 ,就需要先了解url的参数构成 ,经过本人的多次尝试 ,将url参数减少为
http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=人民广场&c=289&pn=0
http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=丽江市居民小区&c=114&pn=0
http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=红谷坊复合餐厅&c=131&pn=0
关键词 具体小分类+地址名(居民小区+八河)
最重要的就是最后三个参数
wd是搜索的关键词
c是搜索区域对应的城市编码,上海市对应的就是289
(百度地图城市名称-城市代码(cityCode)关系对照文本 http://lbsyun.baidu.com/index.php?title=open/dev-res)
pn是返回数据的页码
不同的搜索关键词返回的数据的页数是不同的 因为百度会返回很多相关的信息(POI数据)
2.获取尽可能多的POI数据 需要准备尽可能多的搜索关键字,那么这些关键字如何得来呢?
http://poi.mapbar.com/这个网站有全国各地的POI数据 对各个城市的POI数据都有归类
3.百度墨卡托坐标转换为经纬度坐标 自己申请ak AC818d0cec3d6e8bb07b715a549741a7
http://api.map.baidu.com/geoconv/v1/?coords=" + x / (100.0) + "," + y / (100.0) + "&from=6&to=5&ak=AC818d0cec3d6e8bb07b715a549741a7";
http://api.map.baidu.com/geoconv/v1/?coords=13523361.19,3641423.43&from=6&to=5&ak=AC818d0cec3d6e8bb07b715a549741a7
可以替换为代码 不使用API 因为API一天只能转换10条数据
4. 289,上海市
分类
关键字
poi解析获取
百度墨卡托坐标转换为百度经纬度坐标
5.开发环境搭建 vs code + Anaconda(python) + scrapy
Anaconda:python的基础库,官网下载 多点击几次就可以下载了 不需要注册用户名
官网:https://www.anaconda.com/products/individual
清华源:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 比较快
安装参看 (推荐) Anaconda + VSCode 最详细教程 https://www.jianshu.com/p/ef1ae10ba950
勾选 Alls Users
勾选 Add Anaconda to the system PATH environment variable 如果之前安装过python 勾选会报错 冲突
如果未勾选添加环境变量 则手动添加
C:\ProgramData\Anaconda3;
C:\ProgramData\Anaconda3\Scripts;
C:\ProgramData\Anaconda3\Library\bin;
C:\ProgramData\Anaconda3\python.exe
如果之前没有安装 VSCode,可以在 Anaconda 安装过程中选择安装
输出控制台乱码问题解决
https://blog.csdn.net/qq_44735604/article/details/105954842
Anaconda + vs code 的 scrapy环境搭建
(推荐)Anaconda + VSCode 最详细教程 https://www.jianshu.com/p/ef1ae10ba950
补充教程 https://blog.csdn.net/qq_40922859/article/details/100855206
打开建好的爬虫文件夹(作为项目所在地)
vs终端打开(目录路径确认好)
在终端中创建爬虫项目:scrapy startproject baidupoispider
具体爬虫文件
scrapy genspider baidupoi map.baidu.com
//释: 生成 爬虫名字 要爬的域名
开启爬虫
scrapy crawl xicidaili
程序逻辑
#爬取图吧网站的地址
1.爬取所有城市信息 地址+城市名称(热门城市和非热门城市)
图吧网站提供378城市(自己查询的)
百度城市编码387个
以城市为分隔库的标准 每个城市数据一个sqlite库文件 不至于文件太大 数据搬迁也方便
最后可以for循环启动378个城市爬虫(下面具体实现城市爬虫)即可
2.先以一个城市为例 city北京市 cityCode131 https://poi.mapbar.com/beijing/
获取分类信息:大分类root_type(旅游景点),具体分类typeitems(游乐园、植物园、......))
typeitems:
cityCode cityName root_type(旅游景点),具体分类typeitem(游乐园),具体分类(游乐园)typeitem href
分类标签:<div class="isortRow">
3.根据分类 分类typeitem href 得到具体这个分类中的 地名信息集合 address_items
具体地址所在标签:<div class="sortC">
for循环 分页 从第2页开始(当前页就是第一页了):<div class="sortPage cl" id="pageDiv" style="width:780px;">
再来一次具体分类信息检索(写成单独方法)
最终表结构如下
address_items:
cityCode ,cityName ,root_type(旅游景点,......),具体分类typeitem(游乐园,......),具体分类(游乐园)typeitem href ,address_name ,lon,lat
4.存放到sqlite表中
scrapy 相关设置
0.多线程爬虫|Scrapy框架
https://www.jianshu.com/p/1a894fe4a93c
1.settings.py
相关默认设置
https://doc.scrapy.org/en/latest/topics/settings.html#concurrent-items
# Obey robots.txt rules
ROBOTSTXT_OBEY = False #True
2.Crawled (200) <GET https://poi.mapbar.com/beijing/> (referer: None)
表示获取地址内容成功了
3.xpath选择元素时
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
4.yield scrapy.Request详解
https://zhuanlan.zhihu.com/p/40290931
5.数据类型转换
https://www.cnblogs.com/klb561/p/9211268.html
6.js动态生成页面 无法直接获取如何是否还有下一页
如果页码超过了实际页码 则此次页码请求自动终止,不会再次进入information_analysis方法
如果当前有分页继续进行当前方法调用 js动态生成了页码 所以获取不到只能页码第加
7.数据防篡改 深度copy ??????????????????????????
我目前的理解是 在进入到pipline之前的过程 都是线程独立和安全的 所以数据 篡改 应该只出现在pipline中处理的item上
我的csdn 登录状态
https://editor.csdn.net/md/?articleId=89854794
https://editor.csdn.net/md/?articleId=97549472
8.Scrapy中response属性以及内容提取
https://www.lagou.com/lgeduarticle/77001.html
9.
方法二:通过截取字符串相加的方式如下所示(该方式效率更高):
新的字符串 = 老字符串[:要替换的索引位置] + 替换成的目标字符 + 老字符串[要替换的索引位置+1:]
>>> a = "01234567"
>>> a = a[:1] + 'a' + a[2:]
>>> print a
0a234567
10.需要UserAgent 和 ip代理
https://blog.csdn.net/Lan_cer/article/details/87551871
https://zhuanlan.zhihu.com/p/29733174
11.sqlite表需要创建好
12.scrapy 从settings文件里获取值
from scrapy.utils.project import get_project_settings
class RandomUserAgent:
def process_request(self, request, spider):
settings=get_project_settings()
USER_AGENT_LIST=settings.getlist("USER_AGENT_LIST")
ua = random.choice(USER_AGENT_LIST)
request.headers.setdefault('User-Agent', ua)
13.使用vs code环境调试scrapy框架程序
https://blog.csdn.net/zhaomengszu/article/details/88885852
14.总是提示 参数类型不支持
其实是我的sql语句写发出错了 当中出现了 中文标点符号 分隔符 ‘,’
15.Python操作sqlite 报错:sqlite3.OperationalError: database is locked
python操作sqlite数据库时出现报错信息:
sqlite3.OperationalError: database is locked
查看网络资料后得知,是因为sqlite只支持单线程操作,所以如果此时其他软件等打开了这个数据库文件,当我们通过pycharm等编辑器进行操作的时候就会出现这个错误信息。
这时候,我们从数据库管理软件中关闭数据库链接即可进行下一步操作。
16.4:05
17.百度墨卡托坐标 转百度经纬度坐标算法
https://blog.csdn.net/sinat_34149445/article/details/100081478
18.断点续爬 ?????????????????????????????
https://www.cnblogs.com/Python-XiaCaiP/p/10268524.html
19.提速 线程数?????????????????????????????????
你想加大scrapy爬取的并发量、items的处理速度么?如果是的话,可以在settings.py上配置CONCURRENT_ITEMS、CONCURRENT_REQUESTS
https://doc.scrapy.org/en/latest/topics/settings.html#concurrent-items
20.【Scrapy】会导致整个线程阻塞的地方
http://www.caneman.cn/?p=895
21.scrapy请求队列:
https://blog.csdn.net/zf3419/article/details/84580329
{'address_lat': '0.0',
'address_lon': '0.0',
'address_name': '北京稻香·湖景酒店-会议厅',
'city_code': '131',
'city_name': '北京市',
'item_href': 'http://poi.mapbar.com/beijing/950/',
'item_sort': '北京市展览馆、会展中心',
'root_sort': '旅游景点'}
#根据图吧网站爬取的地址 进行百度地图地址详细信息获取
还是按照一个个城市来搞 分库存放
按照大分类进行 地址 location经纬度信息的获取
根据大分类生成多个爬虫 进行多进程的爬取 每个进程对应自己的数据库sqlite(单进程操作的数据库)
1.为每条关键词记录生成一个 url 需要citycode address_name关键词 例如http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=人民广场&c=289&pn=0
放到start_urls里面 生成请求队列
2.解析数据 获得需要的字段信息 创建item类
3.存放信息到的位置选择 txt
4.Scrapy中如何向Spider传入参数
https://blog.csdn.net/pengjunlee/article/details/90604736
5.python3
urllib.parse.urlencode
urllib.request.openurl
6.json
json.dumps(): 对数据进行编码。
json.loads(): 对数据进行解码。
7. 问题解决 参数判空问题
http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=%E5%8C%97%E4%BA%AC%E4%B8%9C%E5%B1%95%E5%AE%8F%E5%9B%BE%E9%92%A2%E9%93%81%E8%B4%B8%E6%98%93%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&c=131&pn=0
.py", line 88, in baidupoi_analysis
content=body_to_json['content']
KeyError: 'content'
2020-10-21 17:00:00
2020-10-22 07:59:26 [scrapy.core.engine] INFO: Spider closed (finished)
15个小时
8.百度经纬度纠偏
9.scrapy-redis断点续爬??????????????????????????
https://www.e1yu.com/8365.html
10.scrapy_redis增量爬取
https://www.jianshu.com/p/f03479b9222d
https://blog.csdn.net/weixin_42304193/article/details/92461582
11.动态ip代理+scrapy框架 实现ip防禁用
静态 https://zhuanlan.zhihu.com/p/29873560
动态 https://blog.csdn.net/u010978757/article/details/83409571
12.异步批量插入 sqlite3
百度地图POI数据采集方案以及开发环境搭建
最新推荐文章于 2024-06-02 16:01:40 发布