WebMagic學習
遇到的問題
-
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
-
協議錯誤,有的網站需要的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>
-
狀態碼錯誤
解決:主要是與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");
-
缺少HttpContext類
解決:添加HTTPContext的Jar包
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> </dependency>
Webmagic學習配置
-
創建一個maven項目
-
在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學習參考
-
參考博客:
參考博客: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 汽車之家游記爬取 (src/File/Test2)
如何判斷頁面數據為通過js動態獲取的???
判斷頁面是否為js渲染的方式比較簡單,在瀏覽器中直接查看源碼(Windows下Ctrl+U,Mac下command+alt+u),如果找不到有效的信息,則基本可以肯定為js渲染。
-
Windows中按Ctrl+U,再按Ctrl+F查找其中的內容,我查找的是第一個游記,結果沒有找到,這就判定該頁面的數據是通過js動態獲取的。
-
如果判定該頁面的數據是通過JS動態獲取的,就開始找獲取數據的鏈接:例如:此時只有這幾個請求,當點擊第二頁的時候,又出現了幾個鏈接。
-
點擊新出現的第一個鏈接,選擇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這個參數不同,根據這兩個鏈接一個是第一頁,一個是第二頁,可以推測出每個列表頁的鏈接
-
如果在新的標簽頁打開(我的谷歌瀏覽器安裝了一個JsonView插件,查看json格式的數據比較方便)
-
這里就有詳情頁的地址,我們再看一下這個詳情頁的具體地址,鏈接后邊的那個暫時不知道是什么用,大概只是一個標識作用,刪去也可以訪問,這樣就可以根據上邊的/details/112251拼接詳情頁的地址,這樣知道了列表頁的鏈接和詳情的鏈接,就可以將這上面的游記都爬取下來了
-
當初我也就這樣試了試,結果能爬下來,也就沒管。但是后來查看這些游記,發現有的游記都只有一半,並不全,后來我又看網頁,發現有的網頁是只有一頁(比如上邊那個游記),有的網頁有好幾頁(https://you.autohome.com.cn/details/112486#pvareaid=2174234),但時候后邊附帶着一個擴展全文的按鈕,這時候就需要尋找全文的鏈接,否則爬取的只是一半的內容
-
單頁面游記的隨機數
獲取這個隨機數之后,就可以拼接這個完整頁面的鏈接,然后將鏈接加入帶爬取隊列。然后就跟正常的爬取一樣了
-
-
案例2 馬蜂窩旅游游記爬取(能爬取數據,但是數據爬不全)(src/File/Test0)
-
馬蜂窩的爬取比較簡單,只是最簡單的列表頁-詳情頁格式,只是在翻頁的時候,頁面只有5頁,再看看每個列表頁的格式(https://www.mafengwo.cn/yj/21536/1-0-2.html) 只是最后的數不同,應該就是代表頁數。通過循環拼接鏈接,並將鏈接加入帶爬取隊列
 -
但是這里有一個問題還沒有解決:馬蜂窩的游記都比較長,為了快速加載,每個游記都是分成幾次加載,比如剛打開頁面的時候,只是顯示上邊的一部分,當下滑到最下邊的時候,就會JS請求繼續獲取下邊的頁面
 -
當隨着下滑,會加載出剩下的頁面數據

類似的,隨着游記的長度不同,會有不同的加載次數,按照一般過程,都會要拼接加載的鏈接,然后獲取數據,追加到同一個文件中,但是通過觀察這幾個鏈接,發現他們都有一個隨機數,並且這個隨機數並沒有在頁面中找到,導致現在爬取的數據只有一部分
-
-
案例3 攜程旅游游記爬取(src/File/Test1_1)
-
攜程旅游也是一個動態獲取的頁面,只不過他的動態獲取只是翻頁的時候的列表頁是動態獲取的,具體的詳情頁是正常的。所以只要獲取翻頁的鏈接就跟正常的列表-詳情頁的爬取是一樣的了。
 -
這個網站沒有具體的翻頁按鈕,每次向下滑動頁面,就會動態加載下一頁的游記列表
 -
這樣就找到了翻頁的鏈接 (http://you.ctrip.com/TravelSite/Home/IndexTravelListHtml?p=2&Idea=0&Type=100&Plate=0), 根據上邊的鏈接發現只有那個p屬性不同,應該是是代表頁數。拼接這個鏈接,加入帶爬取隊列就可以了
-
歡迎大家訪問(Star、Fork)
GitHub地址 https://github.com/zhangHaoNiHao/WebMagic