亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

零基礎寫Java知乎爬蟲之獲取知乎編輯推薦內容

2019-11-26 15:21:50
字體:
來源:轉載
供稿:網友

知乎是一個真實的網絡問答社區,社區氛圍友好、理性、認真,連接各行各業的精英。他們分享著彼此的專業知識、經驗和見解,為中文互聯網源源不斷地提供高質量的信息。

首先花個三五分鐘設計一個Logo=。=作為一個程序員我一直有一顆做美工的心!


好吧做的有點小湊合,就先湊合著用咯。

接下來呢,我們開始制作知乎的爬蟲。

首先,確定第一個目標:編輯推薦。

網頁鏈接:http://www.zhihu.com/explore/recommendations

我們對上次的代碼稍作修改,先實現能夠獲取該頁面內容:

import java.io.*;
import java.net.*;
import java.util.regex.*;
public class Main {
 static String SendGet(String url) {
  // 定義一個字符串用來存儲網頁內容
  String result = "";
  // 定義一個緩沖字符輸入流
  BufferedReader in = null;
  try {
   // 將string轉成url對象
   URL realUrl = new URL(url);
   // 初始化一個鏈接到那個url的連接
   URLConnection connection = realUrl.openConnection();
   // 開始實際的連接
   connection.connect();
   // 初始化 BufferedReader輸入流來讀取URL的響應
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream()));
   // 用來臨時存儲抓取到的每一行的數據
   String line;
   while ((line = in.readLine()) != null) {
    // 遍歷抓取到的每一行并將其存儲到result里面
    result += line;
   }
  } catch (Exception e) {
   System.out.println("發送GET請求出現異常!" + e);
   e.printStackTrace();
  }
  // 使用finally來關閉輸入流
  finally {
   try {
    if (in != null) {
     in.close();
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
  return result;
 }
 static String RegexString(String targetStr, String patternStr) {
  // 定義一個樣式模板,此中使用正則表達式,括號中是要抓的內容
  // 相當于埋好了陷阱匹配的地方就會掉下去
  Pattern pattern = Pattern.compile(patternStr);
  // 定義一個matcher用來做匹配
  Matcher matcher = pattern.matcher(targetStr);
  // 如果找到了
  if (matcher.find()) {
   // 打印出結果
   return matcher.group(1);
  }
  return "Nothing";
 }
 public static void main(String[] args) {
  // 定義即將訪問的鏈接
  String url = "  // 訪問鏈接并獲取頁面內容
  String result = SendGet(url);
  // 使用正則匹配圖片的src內容
  //String imgSrc = RegexString(result, "src=/"(.+?)/"");
  // 打印結果
  System.out.println(result);
 }
}

運行一下木有問題,接下來就是一個正則匹配的問題了。

首先我們先來獲取該頁面的所有的問題。

右擊標題,審查元素:

啊哈,可以看到標題其實是一個a標簽,也就是一個超鏈接,而其中能夠和其他超鏈接區分開的,應該就是那個class了,也就是類選擇器。

于是我們的正則語句就出來了:question_link.+?href=/"(.+?)/"

調用RegexString函數,并給它傳參:

 public static void main(String[] args) {
  // 定義即將訪問的鏈接
  String url = "
  // 訪問鏈接并獲取頁面內容
  String result = SendGet(url);
  // 使用正則匹配圖片的src內容
  String imgSrc = RegexString(result, "question_link.+?>(.+?)<");
  // 打印結果
  System.out.println(imgSrc);
 }

啊哈,可以看到我們成功抓到了一個標題(注意,只是一個):

等一下啊這一大堆的亂七八糟的是什么玩意?!

別緊張=。=它只是字符亂碼而已。

編碼問題可以參見:HTML字符集

一般來說,對中文支持較好的主流編碼是UTF-8,GB2312和GBK編碼。

網頁可以通過meta標簽的charset來設置網頁編碼,譬如:

<meta charset="utf-8" />

我們右擊,查看頁面源代碼:

可以看到,知乎采用的是UTF-8編碼。

在這里和大家解釋一下查看頁面源代碼和審查元素的區別。

查看頁面源代碼是顯示整個頁面的所有代碼,沒有按照HTML的標簽進行排版,相當于是直接查看源碼,這種方式對于查看整個網頁的信息,比如meta比較有用。

審查元素,或者有的瀏覽器叫查看元素,是針對你右擊的元素進行查看,比如一個div或者img,比較適用于單獨查看某個對象的屬性和標簽。

好的,我們現在知道了問題出在了編碼上,接下來就是對抓取到的內容進行編碼轉換了。

在java中實現很簡單,只需要在InputStreamReader里面指定編碼方式就行:

// 初始化 BufferedReader輸入流來讀取URL的響應
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(),"UTF-8"));

