Webmagic 爬蟲框架 爬取馬蜂窩、攜程旅游、汽車之家游記信息


WebMagic學習

遇到的問題

  1. Log4j錯誤

    解決:在src目錄下添加配置文件 log4j.properties

     log4j.rootLogger=INFO, stdout, file
     log4j.logger.org.quartz=WARN, stdout
     log4j.appender.stdout=org.apache.log4j.ConsoleAppender
     log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
     log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%m%n
     
     log4j.appender.file=org.apache.log4j.FileAppender
     log4j.appender.file.File=C:\\log4j\\webmagic\\webmagic.log
     log4j.appender.file.layout=org.apache.log4j.PatternLayout
     log4j.appender.file.layout.ConversionPattern=%n%-d{MM-dd HH:mm:ss}-%C.%M()%n[%p]%m%n  
    
  2. 協議錯誤,有的網站需要的SSL協議比較高,盡量使用做高版本的jar包

     <dependency>
         <groupId>us.codecraft</groupId>
         <artifactId>webmagic-core</artifactId>
         <version>0.7.3</version>
     </dependency>
     <dependency>
         <groupId>us.codecraft</groupId>
         <artifactId>webmagic-extension</artifactId>
         <version>0.7.3</version>
     </dependency>
    
  3. 狀態碼錯誤

    解決:主要是與site有關,下邊兩種解決辦法暫時還沒弄明白

     private Site site = Site
     	.me()
     	.setRetryTimes(3)
     	.setSleepTime(3000)
     	.setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0");
     或者  
     private Site site = Site
     	.me()
     	.setRetryTimes(3)
     	.setSleepTime(3000)
     	.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
    
  4. 缺少HttpContext類

    解決:添加HTTPContext的Jar包

     <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
         <version>4.5.4</version>
     </dependency>  
    

Webmagic學習配置

  1. 創建一個maven項目

  2. 在pom中引用jar包,引用完之后就基本好了

     <dependencies>
       	<dependency>
     	    <groupId>us.codecraft</groupId>
     	    <artifactId>webmagic-core</artifactId>
     	    <version>0.7.3</version>
     	</dependency>
     	<dependency>
     	    <groupId>us.codecraft</groupId>
     	    <artifactId>webmagic-extension</artifactId>
     	    <version>0.7.3</version>
     	</dependency>
     	<dependency>
     	    <groupId>org.apache.httpcomponents</groupId>
     	    <artifactId>httpclient</artifactId>
     	    <version>4.5.4</version>
     	</dependency>
     </dependencies>
    

Webmagic學習參考

  1. 參考博客:

     參考博客:https://www.xttblog.com/?s=webmagic   
     其中有些案例,我沒有運行成功,我會將我自己的案例發布上去(src/File目錄下為正式爬取的案例,src/Test下的程序為學習過程中找到的案例,也有自己測試的案例)
     
     動態頁面爬取參考 http://webmagic.io/docs/zh/posts/chx-cases/js-render-page.html
     
     Webmagic的使用說明 http://webmagic.io/docs/zh/
    

