1. 程式人生 > >Java爬蟲入門簡介(三)——HttpClient儲存使用Cookie登入

Java爬蟲入門簡介(三)——HttpClient儲存使用Cookie登入

其他爬蟲部落格:

Cookie是瀏覽器儲存儲存使用者資訊的一小段文字,它儲存了使用者的ID等資訊,這些資訊可以被伺服器端識別,並作為標識使用者的手段,以此來判定使用者是不是第一次訪問。網路上有這樣一段解釋,很清楚。

瀏覽器與WEB伺服器之間是使用HTTP協議進行通訊的;而HTTP協議是無狀態協議。也就是說,當某個使用者發出頁面請求時,WEB伺服器只是簡單的進行響應,然後就關閉與該使用者的連線。因此當一個請求傳送到WEB伺服器時,無論其是否是第一次來訪,伺服器都會把它當作第一次來對待,這樣的不好之處可想而知。為了彌補這個缺陷,Netscape開發出了cookie這個有效的工具來儲存某個使用者的識別資訊, 它是一種WEB伺服器通過瀏覽器在訪問者的硬碟上儲存資訊的手段。 它是伺服器傳送給瀏覽器的體積很小的純文字資訊。

定義:cookie是Web瀏覽器儲存的少量命名資料,它與某個特定的網頁和網站關聯在一起。cookie實際上和某一網站和網頁關聯的,儲存使用者一定資訊的文字檔案。

Cookie是當你瀏覽某網站時,網站儲存在你機器上的一個小文字檔案,它記錄了你的使用者ID,密碼、瀏覽過的網頁、停留的時間等資訊,當你再次來到該網站時,網站通過讀取Cookie,得知你的相關資訊,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登入等等。

在這篇部落格中,我們將描述在HttpClient 4.X中,如何使用Cookie,儲存Cookie,並利用已登入的Cookie訪問頁面。

首先,在HttpClient 4.X中,使用HttpContext來儲存請求的上下文資訊。說白了,就是用一個類來儲存請求的資訊。比如,如果使用HttpClient請求利用了HttpContext,那麼在請求的時候會帶有HttpContext裡面儲存的一些資訊,如sessionId等。同時,HttpClient請求完了之後也會把從伺服器得到的一些資訊儲存下來,下次請求的時候,使用這個HttpContext就會帶上這次請求所儲存的資訊了。BasicHttpContext裡有個Map物件用來記錄一次請求響應的資訊,當響應資訊返回時,就會被set到context裡,當然響應的cookie資訊也就被儲存在context裡,包括傳回的sessionId。當第二次請求的時候傳入相同的context,那麼請求的過程中會將context裡的sessionId提取出來傳給伺服器,sessionId一樣,自然而然的就是同一個session物件。

下面我們看一個使用HttpContext帶Cookie請求的案例。

package org.hfutec.crawler.main;

import com.google.common.collect.Lists;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

public class RequestWithCookie {

  public static void main(String[] args) throws URISyntaxException, IOException, ClassNotFoundException {

    //待請求的地址
    String url = "http://www.datalearner.com";

    //請求引數
    List<NameValuePair> loginNV = new ArrayList<>();
    loginNV.add(new BasicNameValuePair("userName", "test"));
    loginNV.add(new BasicNameValuePair("passWord", "test"));

    //構造請求資源地址
    URI uri = new URIBuilder(url).addParameters(loginNV).build();

    //建立一個HttpContext物件,用來儲存Cookie
    HttpClientContext httpClientContext = HttpClientContext.create();

    //構造自定義Header資訊
    List<Header> headerList = Lists.newArrayList();
    headerList.add(new BasicHeader(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9," +
            "image/webp,image/apng,*/*;q=0.8"));
    headerList.add(new BasicHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
            "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"));
    headerList.add(new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate"));
    headerList.add(new BasicHeader(HttpHeaders.CACHE_CONTROL, "max-age=0"));
    headerList.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive"));
    headerList.add(new BasicHeader(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2," +
            "de;q=0.2"));

    //構造自定義的HttpClient物件
    HttpClient httpClient = HttpClients.custom().setDefaultHeaders(headerList).build();

    //構造請求物件
    HttpUriRequest httpUriRequest = RequestBuilder.get().setUri(uri).build();

    //執行請求,傳入HttpContext,將會得到請求結果的資訊
    httpClient.execute(httpUriRequest, httpClientContext);

    //從請求結果中獲取Cookie,此時的Cookie已經帶有登入資訊了
    CookieStore cookieStore = httpClientContext.getCookieStore();

    //這個CookieStore儲存了我們的登入資訊,我們可以先將它儲存到某個本地檔案,後面直接讀取使用
    saveCookieStore(cookieStore,"cookie");

    //下面我們將演示如何使用Cookie來請求,首先我們將之前的Cookie讀出來
    CookieStore cookieStore1 = readCookieStore("cookie");

    //構造一個帶這個Cookie的HttpClient
    HttpClient newHttpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore1).build();