此時再運行程序,便會發現可以正常顯示標題了:

好的!非常好!

但是現在才只有一個標題,我們需要的是所有的標題。

我們將正則稍加修改,把搜索到的結果存儲到一個ArrayList里面:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.regex.*;
public class Main {
 static String SendGet(String url) {
  // 定義一個字符串用來存儲網頁內容
  String result = "";
  // 定義一個緩沖字符輸入流
  BufferedReader in = null;
  try {
   // 將string轉成url對象
   URL realUrl = new URL(url);
   // 初始化一個鏈接到那個url的連接
   URLConnection connection = realUrl.openConnection();
   // 開始實際的連接
   connection.connect();
   // 初始化 BufferedReader輸入流來讀取URL的響應
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(), "UTF-8"));
   // 用來臨時存儲抓取到的每一行的數據
   String line;
   while ((line = in.readLine()) != null) {
    // 遍歷抓取到的每一行并將其存儲到result里面
    result += line;
   }
  } catch (Exception e) {
   System.out.println("發送GET請求出現異常!" + e);
   e.printStackTrace();
  }
  // 使用finally來關閉輸入流
  finally {
   try {
    if (in != null) {
     in.close();
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
  return result;
 }
 static ArrayList<String> RegexString(String targetStr, String patternStr) {
  // 預定義一個ArrayList來存儲結果
  ArrayList<String> results = new ArrayList<String>();
  // 定義一個樣式模板,此中使用正則表達式,括號中是要抓的內容
  Pattern pattern = Pattern.compile(patternStr);
  // 定義一個matcher用來做匹配
  Matcher matcher = pattern.matcher(targetStr);
  // 如果找到了
  boolean isFind = matcher.find();
  // 使用循環將句子里所有的kelvin找出并替換再將內容加到sb里
  while (isFind) {
   //添加成功匹配的結果
   results.add(matcher.group(1));
   // 繼續查找下一個匹配對象
   isFind = matcher.find();
  }
  return results;
 }
 public static void main(String[] args) {
  // 定義即將訪問的鏈接
  String url = "
  // 訪問鏈接并獲取頁面內容
  String result = SendGet(url);
  // 使用正則匹配圖片的src內容
  ArrayList<String> imgSrc = RegexString(result, "question_link.+?>(.+?)<");
  // 打印結果
  System.out.println(imgSrc);
 }
}

這樣就能匹配到所有的結果了(因為直接打印了ArrayList所以會有一些中括號和逗號):


OK,這樣就算是完成了知乎爬蟲的第一步。

但是我們可以看出來,用這樣的方式是沒有辦法抓到所有的問題和回答的。

我們需要設計一個Zhihu封裝類,來存儲所有抓取到的對象。

Zhihu.java源碼:

import java.util.ArrayList;
public class Zhihu {
 public String question;// 問題
 public String zhihuUrl;// 網頁鏈接
 public ArrayList<String> answers;// 存儲所有回答的數組
 // 構造方法初始化數據
 public Zhihu() {
  question = "";
  zhihuUrl = "";
  answers = new ArrayList<String>();
 }
 @Override
 public String toString() {
  return "問題:" + question + "/n鏈接:" + zhihuUrl + "/n回答:" + answers + "/n";
 }
}

再新建一個Spider類來存放一些爬蟲常用的函數。

Spider.java源碼:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Spider {
 static String SendGet(String url) {
  // 定義一個字符串用來存儲網頁內容
  String result = "";
  // 定義一個緩沖字符輸入流
  BufferedReader in = null;
  try {
   // 將string轉成url對象
   URL realUrl = new URL(url);
   // 初始化一個鏈接到那個url的連接
   URLConnection connection = realUrl.openConnection();
   // 開始實際的連接
   connection.connect();
   // 初始化 BufferedReader輸入流來讀取URL的響應
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(), "UTF-8"));
   // 用來臨時存儲抓取到的每一行的數據
   String line;
   while ((line = in.readLine()) != null) {
    // 遍歷抓取到的每一行并將其存儲到result里面
    result += line;
   }
  } catch (Exception e) {
   System.out.println("發送GET請求出現異常!" + e);
   e.printStackTrace();
  }
  // 使用finally來關閉輸入流
  finally {
   try {
    if (in != null) {
     in.close();
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
  return result;
 }
 static ArrayList<Zhihu> GetZhihu(String content) {
  // 預定義一個ArrayList來存儲結果
  ArrayList<Zhihu> results = new ArrayList<Zhihu>();
  // 用來匹配標題
  Pattern questionPattern = Pattern.compile("question_link.+?>(.+?)<");
  Matcher questionMatcher = questionPattern.matcher(content);
  // 用來匹配url,也就是問題的鏈接
  Pattern urlPattern = Pattern.compile("question_link.+?href=/"(.+?)/"");
  Matcher urlMatcher = urlPattern.matcher(content);
  // 問題和鏈接要均能匹配到
  boolean isFind = questionMatcher.find() && urlMatcher.find();
  while (isFind) {
   // 定義一個知乎對象來存儲抓取到的信息
   Zhihu zhuhuTemp = new Zhihu();
   zhuhuTemp.question = questionMatcher.group(1);
   zhuhuTemp.zhihuUrl = "
   // 添加成功匹配的結果
   results.add(zhuhuTemp);
   // 繼續查找下一個匹配對象
   isFind = questionMatcher.find() && urlMatcher.find();
  }
  return results;
 }
}

最后一個main方法負責調用。

import java.util.ArrayList;
public class Main {
 public static void main(String[] args) {
  // 定義即將訪問的鏈接
  String url = "
  // 訪問鏈接并獲取頁面內容
  String content = Spider.SendGet(url);
  // 獲取該頁面的所有的知乎對象
  ArrayList<Zhihu> myZhihu = Spider.GetZhihu(content);
  // 打印結果
  System.out.println(myZhihu);
 }
}


Ok這樣就算搞定了。運行一下看看結果:

好的效果不錯。

接下來就是訪問鏈接然后獲取到所有的答案了。

下一回我們再介紹。

好了,以上就是簡單的介紹了如何使用java來抓取知乎的編輯推薦的內容的全部過程了,非常詳盡,也很簡單易懂,對吧,有需要的小伙伴可以參考下,自由擴展也沒問題哈

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久热精品在线视频| 亚洲第一福利在线观看| 国产精品福利网站| 91久久在线观看| 91精品国产沙发| 国产精品自拍偷拍| 亚洲激情在线观看| 在线观看久久av| 日韩av免费看网站| 国产成人涩涩涩视频在线观看| 亚洲精品一区二区三区婷婷月| 88国产精品欧美一区二区三区| 亚洲精品视频在线观看视频| 国产精品亚洲аv天堂网| 成人日韩在线电影| 国产国语刺激对白av不卡| 亚洲女人被黑人巨大进入| 欧美性极品少妇精品网站| 日韩视频永久免费观看| 亚洲男人av在线| 国产一级揄自揄精品视频| 在线观看欧美日韩| 日韩电影中文字幕在线观看| 精品国产一区二区在线| 欧美日韩在线视频一区| 欧美性受xxxx黑人猛交| 成人免费自拍视频| 国内精品免费午夜毛片| 欧美性一区二区三区| 久久91精品国产| 日韩视频在线免费观看| 久久免费视频网| www.日韩.com| 日韩h在线观看| 久久香蕉国产线看观看网| 狠狠躁夜夜躁人人爽天天天天97| 91麻豆国产精品| 2019中文字幕免费视频| 热99在线视频| 米奇精品一区二区三区在线观看| 亚洲理论片在线观看| 97超碰国产精品女人人人爽| 91精品国产91久久久久久| 欧美成人免费视频| 欧美日韩高清区| 韩国欧美亚洲国产| 九九热99久久久国产盗摄| 欧美精品18videos性欧美| 国产精品香蕉在线观看| 国产福利精品视频| 精品亚洲夜色av98在线观看| 国产91免费观看| 亚洲在线一区二区| 欧美亚洲成人网| 深夜成人在线观看| 精品久久久91| 亚洲性视频网址| 亚洲精品国产综合久久| 亚洲国产福利在线| 中文字幕亚洲激情| 国产99视频在线观看| 成人黄色中文字幕| 国产欧美日韩综合精品| 午夜精品一区二区三区av| 国产日韩欧美中文在线播放| 国产美女久久精品香蕉69| 欧美成人精品在线视频| 日韩中文字幕国产| 亚洲一区久久久| 欧美视频免费在线| 国产精品igao视频| 欧美日韩在线观看视频| 日本国产欧美一区二区三区| 欧美一级电影在线| 国产v综合v亚洲欧美久久| 亚洲欧美日韩久久久久久| 97精品国产97久久久久久免费| 国产日韩欧美黄色| 久久精视频免费在线久久完整在线看| 日韩av电影手机在线| 欧美中文字幕在线视频| 国产精品自产拍高潮在线观看| www.欧美视频| 91免费在线视频| 国内伊人久久久久久网站视频| 亚洲综合中文字幕68页| 亚洲大胆美女视频| 久久精品久久久久| 国产91精品高潮白浆喷水| 91久久夜色精品国产网站| 亚洲跨种族黑人xxx| 中文字幕亚洲欧美在线| www.日韩.com| 欧美性xxxx极品高清hd直播| 情事1991在线| 亚洲男人天堂手机在线| 亚洲福利视频网| 久久人人97超碰精品888| 亚洲尤物视频网| 亚洲毛片在线看| 国产精品一区二区性色av| 日产精品久久久一区二区福利| 国产精品日韩欧美| 亚洲jizzjizz日本少妇| 2019亚洲日韩新视频| 成人xxxxx| 在线日韩日本国产亚洲| 亚洲欧美日韩国产中文专区| 91精品视频专区| 57pao国产精品一区| 欧美中文字幕第一页| 亚洲风情亚aⅴ在线发布| 国产v综合v亚洲欧美久久| 亚洲成人av片在线观看| 91精品久久久久久久| 精品五月天久久| 国产精品露脸av在线| 国产精品一区二区三区久久久| 在线成人免费网站| 久久久久久久久久久成人| 国产成人在线精品| 欧美色另类天堂2015| 国产精品美女久久久久av超清| 亚洲精品日韩丝袜精品| 亚洲国产精品嫩草影院久久| 色婷婷亚洲mv天堂mv在影片| 国产精品mp4| 日韩av免费在线| 97人人模人人爽人人喊中文字| 国产精品久久电影观看| 久久男人资源视频| 日韩美女在线看| 国产美女精品视频| 欧美孕妇性xx| 97在线视频精品| 国产又爽又黄的激情精品视频| 久久精视频免费在线久久完整在线看| 九九热这里只有在线精品视| 96pao国产成视频永久免费| 欧美日韩免费看| 亚洲精品福利在线观看| 日韩美女中文字幕| 亚洲欧美综合精品久久成人| 亚洲一区中文字幕在线观看| 亚洲第一视频在线观看| 一区二区三区www| 欧美一级电影免费在线观看| 精品五月天久久| 中文字幕久热精品视频在线| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产精品电影在线观看| 日韩在线高清视频| 国产亚洲精品美女久久久久| 欧美一级免费看| 色与欲影视天天看综合网| 国产精品午夜视频| 欧美成人一区二区三区电影| 精品久久中文字幕| 亚洲欧美一区二区三区久久| 国产一区二区色| 日韩av大片免费看| 亚洲最大福利网站| 国产亚洲精品久久| 91精品国产综合久久香蕉|