首页 > 其他分享 >selenium高级用法:获取经纬度

selenium高级用法:获取经纬度

时间:2022-12-01 11:01:49浏览次数:40  
标签:浏览器 经纬度 random selenium 用法 点击 import find browser





导言

获取经纬度的方法有很多,通过调用某地图API,模块geopy。但这两种方式都有一定的缺点,调用某地图API访问次数有限,使用模块geopy虽然次数不受限制,但是这个模块只能精确到镇,如果地点再精确一点就可能会出现问题。今天我们来一点不一样的,直接使用selenium获取经纬度!

我们先进百度地图开放平台,进去之后不需要登录,找到开发文档,然后找到工具支持,最后找到坐标拾取器,如图所示。

selenium高级用法:获取经纬度_正则表达式

点击坐标拾取器,会跳转到一个新的网页,如图所示,网址:http://api.map.baidu.com/lbsapi/getpoint/index.html。

selenium高级用法:获取经纬度_正则表达式_02

具体怎么使用可以看看右边的官方教程,下面我直接以获取上海市所有公司(其实也不是所有,因为可能有些公司百度地图没有收录)的经纬度为例,来讲解一下不通过百度地图API从百度地图获取经纬度的过程。

实现思路


首先我们需要有一个实现的思路,我们先点击“更换城市“,然后选择并点击“上海“,接着输入关键字“公司”,最后点击“百度一下“,执行完上述过程之后最终页面的呈现效果如图所示。

selenium高级用法:获取经纬度_chrome_03

可以发现右边有我们想要的数据,我们把鼠标移到其中一条数据上,右击,审查元素看一看,如图所示。

selenium高级用法:获取经纬度_正则表达式_04

接着就是写出正则表达式,我们可以发现它有换行,既然如此就需要使用正则修饰符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

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

selenium高级用法:获取经纬度_正则表达式_05

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

今天的文章有不懂的可以加群,群号:822163725,备注:小陈学Python,不备注可是会被拒绝的哦~!,备注:小陈学Python,拉你进微信交流群,不备注是不可能拉进群,除非经过我的考验!

selenium高级用法:获取经纬度_数据_06

selenium高级用法:获取经纬度_正则表达式_07

标签:浏览器,经纬度,random,selenium,用法,点击,import,find,browser
From: https://blog.51cto.com/u_15829940/5901384

相关文章

  • 032shell数组用法及多行注释
    一、Shell中将分隔符的字符串转为数组的常用方法[root@host~]#str="ONE,TWO,THREE,FOUR"[root@host~]#arr=(`echo$str|tr','''`)[root@host~]#echo${arr......
  • python中getopt()函数用法
    通过getopt模块中的getopt()方法,我们可以获取和解析命令行传入的参数一、函数用法getopt(args,shortopts,longopts=[])args:固定写法sys.argv[1:]shortopts:短参......
  • 原码反码和补码的区别及用法笔记
    之前学习原码、反码、补码的时候就学的很懵,知道反码和补码怎么算的,但是不知道有什么用。今天看了几个视频,虽然有举例,但是自己换了个数就算不出来了。后来终于弄明白了。......
  • linux命令watch的用法
      前言是不是经常会遇到需要观察某个内容,为了持续观察而反复执行某个命令?也许你可以写一个简单的脚本帮你反复执行,但是有更简单方便的方法为什么不用呢?今天要介绍的便......
  • 上帝与集合的正确用法——欧拉定理
    上帝与集合的正确用法题目描述根据一些书上的记载,上帝的一次失败的创世经历是这样的:第一天,上帝创造了一个世界的基本元素,称做元。第二天,上帝创造了一个新的元素,称作\(......
  • Selenium中怎样解决输入框带有readonly属性或存在日历框问题
    1、js='document.getElementById("train_date").removeAttribute("readonly");driver.execute_script(js)2、pag=driver.find_element_by_xpath('//*[@id="pane......
  • Linux中&&和&,|和||用法及区别详解!
    在使用Linux命令时,我们往往可以一行执行多条命令,或者有条件的执行下一条命令,对于刚接触Linux命令时,特殊符号绝对是最困扰的事情之,本篇文章将为大家详细介绍下&&和&,|和||的......
  • Python 中 -m 的典型用法、原理解析与发展演变
    在命令行中使用Python时,它可以接收大约20个选项(option),语法格式如下:python[-bBdEhiIOqsSuvVWx?][-ccommand|-mmodule-name|script|-][args]本文想要聊聊比较......
  • Solidity 函数及修改器(modifier)的用法
    //SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractFunction{//多返回值函数functionreturnMany()publicpurereturns......
  • Solidity中view和pure的用法
    getter类型的函数可以被view或者pure修饰。view修饰的函数不能改变状态变量。pure则既不能改变状态变量,也不取读取状态变量。//SPDX-License-Identifier:MITpragma......