最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 爬蟲如何爬取需要登錄的網(wǎng)站

 更新時間:2019年10月10日 10:12:20   作者:平頭哥的技術(shù)博文  
這篇文章主要介紹了Java 爬蟲如何爬取需要登錄的網(wǎng)站,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這是 Java 網(wǎng)絡(luò)爬蟲系列博文的第二篇,在上一篇 Java 網(wǎng)絡(luò)爬蟲新手入門詳解 中,我們簡單的學(xué)習(xí)了一下如何利用 Java 進(jìn)行網(wǎng)絡(luò)爬蟲。在這一篇中我們將簡單的聊一聊在網(wǎng)絡(luò)爬蟲時,遇到需要登錄的網(wǎng)站,我們該怎么辦?

在做爬蟲時,遇到需要登陸的問題也比較常見,比如寫腳本搶票之類的,但凡需要個人信息的都需要登陸,對于這類問題主要有兩種解決方式:一種方式是手動設(shè)置 cookie ,就是先在網(wǎng)站上面登錄,復(fù)制登陸后的 cookies ,在爬蟲程序中手動設(shè)置 HTTP 請求中的 Cookie 屬性,這種方式適用于采集頻次不高、采集周期短,因為 cookie 會失效,如果長期采集的話就需要頻繁設(shè)置 cookie,這不是一種可行的辦法,第二種方式就是使用程序模擬登陸,通過模擬登陸獲取到 cookies,這種方式適用于長期采集該網(wǎng)站,因為每次采集都會先登陸,這樣就不需要擔(dān)心 cookie 過期的問題。

為了能讓大家更好的理解這兩種方式的運(yùn)用,我以獲取豆瓣個人主頁昵稱為例,分別用這兩種方式來獲取需要登陸后才能看到的信息。獲取信息如下圖所示:

獲取圖片中的缺心眼那叫單純,這個信息顯然是需要登陸后才能看到的,這就符合我們的主題啦。接下來分別用上面兩種辦法來解決這個問題。

手動設(shè)置 cookie

手動設(shè)置 cookie 的方式,這種方式比較簡單,我們只需要在豆瓣網(wǎng)上登陸,登陸成功后就可以獲取到帶有用戶信息的cookie,豆瓣網(wǎng)登錄鏈接:https://accounts.douban.com/passport/login。如下圖所示:

圖中的這個 cookie 就攜帶了用戶信息,我們只需要在請求時攜帶這個 cookie 就可以查看到需要登陸后才能查看到的信息。我們用 Jsoup 來模擬一下手動設(shè)置 cookie 方式,具體代碼如下:

/**
 * 手動設(shè)置 cookies
 * 先從網(wǎng)站上登錄,然后查看 request headers 里面的 cookies
 * @param url
 * @throws IOException
 */
public void setCookies(String url) throws IOException {

  Document document = Jsoup.connect(url)
      // 手動設(shè)置cookies
      .header("Cookie", "your cookies")
      .get();
  //
  if (document != null) {
    // 獲取豆瓣昵稱節(jié)點
    Element element = document.select(".info h1").first();
    if (element == null) {
      System.out.println("沒有找到 .info h1 標(biāo)簽");
      return;
    }
    // 取出豆瓣節(jié)點昵稱
    String userName = element.ownText();
    System.out.println("豆瓣我的網(wǎng)名為:" + userName);
  } else {
    System.out.println("出錯啦?。。。?!");
  }
}

從代碼中可以看出跟不需要登陸的網(wǎng)站沒什么區(qū)別,只是多了一個.header("Cookie", "your cookies") ,我們把瀏覽器中的 cookie 復(fù)制到這里即可,編寫 main 方法