    //使用這個新的HttpClient請求就可以了。這時候我們的HttpClient已經帶有了之前的登入資訊,再爬取就不用登入了
    newHttpClient.execute(httpUriRequest, httpClientContext);


  }

  //使用序列化的方式儲存CookieStore到本地檔案,方便後續的讀取使用
  private static void saveCookieStore( CookieStore cookieStore, String savePath ) throws IOException {

    FileOutputStream fs = new FileOutputStream(savePath);
    ObjectOutputStream os =  new ObjectOutputStream(fs);
    os.writeObject(cookieStore);
    os.close();

  }

  //讀取Cookie的序列化檔案,讀取後可以直接使用
  private static CookieStore readCookieStore( String savePath ) throws IOException, ClassNotFoundException {

    FileInputStream fs = new FileInputStream("cookie");//("foo.ser");
    ObjectInputStream ois = new ObjectInputStream(fs);
    CookieStore cookieStore = (CookieStore) ois.readObject();
    ois.close();
    return cookieStore;


  }

}

這就是HttpClient 4.X如何使用Cookie的方式。使用現有的Cookie,其實只要把這個Cookie放到自定義的HttpClient中就行了,很簡單。

其他爬蟲部落格:

相關推薦

Java爬蟲入門簡介——HttpClient儲存使用Cookie登入

其他爬蟲部落格: Cookie是瀏覽器儲存儲存使用者資訊的一小段文字,它儲存了使用者的ID等資訊,這些資訊可以被伺服器端識別,並作為標識使用者的手段,以此來判定使用者是不是第一次訪問。網路上有這樣一段解釋,很清楚。 瀏覽器與WEB伺服器之間是使用H

Java爬蟲入門簡介 —— Jsoup解析HTML頁面

上一篇部落格我們已經介紹瞭如何使用HttpClient模擬客戶端請求頁面了。這一篇部落格我們將描述如何解析獲取到的頁面內容。上一節我們獲取了 http://www.datalearner.com/blog_list 頁面的HTML原始碼,但是這些原始碼是提供給瀏覽器解析用的,

Java爬蟲入門簡介——抓包工具的使用以及使用HttpClient模擬使用者登入的訪問

網路爬蟲需要解決的一個重要的問題就是要針對某些需要使用者名稱和密碼訪問的頁面可以模擬使用者自動登入。在這一篇部落格中我們將介紹如何使用Chrome瀏覽器自帶的抓包工具分析頁面並模擬使用者自動登入。我們會以CSDN的使用者登入為例,講述如何使用抓包工具獲取登入

Java設計模式簡介:行為型模式

本章講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 先來張圖,看看這11中模式的關係: 第一類:通過父類與子類的關係進行實現。第二類:兩個類之間。第三類:類的狀態。第

爬蟲入門系列:用 requests 構建知乎 API

爬蟲入門系列目錄: 在爬蟲系列文章 優雅的HTTP庫requests 中介紹了 requests 的使用方式,這一次我們用 requests 構建一個知乎 API,功能包括:私信傳送、文章點贊、使用者關注等,因為任何涉及使用者操作的功能都需要登入後才操作,所以在閱讀這篇文章前建議先了解

Java NIO入門學習

在上一篇中介紹了緩衝區的原理,下面來介紹NIO中另一個核心物件選擇器(Selector)以及NIO的原理。 在Client/Server模型中,Server往往需要同時處理大量來自Client的訪問請求,因此Server端需採用支援高併發訪問的架構。一種簡單而又直接的解決方

