CSDN爬蟲(六)——動態網頁爬取的兩種策略

CSDN爬蟲(六)——動態網頁爬取的兩種策略

說明

  • 開發環境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
  • 爬蟲框架:webMagic
  • 建議:建議首先閱讀webMagic的文檔,再查看此係列文章,便於理解,快速學習:http://webmagic.io/
  • 開發所需jar下載(不包括數據庫操作相關jar包):點我下載
  • 該系列文章會省略webMagic文檔已經講解過的相關知識。

概述

  • 在爬蟲過程中,一般情況下都是直接解析html源碼進行分析解析即可。但是,有一種情況是比較特殊的:網頁的數據採用異步加載的,比如ajax加載的數據,在我們“查看網頁源代碼”是查看不到的。採用常規的爬蟲這一塊是解析不到的。
  • 第一種解決方案是採用一些第三方的工具,模擬瀏覽器的行爲,去加載數據。比如:SeleniumPhantomJs

    • 優點:不必考慮動態頁面的各種變化多端(無論動態數據如何變化,最終呈現在頁面上的效果是固定的,我們只關心最終結果。),我們只用關心最終的現實結果即可。可以統一處理。
    • 缺點:性能低下,比如使用Selenium,每次我們都需要去啓動一個瀏覽器進程;配置繁瑣,不同的瀏覽器需要下載不同的驅動以及jar包,並且驅動和jar包之間有嚴格版本匹配關係,如果不匹配就不能使用(至少本人因爲版本匹配的關係,花了很大的時間)。
  • 第二種解決方案是分析頁面,找到對應請求接口,直接獲取數據。

    • 優點:性能高,使用方便。我們直接獲取原數據接口(換句話說就是直接拿取網頁這一塊動態數據的API接口),肯定會使用方便,並且改變的可能性也比較小。
    • 缺點:缺點也是明顯的,如何獲取接口API?有些網站可能會考慮到數據的安全性,做各種限制、混淆等。這就需要看開發者個人的基本功了,進行各種分析了。
  • 本文首先會採用Selenium進行第一種方式爬取CSDN評論模塊的數據;然後採用第二種方式分析爬取CSDN評論模塊的數據;另外,看網上一個很火的“爬取京東胸罩評論分析國人罩杯。。。”,我們就也嘗試爬取“銷量最高的胸罩的所有評論數據”。有福利=_+

方案一:採用Selenium模擬瀏覽器獲取動態網頁數據

步驟
  1. 下載需要的jar和瀏覽器驅動。注意事項:其實這一塊是個難點,需要Selenium所需的jar、瀏覽器驅動、瀏覽器版本需要匹配,如果不匹配會出現各種問題。文章結束會給出一個我測試成功用的一個版本的jar包以及驅動的下載。版本匹配可以參考這篇文章:http://blog.csdn.net/huilan_same/article/details/51896672;我用的是chrome瀏覽器,chromedriver下載地址(不需要翻牆):http://chromedriver.storage.googleapis.com/index.html
  2. 將下載的驅動放到谷歌瀏覽器的安裝目錄下,如下圖
    這裏寫圖片描述

  3. 導入jar包,具體步驟不再詳述。如下圖
    這裏寫圖片描述

  4. 編寫測試代碼

    package com.wgyscsf.spider;
    
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    /**
     * @author 高遠</n>
     * 編寫日期   2016-11-13下午9:02:01</n>
     * 郵箱  [email protected]</n>
     * 博客  http://blog.csdn.net/wgyscsf</n>
     * TODO</n>
     */
    public class SeleniumTest {
        public static void main(String[] args) {
            // 第一步: 設置chromedriver地址。一定要指定驅動的位置。
            System.setProperty("webdriver.chrome.driver",
                    "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
            // 第二步:初始化驅動
            WebDriver driver = new ChromeDriver();
            // 第三步:獲取目標網頁
            driver.get("http://blog.csdn.net/wgyscsf/article/details/52835845");
            // 第四步:解析。以下就可以進行解了。使用webMagic、jsoup等進行必要的解析。
            System.out.println("Page title is: " + driver.getTitle());
            System.out.println("Page title is: " + driver.getPageSource());
        }
    }
    
結果分析
  • 分析頁面地址:http://blog.csdn.net/wgyscsf/article/details/52835845

  • 查看原網頁源碼,我們發現原網頁有一條評論:“請問您,有爬好的數據集嗎”。我們在網頁源碼頁搜索,結果搜索不到(不要被迷惑了,那一條評論是最新評論列表中的數據,並不是文章詳情的評論數據。):
    這裏寫圖片描述

這裏寫圖片描述

  • 查看採用Selenium解析後的頁面的數據,我們搜索可以搜索到文章詳情的數據(不是最新評論的數據哦,是真正文章詳情的評論數據。):
    這裏寫圖片描述

這裏寫圖片描述

方案二:分析頁面(採用Chrome瀏覽器進行演示),獲取所需的API

案例一:獲取CSDN博文詳情的評論API(就是上面分析的那個)

步驟:
  1. 打開需要分析的網頁:http://blog.csdn.net/wgyscsf/article/details/52835845

  2. 按F12,選擇Network,刷新頁面。如下圖
    這裏寫圖片描述

  3. 這裏我們就需要一個一個分析了,找到我們所需要的API。這裏有一個技巧:我們可以採用Filter,如下圖。進行信息過濾。
    這裏寫圖片描述

  4. 比如我們要分析獲取評論信息,那麼第一想法就是這個接口的命名可能就是Comment…。這樣可以快速定位,找到我們需要的信息。
    這裏寫圖片描述

  5. 不負衆望,我們真的找到了。看來我們的想法和CSDN的開發人員的想法一致:評論就應該用評論的英文commnet進行命名!
    這裏寫圖片描述

  6. copy找到完整API地址:
    這裏寫圖片描述
    這裏寫圖片描述

案例二:獲取京東銷量最高胸罩的所有評論信息

步驟:
  1. 打開需要分析的網頁:https://item.jd.com/10341817326.html
  2. 按F12(不要忘了選擇商品評論後再刷新哦),選擇Network,刷新頁面。如下圖
    這裏寫圖片描述
  3. 這裏我們就需要一個一個分析了,找到我們所需要的API。這裏有一個技巧:我們可以採用Filter,如下圖。進行信息過濾。

  4. 比如我們要分析獲取評論信息,那麼第一想法就是這個js的命名可能就是Comment…。這樣可以快速定位,找到我們需要的信息。
    這裏寫圖片描述

  5. 不負衆望,我們真的找到了。看來我們的想法和CSDN的開發人員的想法一致:評論就應該用評論的英文commnet進行命名!
    這裏寫圖片描述

  6. copy找到完整API地址:https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv50&productId=10341817326&score=0&sortType=5&page=0&pageSize=10,該鏈接有福利=_+

這裏寫圖片描述

操作代碼(代碼已全部遷移至github,歡迎star)

https://github.com/scsfwgy/WebMagic_CSDN_Demo 點擊獲取

個人公衆號,及時更新技術文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章