public static void main(String[] args) throws Exception {
  // 個人中心url
  String user_info_url = "https://www.douban.com/people/150968577/";
  new CrawleLogin().setCookies(user_info_url);

運(yùn)行 main 得到結(jié)果如下:

可以看出我們成功獲取到了缺心眼那叫單純,這說明我們設(shè)置的 cookie 是有效的,成功的拿到了需要登陸的數(shù)據(jù)。這種方式是真的比較簡單,唯一的不足就是需要頻繁的更換 cookie,因為 cookie 會失效,這讓你使用起來就不是很爽啦。

模擬登陸方式

模擬登陸的方式可以解決手動設(shè)置 cookie 方式的不足之處,但同時也引入了比較復(fù)雜的問題,現(xiàn)在的驗證碼形形色色、五花八門,很多都富有挑戰(zhàn)性,比如在一堆圖片中操作某類圖片,這個還是非常有難度,不是隨便就能夠編寫出來。所以對于使用哪種方式這個就需要開發(fā)者自己去衡量利弊啦。今天我們用到的豆瓣網(wǎng),在登陸的時候就沒有驗證碼,對于這種沒有驗證碼的還是比較簡單的,關(guān)于模擬登陸方式最重要的就是找到真正的登陸請求、登陸需要的參數(shù)。 這個我們就只能取巧了,我們先在登陸界面輸入錯誤的賬號密碼,這樣頁面將不會跳轉(zhuǎn),所以我們就能夠輕而易舉的找到登陸請求。我來演示一下豆瓣網(wǎng)登陸查找登陸鏈接,我們在登陸界面輸入錯誤的用戶名和密碼,點擊登陸后,在 network 查看發(fā)起的請求鏈接,如下圖所示:

從 network 中我們可以查看到豆瓣網(wǎng)的登陸鏈接為https://accounts.douban.com/j/mobile/login/basic,需要的參數(shù)有五個,具體參數(shù)查看圖中的 Form Data,有了這些之后,我們就能夠構(gòu)造請求模擬登陸啦。登陸后進(jìn)行后續(xù)操作,接下來我們就用 Jsoup 來模擬登陸到獲取豆瓣主頁昵稱,具體代碼如下:

/**
 * Jsoup 模擬登錄豆瓣 訪問個人中心
 * 在豆瓣登錄時先輸入一個錯誤的賬號密碼,查看到登錄所需要的參數(shù)
 * 先構(gòu)造登錄請求參數(shù),成功后獲取到cookies
 * 設(shè)置request cookies,再次請求
 * @param loginUrl 登錄url
 * @param userInfoUrl 個人中心url
 * @throws IOException
 */
public void jsoupLogin(String loginUrl,String userInfoUrl) throws IOException {

  // 構(gòu)造登陸參數(shù)
  Map<String,String> data = new HashMap<>();
  data.put("name","your_account");
  data.put("password","your_password");
  data.put("remember","false");
  data.put("ticket","");
  data.put("ck","");
  Connection.Response login = Jsoup.connect(loginUrl)
      .ignoreContentType(true) // 忽略類型驗證
      .followRedirects(false) // 禁止重定向
      .postDataCharset("utf-8")
      .header("Upgrade-Insecure-Requests","1")
      .header("Accept","application/json")
      .header("Content-Type","application/x-www-form-urlencoded")
      .header("X-Requested-With","XMLHttpRequest")
      .header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
      .data(data)
      .method(Connection.Method.POST)
      .execute();
  login.charset("UTF-8");
  // login 中已經(jīng)獲取到登錄成功之后的cookies
  // 構(gòu)造訪問個人中心的請求
  Document document = Jsoup.connect(userInfoUrl)
      // 取出login對象里面的cookies
      .cookies(login.cookies())
      .get();
  if (document != null) {
    Element element = document.select(".info h1").first();
    if (element == null) {
      System.out.println("沒有找到 .info h1 標(biāo)簽");
      return;
    }
    String userName = element.ownText();
    System.out.println("豆瓣我的網(wǎng)名為:" + userName);
  } else {
    System.out.println("出錯啦?。。。?!");
  }
}

這段代碼分兩段,前一段是模擬登陸,后一段是解析豆瓣主頁,在這段代碼中發(fā)起了兩次請求,第一次請求是模擬登陸獲取到 cookie,第二次請求時攜帶第一次模擬登陸后獲取的cookie,這樣也可以訪問需要登陸的頁面,修改 main 方法

public static void main(String[] args) throws Exception {
  // 個人中心url
  String user_info_url = "https://www.douban.com/people/150968577/";

  // 登陸接口
  String login_url = "https://accounts.douban.com/j/mobile/login/basic";

  // new CrawleLogin().setCookies(user_info_url);
  new CrawleLogin().jsoupLogin(login_url,user_info_url);
}

運(yùn)行 main 方法,得到如下結(jié)果:

模擬登陸的方式也成功的獲取到了網(wǎng)名缺心眼那叫單純,雖然這已經(jīng)是最簡單的模擬登陸啦,從代碼量上就可以看出它比設(shè)置 cookie 要復(fù)雜很多,對于其他有驗證碼的登陸,我就不在這里介紹了,第一是我在這方面也沒什么經(jīng)驗,第二是這個實現(xiàn)起來比較復(fù)雜,會涉及到一些算法和一些輔助工具的使用,有興趣的朋友可以參考崔慶才老師的博客研究研究。模擬登陸寫起來雖然比較復(fù)雜,但是只要你編寫好之后,你就能夠一勞永逸,如果你需要長期采集需要登陸的信息,這個還是值得你的做的。

除了使用 jsoup 模擬登陸外,我們還可以使用 httpclient 模擬登陸,httpclient 模擬登陸沒有 Jsoup 那么復(fù)雜,因為 httpclient 能夠像瀏覽器一樣保存 session 會話,這樣登陸之后就保存下了 cookie ,在同一個 httpclient 內(nèi)請求就會帶上 cookie 啦。httpclient 模擬登陸代碼如下:

/**
 * httpclient 的方式模擬登錄豆瓣
 * httpclient 跟jsoup差不多,不同的地方在于 httpclient 有session的概念
 * 在同一個httpclient 內(nèi)不需要設(shè)置cookies ,會默認(rèn)緩存下來
 * @param loginUrl
 * @param userInfoUrl
 */
public void httpClientLogin(String loginUrl,String userInfoUrl) throws Exception{

  CloseableHttpClient httpclient = HttpClients.createDefault();
  HttpUriRequest login = RequestBuilder.post()
      .setUri(new URI(loginUrl))// 登陸url
      .setHeader("Upgrade-Insecure-Requests","1")
      .setHeader("Accept","application/json")
      .setHeader("Content-Type","application/x-www-form-urlencoded")
      .setHeader("X-Requested-With","XMLHttpRequest")
      .setHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
      // 設(shè)置賬號信息
      .addParameter("name","your_account")
      .addParameter("password","your_password")
      .addParameter("remember","false")
      .addParameter("ticket","")
      .addParameter("ck","")
      .build();
  // 模擬登陸
  CloseableHttpResponse response = httpclient.execute(login);
  if (response.getStatusLine().getStatusCode() == 200){
    // 構(gòu)造訪問個人中心請求
    HttpGet httpGet = new HttpGet(userInfoUrl);
    CloseableHttpResponse user_response = httpclient.execute(httpGet);
    HttpEntity entity = user_response.getEntity();
    //
    String body = EntityUtils.toString(entity, "utf-8");

    // 偷個懶,直接判斷 缺心眼那叫單純 是否存在字符串中
    System.out.println("缺心眼那叫單純是否查找到?"+(body.contains("缺心眼那叫單純")));
  }else {
    System.out.println("httpclient 模擬登錄豆瓣失敗了!!!!");
  }
}

運(yùn)行這段代碼,返回的結(jié)果也是 true。

有關(guān) Java 爬蟲遇到登陸問題就聊得差不多啦,來總結(jié)一下:對于爬蟲遇到登陸問題有兩種解決辦法,一種是手動設(shè)置cookie,這種方式適用于短暫性采集或者一次性采集,成本較低。另一種方式是模擬登陸的方式,這種方式適用于長期采集的網(wǎng)站,因為模擬登陸的代價還是蠻高的,特別是一些變態(tài)的驗證碼,好處就是能夠讓你一勞永逸

源代碼:源代碼

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • thymeleaf實現(xiàn)前后端數(shù)據(jù)交換的示例詳解

    thymeleaf實現(xiàn)前后端數(shù)據(jù)交換的示例詳解

    Thymeleaf?是一款用于渲染?XML/XHTML/HTML5?內(nèi)容的模板引擎,當(dāng)通過?Web?應(yīng)用程序訪問時,Thymeleaf?會動態(tài)地替換掉靜態(tài)內(nèi)容,使頁面動態(tài)顯示,這篇文章主要介紹了thymeleaf實現(xiàn)前后端數(shù)據(jù)交換,需要的朋友可以參考下
    2022-07-07
  • 解決Java Redis刪除HashMap中的key踩到的坑

    解決Java Redis刪除HashMap中的key踩到的坑

    這篇文章主要介紹了解決Java Redis刪除HashMap中的key踩到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 一文帶你深入了解Java?TreeMap

    一文帶你深入了解Java?TreeMap

    TreeMap是Map家族中的一員,也是用來存放key-value鍵值對的。平時在工作中使用的可能并不多。本文將基于jdk8對其做一個講解,感興趣的可以了解一下
    2022-09-09
  • jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼示例詳解

    jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼示例詳解

    這篇文章主要介紹了jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Java的JSTL標(biāo)簽庫詳解

    Java的JSTL標(biāo)簽庫詳解

    JSTL包含用于編寫和開發(fā)JSP頁面的一組標(biāo)準(zhǔn)標(biāo)簽,它可以為用戶提供一個無腳本環(huán)境。在此環(huán)境中,用戶可以使用標(biāo)簽編寫代碼,而無須使用Java腳本
    2023-05-05
  • MyBatis獲取參數(shù)值的兩種方式詳解

    MyBatis獲取參數(shù)值的兩種方式詳解

    本文主要介紹了MyBatis獲取參數(shù)值的兩種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Springboot實現(xiàn)添加本地模塊依賴方式

    Springboot實現(xiàn)添加本地模塊依賴方式

    這篇文章主要介紹了Springboot實現(xiàn)添加本地模塊依賴方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java隨機(jī)生成字符串(字符隨機(jī)生成類 生成隨機(jī)字符組合)

    java隨機(jī)生成字符串(字符隨機(jī)生成類 生成隨機(jī)字符組合)

    java隨機(jī)生成字符串,字符組合多樣,可以大小字組合、大+小字符+數(shù)字等方式,大家參考使用吧
    2013-12-12
  • Java導(dǎo)出Word文檔的實現(xiàn)方法詳解

    Java導(dǎo)出Word文檔的實現(xiàn)方法詳解

    這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實現(xiàn)方法,在日常的開發(fā)工作中,我們時常會遇到導(dǎo)出Word文檔報表的需求,比如公司的財務(wù)報表、醫(yī)院的患者統(tǒng)計報表、電商平臺的銷售報表等等,需要的朋友可以參考下
    2023-08-08
  • Java輸入字母來判斷星期幾的實現(xiàn)代碼

    Java輸入字母來判斷星期幾的實現(xiàn)代碼

    這篇文章主要介紹了Java輸入字母來判斷星期幾的實現(xiàn)代碼,用情況語句比較好,如果第一個字母一樣,則判斷用情況語句或if語句判斷第二個字母需要的朋友可以參考下
    2017-02-02

最新評論

广德县| 依兰县| 十堰市| 成安县| 安陆市| 方城县| 正镶白旗| 休宁县| 当阳市| 松溪县| 即墨市| 中方县| 阿勒泰市| 五原县| 呈贡县| 鲁甸县| 霸州市| 乌兰浩特市| 西安市| 剑川县| 都江堰市| 探索| 任丘市| 中宁县| 凌云县| 南丰县| 鄂伦春自治旗| 高淳县| 吉木乃县| 师宗县| 门源| 南漳县| 精河县| 武胜县| 瑞金市| 潞城市| 建水县| 瑞昌市| 两当县| 龙口市| 株洲市|