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

WebMagic學習

遇到的問題

  1. Log4j錯誤
    html

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

    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包
    github

    <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. 狀態碼錯誤
    web

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

    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類
    json

    解決:添加HTTPContext的Jar包瀏覽器

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

Webmagic學習配置

  1. 建立一個maven項目
  2. 在pom中引用jar包,引用完以後就基本好了app

    <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學習參考

  3. 參考博客:maven

    參考博客: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動態獲取的???post

    #### 判斷頁面是否爲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) 只是最後的數不一樣,應該就是表明頁數。經過循環拼接連接,並將連接加入帶爬取隊列

    2. 可是這裏有一個問題尚未解決:馬蜂窩的遊記都比較長,爲了快速加載,每一個遊記都是分紅幾回加載,好比剛打開頁面的時候,只是顯示上邊的一部分,當下滑到最下邊的時候,就會JS請求繼續獲取下邊的頁面

    3. 當隨着下滑,會加載出剩下的頁面數據

    相似的,隨着遊記的長度不一樣,會有不一樣的加載次數,按照通常過程,都會要拼接加載的連接,而後獲取數據,追加到同一個文件中,可是經過觀察這幾個連接,發現他們都有一個隨機數,而且這個隨機數並無在頁面中找到,致使如今爬取的數據只有一部分

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

    1. 攜程旅遊也是一個動態獲取的頁面,只不過他的動態獲取只是翻頁的時候的列表頁是動態獲取的,具體的詳情頁是正常的。因此只要獲取翻頁的連接就跟正常的列表-詳情頁的爬取是同樣的了。

    2. 這個網站沒有具體的翻頁按鈕,每次向下滑動頁面,就會動態加載下一頁的遊記列表

    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
相關文章
相關標籤/搜索