Jsoup學(xué)習(xí)——某網(wǎng)站爬日铀骸(遞歸實現(xiàn)自動翻頁/帶參數(shù)的請求)

Jsoup是一款Java 的HTML解析器,可直接解析某個URL地址芜飘、HTML文本內(nèi)容务豺。它提供了一套非常省力的API,可通過DOM嗦明,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)笼沥。

爬取過程

1 網(wǎng)頁是基于get請求獲取到的,無需攜帶參數(shù)請求資源

Step1: 基于get請求獲取Url對于網(wǎng)頁的HTML

Connection con = Jsoup.connect(目標(biāo)網(wǎng)頁Url);

Step2:利用Jsoup把Html解析為Document

//這里有時候get()會報錯娶牌,try... catch 解決
Document document = con.get();

Step3:利用Dom方法獲取標(biāo)題奔浅、發(fā)布時間、內(nèi)容等

//獲取所有元素中第一個class= "list” 的元素
Element element = document.getElementsByClass("list").first()
//獲取 class= "list” 的元素中所有l(wèi)i元素诗良,放在elements對象里
Elements elements = element.getElementsByTag("li")
//遍歷取出elements中所有<a>標(biāo)簽中包含的連接
for(Element ele:elements){
//contentUrl為<a>標(biāo)簽href屬性中某網(wǎng)站Url后半部分鏈接
  String contentUrl = ele.getElementsByTag("a").attr("href");
//拼接出完整的detailUrl
  String detailUrl = "某網(wǎng)站Url前半部分" + contentUrl;
//基于get請求獲取detailDocument中Html
  Document detailDocument = Jsoup.connect(detailUrl).get();
//利用Dom方法獲取詳細(xì)頁面里的標(biāo)題汹桦、日期、內(nèi)容等鉴裹。
  String title = detailDocument.getElementsByClass("detail_bigtitle").first().text();
  System.out.println("標(biāo)題:"+ title);
  String time = detailDocument.getElementsByClass("time").first().text();
//這里導(dǎo)入java實例 SimpleDateFormat舞骆,格式化時間
  SimpleDateFormat srtFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  Date date = srtFormat.parse(time);
  System.out.println("日期:"+ date);
  String content= detailDocument.getElementsByClass("detail_txt").first().getElementsByTag("p").text();
  System.out.println("內(nèi)容:"+ content);
//從標(biāo)題判斷所屬類型
//利用余弦相似度計算 
  String caseType = Cosine.getSimilarityList(title);
  System.out.println("案件類型:"+ caseType);
  System.out.println("——————————————————————");  
}

2 網(wǎng)頁是基于POST請求,需要攜帶參數(shù)請求資源

利用POST請求径荔,攜帶請求參數(shù)督禽,從接口處獲取資源
Connection connect = Jsoup.connect("上圖中requestURL");
      // 利用headers
      connect.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
      connect.header("Cookie", "值");
      connect.header("Referer", "值");
      connect.header("Host", "值");
      connect.header("User-Agent", "值");
      connect.header("Upgrade-Insecure-Requests", "1");
      //利用form data
      connect.data("searchField", "值");
      connect.data("keywords", "值");
      //這個pageIndexNow是自動翻頁的值,可以不寫死,實現(xiàn)爬取的自動翻頁
      connect.data("pageIndexNow", "值");
      connect.data("pageSizeNow", "值");
      connect.data("currentSubid", "值");
      connect.data("Type", "值");
      //發(fā)送帶參數(shù)的post請求
      Document document = connect.post();
      System.out.println(document.toString());

上面的代碼為通過POST請求方式,document為獲取到的HTML手趣,接下來通過操作Dom獲取到需要的標(biāo)題临燃、日期、內(nèi)容等。在取<a>標(biāo)簽屬性的過程中,可以加入判斷,看是否能取到<a>鏈接中href屬性第岖,若不為空拼接字符串

 for (Element ele : elements) {
        //取時間
        if (!"案例報送時間".equals(ele.getElementsByTag("td").get(1).text())){
          date = ele.getElementsByTag("td").get(1).text();
        }
        String contentUrl = ele.getElementsByTag("a").attr("href");
        //判斷能否取到tr中的a鏈接,若不為空則拼接字符串
        if (!"".equals(contentUrl) && contentUrl != null) {
          detailUrl = "某網(wǎng)站Url前半部分" + contentUrl;
          //遍歷存在list里的第一頁的所有案件詳情鏈接试溯,調(diào)用detailData函數(shù)
          detailData(detailUrl, date);
        }
      }

