爬蟲項目(一)爬蟲+jsoup輕鬆爬知乎

爬蟲+jsoup輕鬆爬知乎

爬知乎是爲了測試調試爬蟲,而且知乎很好爬,也建議新手爬一爬知乎和百度知道之類的網站入門。
最近對大數據很感興趣,趁着寫爬蟲的勁把java也學了。本人之前很少接觸面相對象的編程語言,只有少量的VB基礎。瞭解java之後才發現面嚮對象語言之美。(對我這樣只是把編程當愛好的fish而言)java最美妙的地方即是有豐富的jar包可以調用,還有大神更新源源不斷的jar包,比起以前寫C語言,每一行代碼都自己敲,現在寫java,敲一個點,n多功能函數直接調用,而且代碼質量都很高,簡直就是搬磚屌絲到摸腿高富帥的升級!

我最開始寫的爬蟲沒用jsoup包,直接用java自帶的httpconnect獲取,用parttern,matcher加正則語法篩選標籤和元素。正則語法看的暈,parttern定義的模板通用性很差。做出來的爬蟲整體代碼冗長,完全沒有代碼的美感。

本次寫的爬蟲調用了jsoup jar包,jsoup是優秀的HTML解析器,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據,而且封裝了get方法,可以直接調用獲取頁面。結合谷歌瀏覽器抓取頁面元素快感不斷。下面簡單介紹一下用法順便貼個知乎爬知乎的代碼。

jsoup包的import就不說了,jsoup最主要用到的就是的elements類和select()方法。elements類相當於網頁元素中的標籤,而select()方法用於按一定條件選取符合條件的標籤,組成符合條件的標籤數組。element支持轉成字符串或者文本等。總之功能很強大。只需要瞭解一下select()方法的過濾規則即可上手用了。但是有了谷歌瀏覽器!過濾規則都不用管了,直接上手用!
來個示例:
1.打開谷歌瀏覽器,右鍵單機想要抓取的元素,比如我右擊了“Spring的JavaConfig註解這篇文章”選擇檢查,自動跳出源碼框,並且定位到右鍵的元素的位置。
這裏寫圖片描述
2.右鍵點擊代碼行,copy–>copy selector
這裏寫圖片描述
3.這時候我們可以貼出來看看copy到的東西:

#div_JK > div.item_list > div:nth-child(1) > div.dTit.tracking-ad > a

表明了目標在網頁代碼中的位置,每個>前後面都代表一個檢索條件。那麼我們要得到這個標籤,只要這樣寫:

//下載網頁
String URL="輸入網址";
Document document=Jsoup.cnnect("URL");
//在下載的document裏進行檢索的語句
elements test=document.select("#div_JK")
.select("div.item_list").select("div:nth-child(1)").select("div.dTit.tracking-ad").select("a");
//這樣test標籤就是我們最開始右鍵單擊檢查的標籤
String Str=test.toString();//將標籤轉化成字符串
String text=test.text();//將標籤裏的文本提取出來
//其他轉換方法省略,檢索到目標標籤,提取標籤裏的特定元素so easy

下面貼一下寫的爬知乎代碼,知乎和貼吧之類的網站都很好爬。
目標是把知乎編輯推薦的所有熱門問題的URL、問題名、問題描述、答案,都打印出來。

代碼塊

簡單的java爬蟲代碼:

package jsouptest;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupTest {
    public static void main(String[] args) throws IOException {
        //獲取編輯推薦頁
        Document document=Jsoup.connect("https://www.zhihu.com/explore/recommendations")
                //模擬火狐瀏覽器
                .userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")
                .get();
        Element main=document.getElementById("zh-recommend-list-full");
        Elements url=main.select("div").select("div:nth-child(2)")
                .select("h2").select("a[class=question_link]");
        for(Element question:url){
            //輸出href後的值,即主頁上每個關注問題的鏈接
            String URL=question.attr("abs:href");
            //下載問題鏈接指向的頁面
            Document document2=Jsoup.connect(URL)
                    .userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")
                    .get();
            //問題
            Elements title=document2.select("#zh-question-title").select("h2").select("a");
            //問題描述
            Elements detail=document2.select("#zh-question-detail");
            //回答
            Elements answer=document2.select("#zh-question-answer-wrap")
                    .select("div.zm-item-rich-text.expandable.js-collapse-body")
                    .select("div.zm-editable-content.clearfix");
            System.out.println("\n"+"鏈接:"+URL
                    +"\n"+"標題:"+title.text()
                    +"\n"+"問題描述:"+detail.text()
                    +"\n"+"回答:"+answer.text());
        }   
    }
}

抓取效果圖:
這裏寫圖片描述

eclipse編輯器不支持自動換行,所以文本都堆在一行,可以用file類把抓取到的數據儲存到本地txt文件或doc之類的文件裏。

寫爬蟲的第一個目標是抓攜程之類的機票數據,當然不是爲了做大數據分析,就是給自己用。大家都知道攜程途牛之類,機票最便宜的時候不是起飛前一天,也不是起飛前一個月,大概是起飛前十天十幾天,這時候機票價格有個波谷。因此想寫個機票爬蟲部署到服務器上,順手再寫個安卓app傳遞爬取目標到服務器,讓爬蟲爬。爬的次數也不多,一天爬兩三次就夠了,也省的研究反爬蟲了,機票進入期望價格或者波谷的時候,發個消息通知我即可,手動買票。
是的,如果順利的話還會有3-4篇後續的文章,直到完成這個項目。爲了可以多坐幾次飛機見小女友,祝自己成功!

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