WebMagic爬蟲入門教程爬取汽車之家的例項-品牌車系車型結構等

    本文使用WebMagic爬取汽車之家的品牌車系車型結構價格能源產地國別等;java程式碼備註,只是根據url變化爬取的,沒有使用爬取script頁面具體的資料,也有反爬機制,知識簡單爬取html標籤爬取的網頁:    需要配置pom.xml <!-

Java爬蟲-- httpClient 模擬登入 + cookie 登入狀態管理

前言 前面兩章內容闡述了httpClient怎麼模擬Http請求和如何解析頁面。 接下去會講在一些實戰中遇到的問題。 現在回到我的開發摸索之路,之前說到我所爬取的網頁是某個險企提供給合作公司的一個頁面,通過賬號登入然後爬取指定的資料。 這裡就出現本章要寫

hadoop入門筆記MapReduce簡介

today 信息 編程模型 cut 大型 狀態 參數 dfs 好處 . MapReduce基本編程模型和框架 1.1 MapReduce抽象模型 大數據計算的核心思想是:分而治之。如下圖1所示。把大量的數據劃分開來,分配給各個子任務來完成。再將結果合並到一起輸出。 註:如果

java入門練習題:讀入一組整數不超過20個,當用戶輸入0時,表示輸入結束;然後程式將從這組整數中,把第二大的整數找出來,並把它打印出來。

 程式意義:讀入一組整數(不超過20個),當用戶輸入0時,表示輸入結束;然後程式將從這組整數中,把第二大的整數找出來,並把它打印出來。  說明:(1)0表示輸入結束,它本身並不計入這組整數中。            (2)在這組整數中,既有整數又有負數;          

JAVA入門學習

3.編寫HelloWorld程式        編寫Java程式的步驟:編輯原始碼,編譯,執行。    3.1.編寫原始碼             任何文字編輯器都可以編寫Java原始碼。       3.2.編譯        使用javac命令      3.3.執行

ArangoDB入門教程java連線ArangoDB資料庫

    (一)說明                       和其他noSQL差不多,java連線ArangoDB也是大同小異的。                       確保ArangoDB資料庫的服務已經開啟就好。    (二)程式碼例項            

小白學 Python 爬蟲35爬蟲框架 Scrapy 入門基礎 Selector 選擇器

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

一個鹹魚的Python爬蟲之路:爬取網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

java面向對象理論

ont def 三種 類的繼承 設置 一定的 命名 類型 以及 面向對象的基本特性 封裝   封裝性就是盡可能的隱藏對象內部細節,對外形成一道邊界,只保留有限的接口和方法與外界進行交互。封裝的原則是使對象以外的部分不能隨意的訪問和操作對象的內部屬性,從而避免了外界對對象內部

java高級工程師

基礎 自信心 分布式緩存 基於 nlog 知識點 個人理解 數據 有時 一、獨白 之前也面試別人,現在輪到自己找工作,怎麽說呢,每個面試官的看法不一樣,面試的方式就不一樣,比如我面試別人我喜歡問項目中他用到了那些,然後針對用到的技術去問一些問題,或者說對於某些場景

Asp.Net Core WebAPI入門整理跨域處理

使用 所有 ble 允許 需要 public cors 項目 listitem 一、Core WebAPI中的跨域處理 1.在使用WebAPI項目的時候基本上都會用到跨域處理 2.Core WebAPI的項目中自帶了跨域Cors的處理,不需要單獨添加程序包 3.使用方

CodeArt入門教程

pan center account 根據 領域對象 保存 顏色 單一職責原則 用例 5.領域模型設計   下面我們創建賬戶子系統(AccountSubsystem),賬戶子系統雖然被門戶服務使用,但是子系統本身是獨立於任何服務存在的。所以我們為賬戶子系統創建獨立的項目解決

JAVA線程同步 信號量

ole 給定 如何 package 分配 exec 大量 復制代碼 離開 一個信號量有且僅有3種操作,且它們全部是原子的:初始化、增加和減少 增加可以為一個進程解除阻塞; 減少可以讓一個進程進入阻塞。 信號量維護一個許可集,若有必要,會在獲得許可之前阻塞每一個線程:

容器與Docker簡介Docker相關術語——微軟微服務電子書翻譯系列

進程 數據 public 圖像 over 表示 -c ice ner 本節列出了在更加深入Docker之前應該熟悉的術語和定義。 有關詳細的定義,請參閱Docker提供的術語表。 容器鏡像(Container image):具有創建容器所需要的所有依賴和信息的包。 鏡像