百度地图POI数据采集方案以及开发环境搭建

#获取百度地图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
			分类标签:
3.根据分类 分类typeitem href 得到具体这个分类中的 地名信息集合 address_items 具体地址所在标签:
for循环 分页 从第2页开始(当前页就是第一页了):
再来一次具体分类信息检索(写成单独方法) 最终表结构如下 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) (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

你可能感兴趣的:(Python,爬虫,poi,百度)