detailData函數(shù):傳遞參數(shù)(String detailUrl, String date)到函數(shù)中蔑滓,訪問通過拼接Url獲取到的每一個detailUrl鏈接中的內(nèi)容

  public Boolean detailData (String detailUrl, String date) {
    //格式化日期
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    Date judgeDate = null;
    try {
      judgeDate = formatter.parse(date);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    //訪問每一個拼接好的頁面 需要用到帶參數(shù)的POST請求,具體什么請求看 F13 NetWork里的.
    Connection connectPOST = Jsoup.connect(detailUrl);
    //從拿到的detailUrl截取字符串
    String dbid = detailUrl.substring(36,38);
    String dbname = detailUrl.substring(46,50);
    String sysid = detailUrl.substring(detailUrl.lastIndexOf("=")+1) ;
    String id = dbid + sysid;
    //利用headers
    connectPOST.header("Accept", "值");
    connectPOST.header("Cookie", "值");
    connectPOST.header("Referer", "值");
    connectPOST.header("Origin", "值");
    connectPOST.header("User-Agent", "值");
    connectPOST.header("Content-Type", "值");
    //利用data
    connectPOST.data("dbID", "");
    connectPOST.data("dbName", "");
    connectPOST.data("sysID", "");
    //帶參數(shù)結(jié)束
    Document pageDocument = null;
    try {
      pageDocument = connectPOST.post();
    } catch (IOException e) {
      e.printStackTrace();
    }
    //取標(biāo)簽
    Element divElement = pageDocument.getElementsByClass("wzinfo").first();
    //標(biāo)題
    System.out.println("id:"+ id);//拼接字符串
    //日期
    System.out.println("日期:"+ judgeDate);
    String title = divElement.getElementsByTag("h3").text();
    System.out.println("標(biāo)題:"+ title);
    //詳情
    List<String> contentList = new ArrayList<>();
    String content = null;
    Elements conElement = divElement.getElementsByClass("contentspan").tagName("p");
    for (Element ele : conElement){
      content = ele.getElementsByTag("p").text();
      contentList.add(content);
    }
    System.out.println("詳情:"+ contentList);
    System.out.println("-------------------------------------------------------------------");
    return true;
  }

解釋這里為什么需要從拼接好的截取detailUrl中截取字符串呢遇绞?是因為在發(fā)送POST請求的過程中键袱,動態(tài)獲取detailUrl中的字符串作為請求參數(shù),如下圖:


POST請求的

某網(wǎng)站從DetailUrl中動態(tài)獲取

3.實現(xiàn)遞歸翻頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摹闽,一起剝皮案震驚了整個濱河市蹄咖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌付鹿,老刑警劉巖澜汤,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚜迅,死亡現(xiàn)場離奇詭異,居然都是意外死亡俊抵,警方通過查閱死者的電腦和手機(jī)谁不,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徽诲,“玉大人刹帕,你說我怎么就攤上這事』烟妫” “怎么了偷溺?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钱贯。 經(jīng)常有香客問我挫掏,道長,這世上最難降的妖魔是什么秩命? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任砍濒,我火速辦了婚禮,結(jié)果婚禮上硫麻,老公的妹妹穿的比我還像新娘。我一直安慰自己樊卓,他們只是感情好拿愧,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碌尔,像睡著了一般浇辜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唾戚,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天柳洋,我揣著相機(jī)與錄音,去河邊找鬼叹坦。 笑死熊镣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的募书。 我是一名探鬼主播绪囱,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莹捡!你這毒婦竟也來了鬼吵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤篮赢,失蹤者是張志新(化名)和其女友劉穎齿椅,沒想到半個月后琉挖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涣脚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年示辈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩澡。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡顽耳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妙同,到底是詐尸還是另有隱情射富,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布粥帚,位于F島的核電站胰耗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芒涡。R本人自食惡果不足惜柴灯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费尽。 院中可真熱鬧赠群,春花似錦、人聲如沸旱幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柏卤。三九已至冬三,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缘缚,已是汗流浹背勾笆。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桥滨,地道東北人窝爪。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像齐媒,于是被迫代替她去往敵國和親酸舍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361