自學Java網路爬蟲-Day1
網路爬蟲
網路爬蟲(web crawler)是一種按照一定的規則,自動地抓取萬維網資訊的程式或者腳本,
從功能上來講,爬蟲分為采集、處理、儲存,從一個或若干初始網頁URL開始,不斷抽取新的URL放入佇列,直到滿足停止條件,
學習網路爬蟲的原因:
- 實作私人搜索引擎,
- 獲取更多資料源,進行大資料分析或資料挖掘時,從資料統計網站或文獻資料獲取很難滿足需求,
- 進行搜索引擎優化(SEO),
- 利于就業,
入門程式
1. 環境準備
- JDK1.8
- IntelliJ IDEA
- 配置好的Maven
2. 創建程式
1.檔案->New->專案->Maven,
2.Name:webcrawler,GroupId:com.qdu,完成,

3.匯入httpclient和slf4j依賴,(使用HttpClient技術抓取網頁資料)
4.main包resources目錄下新建檔案,
檔案名為log4j.properties,以便對日志顯示進行設定,
內容如下:
log4j.rootLogger=DEBUG,A1
#log4j.logger.cn.itcast=DEBUG
log4j.logger.com.qdu=DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
3. 第一個程式CrawlerFirst
1.main包java目錄下新建包com.qdu.crawler.test,

2.在包下新建Class類,Name:CrawlerFirst,

注意:上邊三個http的網址都是可以運行成功的,最后一個https是http+ssl,運行失敗,目前不知道如何解決,
3.執行一下程式,
- 成功截圖
發出的是GET請求,最后一行回傳200,http成功,
得到網站內容:

- 失敗截圖
發出的是GET請求,最后一行回傳302,https失敗,
4. 第二個程式HttpGetTest(HttpClient-Get)
在包下新建Class類,Name:HttpGetTest,

注意:關閉釋放回應和瀏覽器,
運行結果:

5. 第三個程式HttpGetParamTest(HttpClient-Get帶引數)
在游俠網搜索lol的相關游戲資訊,
復制之前創建好的HttpGetTest改為HttpGetParamTest,


運行成功:


6. 第四個程式HttpPostTest(HttpClient-Post)
復制之前創建好的HttpGetTest改為HttpPostTest,

運行成功:

發出的是POST請求,回傳200,
7. 第五個程式HttpPostParamTest(HttpClient-Post帶引數)
在游俠網搜索lol的相關游戲資訊或在傳智中搜索Java視頻,
url地址中沒有引數,引數在表單中提交,
復制之前創建好的HttpPostTest改為HttpPostParamTest,

注:這里兩個網站都成功提取內容,并能正確輸出內容長度,
運行結果:

倒數第二行為引數,
8. 第六個程式HttpClientPoolTest(連接池)
每次請求都創建HttpClient,解決頻繁創建和銷毀問題,
新建HttpClientPoolTest類,
package com.qdu.crawler.test;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class HttpClientPoolTest {
public static void main(String[] args) {
//創建連接池管理器
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
//設定最大連接數
cm.setMaxTotal(100);
//設定每個主機的最大連接數
cm.setDefaultMaxPerRoute(10);
//使用連接池管理器發起請求
doGet(cm);
doGet(cm);
}
private static void doGet(PoolingHttpClientConnectionManager cm) {
//不是每次創建新的HttpClient,而是從連接池中獲取HttpClient物件
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm).build();
HttpGet httpGet = new HttpGet("http://www.itcast.cn");
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(),"utf8");
System.out.println(content.length());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (response!=null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
//不能關閉HttpClient,由連接池管理HttpClient
//httpClient.close();
}
}
}
}
9. 第七個程式HttpConfigTest(請求引數)
因為網路或目標服務器,導致請求完成時間很長,因此需要自定義相關時間,
復制之前創建好的HttpGetTest改為HttpConfigTest,
package com.qdu.crawler.test;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class HttpConfigTest {
public static void main(String[] args) {
//創建HttpClient物件
CloseableHttpClient httpClient = HttpClients.createDefault();
//創建HttpGet物件,設定url訪問地址
HttpGet httpGet = new HttpGet("http://www.itcast.cn");
//配置請求資訊
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(1000) //創建連接的最長時間,單位毫秒
.setConnectionRequestTimeout(500)//設定獲取連接的最長時間,單位毫秒
.setSocketTimeout(10*1000) //設定資料傳輸的最長時間,單位毫秒
.build();
//給請求設定請求資訊
httpGet.setConfig(config);
CloseableHttpResponse response = null;
try {
//使用HttpClient發起請求,獲取response
response = httpClient.execute(httpGet);
//決議回應
if (response.getStatusLine().getStatusCode() == 200){
String content = EntityUtils.toString(response.getEntity(),"utf8");
System.out.println(content.length());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//關閉response
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
//關閉瀏覽器
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
希望能早點學會提取用https協議網站的資訊吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258939.html
標籤:java
上一篇:Java設計模式-代理模式
