爬蟲要想爬取須要的信息,首先第一步就要抓取到頁面html內容,而後對html進行分析,獲取想要的內容。上一篇隨筆《Java爬蟲系列一:寫在開始前》中提到了HttpClient能夠抓取頁面內容。html
今天就來介紹下抓取html內容的工具:HttpClient。java
圍繞下面幾個點展開:apache
什麼是HttpClient編程
HttpClient入門實例瀏覽器
結束語服務器
1、什麼是HttpClientcookie
度娘說:maven
HttpClient 是Apache Jakarta Common 下的子項目,能夠用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。 如下列出的是 HttpClient 提供的主要的功能,要知道更多詳細的功能能夠參見 HttpClient 的官網: (1)實現了全部 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自動轉向 (3)支持 HTTPS 協議 (4)支持代理服務器等
這裏面提到了官網,那就順便說下它官網上的一些東西。工具
根據百度給出的HomePage是這個:http://hc.apache.org/httpclient-3.x/,可是進入後你會發現有句話網站
大意是:Commons HttpClient這個項目已經再也不維護了,它已經被Apache HttpComponents替代了。也就是說咱們之後要用的話就用新的。點這個Apache HttpComponents的連接進去能看到它最新的版本是4.5,並且有快速上手的例子和專業的說明文檔。有興趣而且英文好的朋友能夠好好研究下哦 ~~
額~~那個~~個人英文很差,就不按照官網的來了,直接給出我本身在網上學的練習案例~~
2、HttpClient入門實例
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.8</version> </dependency>
package httpclient_learn; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.HttpClientUtils; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class HttpClientTest { public static void main(String[] args) { //1.生成httpclient,至關於該打開一個瀏覽器 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; //2.建立get請求,至關於在瀏覽器地址欄輸入 網址 HttpGet request = new HttpGet("https://www.cnblogs.com/"); try { //3.執行get請求,至關於在輸入地址欄後敲回車鍵 response = httpClient.execute(request); //4.判斷響應狀態爲200,進行處理 if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { //5.獲取響應內容 HttpEntity httpEntity = response.getEntity(); String html = EntityUtils.toString(httpEntity, "utf-8"); System.out.println(html); } else { //若是返回狀態不是200,好比404(頁面不存在)等,根據狀況作處理,這裏略 System.out.println("返回狀態不是200"); System.out.println(EntityUtils.toString(response.getEntity(), "utf-8")); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //6.關閉 HttpClientUtils.closeQuietly(response); HttpClientUtils.closeQuietly(httpClient); } } }
<!DOCTYPE html> <html lang="zh-cn"> <head> //Java開發老菜鳥備註:因爲內容太多,具體再也不貼出來了 </head> <body>
//Java開發老菜鳥備註:因爲內容太多,具體內容再也不貼出來了
</body> </html>
操做成功!
好了,到這裏就完成了一個簡單的小例子。
爬一個網站不過癮,再來一打。接下來咱們換個網站:https://www.tuicool.com/,你會發現結果是這樣的:
返回狀態不是200 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <p>系統檢測親不是真人行爲,因系統資源限制,咱們只能拒絕你的請求。若是你有疑問,能夠經過微博 http://weibo.com/tuicool2012/ 聯繫咱們。</p> </body> </html>
爬蟲程序被識別了,怎麼辦呢? 彆着急,慢慢往下看
3、複雜應用
第二個網站訪問不了,是由於網站有反爬蟲的處理,怎麼繞過他呢?
1.最簡單的是對請求頭進行假裝,看代碼,加上紅框裏面的內容後再執行
你會發現返回結果變了,有真內容了(紅字警告先無論它,咱們起碼獲取到了html內容)
那代碼中新加的那段內容是哪裏來的呢?
請打開谷歌瀏覽器的F12,對就是這裏了:
固然咱們還能夠設置請求的其餘頭信息,如cookie等
2.上面說的是假裝成瀏覽器,其實若是你假裝了以後,若是短期內一直屢次訪問的話,網站會對你的ip進行封殺,這個時候就須要換個ip地址了,使用代理IP
網上有一些免費的代理ip網站,好比xici
咱們選擇那些存活時間久而且剛剛被驗證的ip,我這裏選擇了「112.85.168.223:9999」,代碼以下
//2.建立get請求,至關於在瀏覽器地址欄輸入 網址 HttpGet request = new HttpGet("https://www.tuicool.com/"); //設置請求頭,將爬蟲假裝成瀏覽器 request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"); HttpHost proxy = new HttpHost("112.85.168.223", 9999); RequestConfig config = RequestConfig.custom().setProxy(proxy).build(); request.setConfig(config);
執行代碼,能正常返回html結果。若是代理ip恰好不能用的話,會報錯,以下顯示鏈接超時,這個時候須要更換一個新的代理ip
3.另外,程序被識別出來很大緣由是短期內作了太多訪問,這個是正常人不會有的頻率,所以咱們也能夠放慢爬取的速度,讓程序sleep一段時間再爬下一個也是一種反 反爬蟲的簡單方法。
4、結束語
這篇簡單介紹了下httpclient和它的官網,並用代碼說明了如何使用它,也提到了若是遇到反爬蟲的話咱們還能夠用一些簡單的反反爬蟲方法進行應對。
對於其餘複雜的反反爬蟲的方法我尚未研究過,就是用這幾種結合使用。 好比在爬取了一段時間後,網站須要輸入驗證碼來驗證是人在操做,我沒有去管如何突破驗證碼的事兒,而是獲取代理ip池而後在遇到驗證碼的時候逐個換新的ip,這樣就能夠躲過了驗證碼。若是有其餘方法,歡迎留言哦