Selenium網頁數據抓取

記錄使用Selenium抓取前端渲染數據

這幾天準備用程序抓下一個網站的數據, 具體哪一個就不說了, 爲了減小人工勞動, 省點力氣。用到的技術 Java, Selenium, chromeDriver, 系統ubuntu16.04html

開始查看了網站的源碼, 看到網站使用的模板的方式,

<% for(var i=0; i < loop_times; i++) { %> 
    <% var items = rider_list.slice(i * num_per_line, (i+1) * num_per_line); %> 
    <tr>
      <% for (var j=0; j < items.length; j++) { %>
        <%

這樣直接抓取html是沒法拿到數據的,頁面展現的內容是通過瀏覽器渲染過以後的結果, so。。。, 須要使用瀏覽器把拉下的源碼執行js腳本,前端渲染出頁面, 再使用xpath 解析數據。前端

Selenium能夠經過WebDriver調用Chrome 、Firefox 、Safari 等瀏覽器。

WebDriver 支持如下的java

  • ChromeDriver
  • EventFiringWebDriver
  • FirefoxDriver
  • HtmlUnitDriver
  • InternetExplorerDriver
  • PhantomJSDriver
  • RemoteWebDriver
  • SafariDriver

chromeDriver 下載地址: https://sites.google.com/a/chromium.org/chromedriver/downloads ,注意版本支持狀況, 我用的是最新的版本2.37linux

Latest Release: ChromeDriver 2.37
Supports Chrome v64-66

安裝 Google Chrome 這裏咱們選擇的是 google-chrome-stable 版本:

$ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt-get update
sudo apt-get install google-chrome-stable

測試chromeDriver 是是否正常運行, 最初阿里雲的ECS安裝的是centos6.8 的系統, 安裝完linux chrome, 運行chromeDriver的時候,遇到各類庫找不到,根據提示一直裝下去, 仍是問題不斷, 谷哥發現說centos 對chrome 支持不太好(沒有繼續跟蹤緣由, 有懂的朋友給明示一下,多謝), 換成ubuntu 16.04, 測試正常

root@iZj6c1imv6wpn7tfmm7nusZ:/work/fantasy# ./chromedriver
Starting ChromeDriver 2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7) on port 9515
Only local connections are allowed.

抓取頁面的java代碼, 使用chromeDriver 渲染後能夠正常的使用 xpath, 查找html元素了, 基礎的用法就是使用By 的查找方式了, 能夠按id, class, tag等等查找

這裏有幾個點須要注意程序員

ChromeOptions options = new ChromeOptions();

            options.addArguments("--headless");
            options.addArguments("--disable-gpu");
            options.addArguments("--no-sandbox");

option 須要設置,web

  • headless Chrome指在headless模式下運行谷歌瀏覽器。本質就是不用谷歌運行谷歌!它將由Chromium和Blink渲染引擎提供的全部現代網頁平臺的特徵都轉化成了命令行。 必須在59之後可使用
  • disable-gpu, 服務器不少沒有gpu, 禁用掉,防止出錯
  • no-sandbox 取消沙盒模式, 在root用戶下, 必須加上此選項

準備工做已作好, 能夠抓到數據了, 擺脫人工定時查看, 可使用bearychat ,出現須要通知的給本身或者團隊發送消息通知, 作倖福的程序員

java 抓取分析代碼chrome

private WebDriver           webDriver;

    public XXXSpider() {

        String driver = System.getProperty("webdriver.chrome.driver");

        if (driver == null) {
            logger.info("沒有設置 driver 變量");
            System.getProperties().setProperty("webdriver.chrome.driver", "/Users/chengpanwang/Downloads/chromedriver");
        } else {
            logger.info("driver: {}", driver);
        }

    }

    public BigDecimal pageDetail(String url) {
        logger.info("詳情頁: {}", url);

        ........        

        try {

            ChromeOptions options = new ChromeOptions();

            options.addArguments("--headless");
            options.addArguments("--disable-gpu");
            options.addArguments("--no-sandbox");

            webDriver = new ChromeDriver(options);

            webDriver.get(url);

            WebElement webElement = webDriver.findElement(By.xpath("/html"));
            WebElement roleSkill = webElement.findElement(By.id("role_skill"));
            logger.info(roleSkill.getText());
            logger.info("選中技術標籤");
            roleSkill.click();

            WebElement skillTb = webElement.findElement(By.className("skillTb"));

            for (WebElement item : skillTb.findElements(By.tagName("td"))) {
                String level = item.findElement(By.tagName("p")).getText();
                String h5 = item.findElement(By.tagName("h5")).getText();
               .... 具體業務代碼
            }

            webDriver.close();
        } catch (Exception e) {
            logger.error("", e);
        }

        return price;
    }
相關文章
相關標籤/搜索