zoukankan      html  css  js  c++  java
  • Java+Selenium爬取高德POI边界坐标

    一、写在前面

          关于爬取高德兴趣点边界坐标网上有几篇文章介绍实现方式,总的来说就是通过https://www.amap.com/detail/get/detail传入POI的ID值获取数据,BUT,如果实际操作过就会发现,然并卵。

     

    二、主角出场

          这里提供一个思路具体怎么应用大家自己把握。Selenium作为Web应用程序自动化测试工具,通过WebDriver实现多种浏览器(包括Chrome、Firefox、IE、Edge等)访问网页、设置代理、设置缓存、切换选项卡,而且还能通过findElement方法类似WebMagic的文档操作功能。

          Selenium使用方法分三步

          1、引入pom依赖:

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>

          2、Web浏览器,目前支持的浏览器如图:

          3、下载Web浏览器对应的WebDriver;

     

    三、三部曲之谷歌浏览器

          1)安装谷歌浏览器,最好使用安装版的,用便携版可能会出现org.openqa.selenium.WebDriverException: unknown error: cannot find Chrome binary错误,需要设置谷歌浏览器主程序路径,代码如下:

    ChromeOptions options = new ChromeOptions();
    options.setBinary("Chrome的启动文件路径");
    WebDriver driver = new ChromeDriver(options);

          2)下载谷歌浏览器对应的WebDriver浏览器驱动程序,需要下载与谷歌浏览器版本对应的驱动程序,下载地址:https://chromedriver.storage.googleapis.com/index.html

          3)测试代码:

    public class SeleniumChromeTest {
    
        public static void main(String args[]) throws Exception {
    
            ChromeDriver driver = null;
    
            try {
                //设置chrome浏览器驱动的所在位置
                // 可以设置系统环境变量省略此代码
                System.setProperty("webdriver.chrome.driver","C:\Users\chromedriver\chromedriver.exe");
    
                ChromeOptions options = new ChromeOptions();
                // 设置IP代理
                Proxy proxy = new Proxy();
                proxy.setHttpProxy("ip:port");
                options.setProxy(proxy);
    
                // Chrome浏览器驱动
                driver = new ChromeDriver(options);
    
                // 清理所有cookie
                driver.manage().deleteAllCookies();
    
                // 请求POI页面
                driver.get("https://www.amap.com/place/B001B0IZY1");
                // 跳转到POI边界坐标资源请求接口
                driver.navigate().to("https://www.amap.com/detail/get/detail?id=B001B0IZY1&smToken=token&smSign=undefined");
    
                // 打印网页源代码
                System.out.println(driver.getPageSource());
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                driver.quit();
            }
    
        }
    
    }

          测试谷歌浏览器发现即使采用代理IP方式访问,每次都会弹出机器人效验,而且效验一直通过不了,可能浏览器本身发送了自动化测试程序的信息到服务端。

     

    四、三部曲之Edge

          换一个”单纯“一点的浏览器。

          1)Win10系统自带Edge浏览器,不用额外安装,Win10以下的同学请跳过这段;

          2)下载Edge浏览器驱动程序,下载地址https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/,这里有一点要注意Edge内核分为Chromium和EdgeHTML,内核不一样驱动程序也是不一样的,另外根据官方描述:

    Microsoft WebDriver for Microsoft Edge version 18 is a Windows Feature on Demand.
    To install run the following in an elevated command prompt:
    DISM.exe /Online /Add-Capability /CapabilityName:Microsoft.WebDriver~~~~0.0.1.0
    For builds prior to 18, download the approriate driver for your installed version of Microsoft 

    EdgeHTML18的版本不用额外下载驱动程序,直接在CMD中执行如下命令方式安装驱动程序,并且程序中不用设置环境变量

    DISM.exe /Online /Add-Capability /CapabilityName:Microsoft.WebDriver~~~~0.0.1.0

          3)测试代码参考谷歌浏览器实现。

          测试结果,Edge浏览器驱动程序设置IP代理会报错,这是因为Edge的IP代理就是Windows的代理,无法单独对Edge进行代理设置。错误信息如下:

    org.openqa.selenium.InvalidArgumentException: The specified arguments passed to the command are invalid.

          Edge Chromium内核的没有测试过设置IP代理,有兴趣的同学可以测试一下。

     

    五、三部曲之IE

          谷歌和Edge测试完以后发现都有缺陷,最后只能尝试IE浏览器。

          1)Windows自带了IE浏览器;

          2)下载IE浏览器驱动程序,下载地址:https://selenium-release.storage.googleapis.com/index.html,版本和Selenium版本对应版本选择32为驱动程序,即使是64位操作系统也要选择32位驱动程序,否则会出现指令执行不成功(例如无法获取cookie)等问题,如图:

          3)测试代码参考谷歌浏览器实现。

          测试发现IE浏览器也有个问题,跳转到https://www.amap.com/detail/get/detail页面后IE不会再网页显示JSON数据,而是下提供JSON文件下载。

     

          以上是使用Selenium爬取POI边界坐标的测试过程,如需交流可以发站内信给我。

  • 相关阅读:
    产品团队管理
    产品版本规划
    gitlab服务器IP调整后修改domian或ip
    Linux服务器性能分析与调优
    linux设置别名连接远程服务器
    Yaml文件
    Alias采样算法
    Graph embedding(2)----- DeepWalk、Node2vec、LINE
    python学习(32)---networkx
    python报错
  • 原文地址:https://www.cnblogs.com/changxy-codest/p/12175778.html
Copyright © 2011-2022 走看看