Python爬虫实战

您所在的位置:网站首页 百度地图数据存储位置没有了 Python爬虫实战

Python爬虫实战

2023-09-15 08:13| 来源: 网络整理| 查看: 265

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 在这里插入图片描述

4. 导入百度地图工具

百度地图官方工具:http://lbsyun.baidu.com/jsdemo.htm#c1_19 选择加载海量点 在这里插入图片描述

进行如下操作: 在这里插入图片描述 实例: 在这里插入图片描述

再点击上面的运行,即可出效果图。 在这里插入图片描述

5. 结语 要用selenium进入内嵌的iframe抓取文本。在百度地图API开发页面进行开发者认证,并且得到自己的AK,具体操作自行百度,很快的。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3