案例

  1. 案例1 汽車之家游記爬取 (src/File/Test2)

    如何判斷頁面數據為通過js動態獲取的???

    判斷頁面是否為js渲染的方式比較簡單,在瀏覽器中直接查看源碼(Windows下Ctrl+U,Mac下command+alt+u),如果找不到有效的信息,則基本可以肯定為js渲染。

    1. Windows中按Ctrl+U,再按Ctrl+F查找其中的內容,我查找的是第一個游記,結果沒有找到,這就判定該頁面的數據是通過js動態獲取的。

    2. 如果判定該頁面的數據是通過JS動態獲取的,就開始找獲取數據的鏈接:例如:此時只有這幾個請求,當點擊第二頁的時候,又出現了幾個鏈接。

    3. 點擊新出現的第一個鏈接,選擇preview,出現返回的數據,從中找到詳情頁的鏈接。也可以直接復制這個鏈接,在新的標簽頁打開(https://you.autohome.com.cn/summary/getsearchresultlist?ps=20&pg=1&type=3&tagCode=&tagName=&sortType=3) 按照上邊,同樣的點擊第三頁也同樣出現了一個新的請求鏈接https://you.autohome.com.cn/summary/getsearchresultlist?ps=20&pg=2&type=3&tagCode=&tagName=&sortType=3) 比較這兩個鏈接,發現這兩個鏈接只是pg這個參數不同,根據這兩個鏈接一個是第一頁,一個是第二頁,可以推測出每個列表頁的鏈接

    4. 如果在新的標簽頁打開(我的谷歌瀏覽器安裝了一個JsonView插件,查看json格式的數據比較方便)

    5. 這里就有詳情頁的地址,我們再看一下這個詳情頁的具體地址,鏈接后邊的那個暫時不知道是什么用,大概只是一個標識作用,刪去也可以訪問,這樣就可以根據上邊的/details/112251拼接詳情頁的地址,這樣知道了列表頁的鏈接和詳情的鏈接,就可以將這上面的游記都爬取下來了

    6. 當初我也就這樣試了試,結果能爬下來,也就沒管。但是后來查看這些游記,發現有的游記都只有一半,並不全,后來我又看網頁,發現有的網頁是只有一頁(比如上邊那個游記),有的網頁有好幾頁(https://you.autohome.com.cn/details/112486#pvareaid=2174234),但時候后邊附帶着一個擴展全文的按鈕,這時候就需要尋找全文的鏈接,否則爬取的只是一半的內容

    7. 接下來就是尋找完整頁面的鏈接,點擊展開全文按鈕(https://you.autohome.com.cn/details/112486/b51ba31c58c7b84e0a52d8f50b811df4?handleType=1)連續找了幾個這樣的游記之后,發現只是后邊的(b51ba31c58c7b84e0a52d8f50b811df4)這個參數不同,這里就需要找這個隨機數了。重新刷新一下頁面,出現了幾個鏈接,一次點進去看看有沒有這個隨機數,終於在最后一個鏈接中找到了這個隨機數,現在就需要拼接這個鏈接獲取這個隨機數。獲取這個隨機數后就開始拼接這個完整頁面的鏈接。后來突然發現,該如何判斷只有一頁的頁面,但是后來發現即使是一個頁面也有隨機數,這樣訪問同樣也可以。

      單頁面游記的隨機數

    獲取這個隨機數之后,就可以拼接這個完整頁面的鏈接,然后將鏈接加入帶爬取隊列。然后就跟正常的爬取一樣了


  1. 案例2 馬蜂窩旅游游記爬取(能爬取數據,但是數據爬不全)(src/File/Test0)

    1. 馬蜂窩的爬取比較簡單,只是最簡單的列表頁-詳情頁格式,只是在翻頁的時候,頁面只有5頁,再看看每個列表頁的格式(https://www.mafengwo.cn/yj/21536/1-0-2.html) 只是最后的數不同,應該就是代表頁數。通過循環拼接鏈接,並將鏈接加入帶爬取隊列
      ![](https://img2018.cnblogs.com/blog/1027790/201810/1027790-20181010114821080-1528829103.png ‘馬蜂窩’)

    2. 但是這里有一個問題還沒有解決:馬蜂窩的游記都比較長,為了快速加載,每個游記都是分成幾次加載,比如剛打開頁面的時候,只是顯示上邊的一部分,當下滑到最下邊的時候,就會JS請求繼續獲取下邊的頁面
      ![](https://img2018.cnblogs.com/blog/1027790/201810/1027790-20181010114841253-319549017.png ‘馬蜂窩’)

    3. 當隨着下滑,會加載出剩下的頁面數據
      ![](https://img2018.cnblogs.com/blog/1027790/201810/1027790-20181010114941300-1306678037.png ‘馬蜂窩’)

    類似的,隨着游記的長度不同,會有不同的加載次數,按照一般過程,都會要拼接加載的鏈接,然后獲取數據,追加到同一個文件中,但是通過觀察這幾個鏈接,發現他們都有一個隨機數,並且這個隨機數並沒有在頁面中找到,導致現在爬取的數據只有一部分


  1. 案例3 攜程旅游游記爬取(src/File/Test1_1)

    1. 攜程旅游也是一個動態獲取的頁面,只不過他的動態獲取只是翻頁的時候的列表頁是動態獲取的,具體的詳情頁是正常的。所以只要獲取翻頁的鏈接就跟正常的列表-詳情頁的爬取是一樣的了。
      ![](https://img2018.cnblogs.com/blog/1027790/201810/1027790-20181010115002652-1052104228.png ‘攜程旅游’)

    2. 這個網站沒有具體的翻頁按鈕,每次向下滑動頁面,就會動態加載下一頁的游記列表
      ![](https://img2018.cnblogs.com/blog/1027790/201810/1027790-20181010115027216-1404918403.png ‘攜程旅游’)

    3. 這樣就找到了翻頁的鏈接 (http://you.ctrip.com/TravelSite/Home/IndexTravelListHtml?p=2&Idea=0&Type=100&Plate=0), 根據上邊的鏈接發現只有那個p屬性不同,應該是是代表頁數。拼接這個鏈接,加入帶爬取隊列就可以了

歡迎大家訪問(Star、Fork)

    GitHub地址 https://github.com/zhangHaoNiHao/WebMagic


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM