前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >selenium高级用法:获取经纬度

selenium高级用法:获取经纬度

作者头像
不可言诉的深渊
发布2019-07-26 17:30:28
发布2019-07-26 17:30:28
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

导言

获取经纬度的方法有很多,通过调用某地图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>'。然后就是匹配网页源代码,筛选出我们想要的信息。其实还没完,我们还是把鼠标移到右边某一条数据,滚轮滚到底,会发现它是分页显示的,我们需要一直不停的点击下一页,把每一页的数据都拿到!实现思路就是这样,下面动手开始编码。

具体实现

有了思路,代码实现起来就非常简单,我就直接给出源代码,每一行都有注释,配合着注释和上面的实现思路,大家应该能看懂代码!

代码语言:javascript
代码运行次数:0
复制
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

最后附上部分运行结果,如图所示。

结果很多,我没有控制输出格式,大家可以自己控制一下输出格式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档