导言
获取经纬度的方法有很多,通过调用某地图API,模块geopy。但这两种方式都有一定的缺点,调用某地图API访问次数有限,使用模块geopy虽然次数不受限制,但是这个模块只能精确到镇,如果地点再精确一点就可能会出现问题。今天我们来一点不一样的,直接使用selenium获取经纬度!
我们先进百度地图开放平台,进去之后不需要登录,找到开发文档,然后找到工具支持,最后找到坐标拾取器,如图所示。
点击坐标拾取器,会跳转到一个新的网页,如图所示,网址:http://api.map.baidu.com/lbsapi/getpoint/index.html。
具体怎么使用可以看看右边的官方教程,下面我直接以获取上海市所有公司(其实也不是所有,因为可能有些公司百度地图没有收录)的经纬度为例,来讲解一下不通过百度地图API从百度地图获取经纬度的过程。
实现思路
首先我们需要有一个实现的思路,我们先点击“更换城市“,然后选择并点击“上海“,接着输入关键字“公司”,最后点击“百度一下“,执行完上述过程之后最终页面的呈现效果如图所示。
可以发现右边有我们想要的数据,我们把鼠标移到其中一条数据上,右击,审查元素看一看,如图所示。
接着就是写出正则表达式,我们可以发现它有换行,既然如此就需要使用正则修饰符S,让匹配任意字符的点可以匹配换行符。在使用修饰符S的情况下,下面我直接给出最终的正则表达式:r'<div id="no_\d".*?>\s+<a href="javascript:void\(0\)" title="(.*?)">.*?</a>\s+<p>地址:(.*?)\s+.*?坐标:(.*?)\s+</p>'。然后就是匹配网页源代码,筛选出我们想要的信息。其实还没完,我们还是把鼠标移到右边某一条数据,滚轮滚到底,会发现它是分页显示的,我们需要一直不停的点击下一页,把每一页的数据都拿到!实现思路就是这样,下面动手开始编码。
具体实现
有了思路,代码实现起来就非常简单,我就直接给出源代码,每一行都有注释,配合着注释和上面的实现思路,大家应该能看懂代码!
from selenium.webdriver import Chrome, ChromeOptions # Chrome:驱动浏览器,ChromeOptions:设置浏览器参数
from time import sleep # 设置等待,防止页面没有渲染完就去获取数据
from re import compile, S # compile:创建正则表达式对象,S:让匹配任意字符的点可以匹配换行符
from selenium.common.exceptions import NoSuchElementException # 当找不到元素时会引发NoSuchElementException异常,需要排除
from random import random # 设置随机等待时间,模拟人的操作速度
chrome_options = ChromeOptions() # 创建浏览器参数设置的对象
chrome_options.add_argument("--headless") # 设置参数--headless,运行时不会弹出浏览器
"""
将参数设置对象传递给浏览器驱动类的构造方法的默认参数options,实例化一个浏览器驱动对象
with关键字用来确保不管程序是不是有问题,每次都能关闭浏览器和浏览器驱动程序
"""
with Chrome(options=chrome_options)as browser:
browser.get("http://api.map.baidu.com/lbsapi/getpoint/index.html") # 发送请求
browser.find_element_by_id("curCityText").click() # 找到更换城市并点击
browser.find_element_by_name("上海市").click() # 找到上海并点击
sleep(random()+1) # 等待一段时间
browser.find_element_by_id("localvalue").send_keys("公司") # 找到输入框,输入关键字公司
browser.find_element_by_id("localsearch").click() # 点击百度一下进行搜索
pattern = compile(r'<div id="no_\d".*?>\s+<a href="javascript:void\(0\)" title="(.*?)">.*?</a>\s+<p>地址:(.*?)\s+'
r'.*?坐标:(.*?)\s+</p>', S) # 正则表达式
sleep(random()+1) # 等待一段时间
print(pattern.findall(browser.page_source)) # 从当前网页源代码筛选数据并输出
# 一直点击下一页,直到找不到下一页为止
while True:
try:
browser.find_element_by_link_text("下一页").click() # 找到下一页并点击
sleep(random()+1) # 等待一段时间
print(pattern.findall(browser.page_source)) # 从当前网页源代码筛选数据并输出
except NoSuchElementException:
break
最后附上部分运行结果,如图所示。
结果很多,我没有控制输出格式,大家可以自己控制一下输出格式。
本文分享自 Python机器学习算法说书人 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!