Java - 爬蟲登入,儲存Cookie

Java - 爬蟲登入,儲存Cookie

寫過PHP後端程式,通常會知道,使用者登入需要儲存Session,

而這Session在前面使用者,是用Cookie儲存,

所以如果要做爬文登入後取得資料,就要取得POST登入訊息後,要連同Session相關(Cookie)資訊儲存在本地,下次進行爬文,要再設定Cookie資訊去對方Server訪談網頁

那怎麼儲存Cookie資訊呢?我也不知道,幸好有萬能的「Google」找到了一篇教學文章

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

要儲存Cookie,必須使用Apache的HttpClient,並建立HttpClientContent,做為儲存媒介,取得Cookie資料,下次再使用則將Cookie資料設定至HttpClientContent,並傳送出去,

    //請求引數
    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成檔案這部分我就不抄過來,可以參考對方網頁瞭解如何實作,我只需要設定在記憶體靜態變數裡就夠了,

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

下次使用可使用

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

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

這樣可以訪談登入後的頁面,使對方認得你是登入過的,並可以瀏覽該網頁

而我使用的library是

httpcomponents-client-4.5.3 可以到以下地方下載,

http://ftp.tc.edu.tw/pub/Apache//httpcomponents/httpclient/binary/ 

解壓縮後,會有lib資料夾,就將裡面的所有jar全部引入,應該就可以用了

我使用eclipse,引入方式如下

從Package Exploere找尋你的專案,並右鍵選單選擇Properties > Java Build Path > Libraries > AddExternal JARs 將 httpcomponents-client-4.5.3\lib\下的jar全部引入就可以了。