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全部引入就可以了。