CSDN爬蟲(六)——動態網頁爬取的兩種策略
說明
- 開發環境:jdk1.7+myeclipse10.7+win74bit+mysql5.5+webmagic0.5.2+jsoup1.7.2
- 爬蟲框架:webMagic
- 建議:建議首先閱讀webMagic的文檔,再查看此係列文章,便於理解,快速學習:http://webmagic.io/
- 開發所需jar下載(不包括數據庫操作相關jar包):點我下載
- 該系列文章會省略webMagic文檔已經講解過的相關知識。
概述
- 在爬蟲過程中,一般情況下都是直接解析html源碼進行分析解析即可。但是,有一種情況是比較特殊的:網頁的數據採用異步加載的,比如ajax加載的數據,在我們“查看網頁源代碼”是查看不到的。採用常規的爬蟲這一塊是解析不到的。
第一種解決方案是採用一些第三方的工具,模擬瀏覽器的行爲,去加載數據。比如:
Selenium
、PhantomJs
。- 優點:不必考慮動態頁面的各種變化多端(無論動態數據如何變化,最終呈現在頁面上的效果是固定的,我們只關心最終結果。),我們只用關心最終的現實結果即可。可以統一處理。
- 缺點:性能低下,比如使用
Selenium
,每次我們都需要去啓動一個瀏覽器進程;配置繁瑣,不同的瀏覽器需要下載不同的驅動以及jar包,並且驅動和jar包之間有嚴格版本匹配關係,如果不匹配就不能使用(至少本人因爲版本匹配的關係,花了很大的時間)。
第二種解決方案是分析頁面,找到對應請求接口,直接獲取數據。
- 優點:性能高,使用方便。我們直接獲取原數據接口(換句話說就是直接拿取網頁這一塊動態數據的API接口),肯定會使用方便,並且改變的可能性也比較小。
- 缺點:缺點也是明顯的,如何獲取接口API?有些網站可能會考慮到數據的安全性,做各種限制、混淆等。這就需要看開發者個人的基本功了,進行各種分析了。
本文首先會採用
Selenium
進行第一種方式爬取CSDN評論模塊的數據;然後採用第二種方式分析爬取CSDN評論模塊的數據;另外,看網上一個很火的“爬取京東胸罩評論分析國人罩杯。。。”,我們就也嘗試爬取“銷量最高的胸罩的所有評論數據”。有福利=_+
方案一:採用Selenium
模擬瀏覽器獲取動態網頁數據
步驟
- 下載需要的jar和瀏覽器驅動。注意事項:其實這一塊是個難點,需要Selenium所需的jar、瀏覽器驅動、瀏覽器版本需要匹配,如果不匹配會出現各種問題。文章結束會給出一個我測試成功用的一個版本的jar包以及驅動的下載。版本匹配可以參考這篇文章:http://blog.csdn.net/huilan_same/article/details/51896672;我用的是chrome瀏覽器,chromedriver下載地址(不需要翻牆):http://chromedriver.storage.googleapis.com/index.html。
將下載的驅動放到谷歌瀏覽器的安裝目錄下,如下圖
導入jar包,具體步驟不再詳述。如下圖
編寫測試代碼
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(就是上面分析的那個)
步驟:
打開需要分析的網頁:http://blog.csdn.net/wgyscsf/article/details/52835845
按F12,選擇Network,刷新頁面。如下圖
這裏我們就需要一個一個分析了,找到我們所需要的API。這裏有一個技巧:我們可以採用Filter,如下圖。進行信息過濾。
比如我們要分析獲取評論信息,那麼第一想法就是這個接口的命名可能就是Comment…。這樣可以快速定位,找到我們需要的信息。
不負衆望,我們真的找到了。看來我們的想法和CSDN的開發人員的想法一致:評論就應該用評論的英文commnet進行命名!
copy找到完整API地址:
案例二:獲取京東銷量最高胸罩的所有評論信息
步驟:
- 打開需要分析的網頁:https://item.jd.com/10341817326.html
- 按F12(不要忘了選擇商品評論後再刷新哦),選擇Network,刷新頁面。如下圖
這裏我們就需要一個一個分析了,找到我們所需要的API。這裏有一個技巧:我們可以採用Filter,如下圖。進行信息過濾。
比如我們要分析獲取評論信息,那麼第一想法就是這個js的命名可能就是Comment…。這樣可以快速定位,找到我們需要的信息。
不負衆望,我們真的找到了。看來我們的想法和CSDN的開發人員的想法一致:評論就應該用評論的英文commnet進行命名!
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
點擊獲取