Python爬虫实战 |
您所在的位置:网站首页 › 百度地图数据存储位置没有了 › Python爬虫实战 |
1.前言
由于本科毕设做相关问题,需要充电站位置分布,因此顺带爬取了一下分布。主要库:requests pyquery,还有selenium 2. 爬取充电站地理位置目前我只找了这个网址可以读取全部充电站位置的,其他只能搜索个别充电站,难以爬取全部充电站。 一开始的时候对网页进行爬取,很轻松就得到了内容,但打印出来发现并没有我们想要的信息,都是一些琐碎的文字。于是想到应该是有反爬处理,仔细看了一下代码,发现了一个“iframe”,也是一个常见的反爬手段。 这里比较好的方法就是使用selenium,用switch进入这个frame然后把内容爬出来。 import requests import re from pyquery import PyQuery as pq from selenium import webdriver browser = webdriver.Chrome(r'。。。') kv = {'user-agent':'Mozilla/5.0'} url = "http://admin.bjev520.com/jsp/beiqi/pcmap/do/pcMap.jsp?" latter = "name=上海" browser.get(url+latter) browser.switch_to.frame('left') # iframe标签的name属性,最重要的一步 doc = pq(browser.page_source) items = doc.find('.news-l .news-ul li a').items() name = [] pos = [] urls = [] for item in items: urls.append("http://admin.bjev520.com" + item.attr('href')) name.append(item.find('p').text()) pos.append(item.find('span').text())这样就把充电站名字和地理位置存储下来了。 3. 获取经纬度接下来可以利用百度地图的API将文字转换成经纬度。利用正则表达式可以轻松的把经纬度数值提取出来。 import json from urllib.request import urlopen, quote import requests def getlnglat(address): url = 'http://api.map.baidu.com/geocoding/v3/' output = 'json' ak = '' # 百度地图ak,具体申请自行百度 address = quote(address) # 由于本文地址变量为中文,为防止乱码,先用quote进行编码 uri = url + '?' + 'address=' + address + '&output=' + output + '&ak=' + ak + '&callback=showLocation' r = requests.get(uri) tx = r.text lng = re.findall(r'"lng":(\d+.\d+)', tx) lat = re.findall(r'"lat":(\d+.\d+)', tx) if lat: return lat[0], lng[0] # 纬度 latitude , 经度 longitude , else: return (0, 0)这里由于部分地址无法找到,会返回错误,因此笔者简单的将其返回(0,0),这样就可以得到所有的经纬度了。 PS:这里的uri自行参考百度官方文档:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding 百度地图官方工具:http://lbsyun.baidu.com/jsdemo.htm#c1_19 选择加载海量点 进行如下操作: 再点击上面的运行,即可出效果图。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |