1. 程式人生 > >爬蟲第一天

爬蟲第一天

今日課程的主要內容

  • 介紹爬蟲的基本概念
    • 爬蟲是什麼
    • 爬蟲的價值
    • 爬蟲的分類
    • 爬蟲的執行原理
  • 爬蟲的三大模組
    • 爬蟲的第一大模組: 獲取資料
      • 原生JDK的方式獲取網頁資料(理解)
        • get方法
        • post方式
      • 使用httpClient獲取網頁請求(重點)
        • get方式
        • post方式
    • 爬蟲的第二大模組: 解析資料
      • 使用原生DOM操作(瞭解)
        • 對js中相關方法的回顧
      • 使用jsoup解析資料(重點)
        • 對選擇器的使用
    • 爬蟲的第三大模組: 儲存資料
      • 使用JDBCTemplate完成資料的儲存工作(mysql)
  • 完成一個爬取起點中文網小說的爬蟲程式
  • 使用爬蟲完成使用者登入,獲取登陸後的資料

1. 爬蟲的基本概念

1.1 什麼是爬蟲?

​ 網路爬蟲是一種按照一定的規則,自動地抓取全球資訊網資訊的程式 , 通常由三個模組組成: 獲取資料, 解析資料, 儲存資料

1.2爬蟲有什麼價值呢?

  • 爬蟲就是用來獲取網際網路的資料的, 資料就是無價之寶,一旦獲取了海量的資料後, 我們就可以對資料進行分類和分析,最終可以做一個網站用來展示分析後的資料: 比如 競價網站 或者 提供使用者各個維度的分析等
  • 總結:
    • 爬蟲的價值就是獲取資料的價值
    • 資料的價值,取決於獲取的資料內容的重要性(比如, 獲取一個網站上每一個使用者的購買記錄)

1.3 爬蟲的分類

  • 爬蟲主要分為兩大類:
    • 一類: 通用型爬蟲
      • 通用型爬蟲主要是用來爬蟲網際網路上的所有的資料, 不限制行業, 不限制分類,這種爬蟲被稱為是通用型的爬蟲, 例如 百度 就是一個巨大的通用型爬蟲了
    • 一類: 垂直爬蟲
      • 垂直爬蟲主要是用來獲取網站上某一個分類, 或者是某一行業的資料, 這種爬蟲被為是垂直爬蟲, 例如: 慢慢買(商城網站)
  • 那麼一般我們需要開發那種型別的爬蟲呢?
    • 答案: 是垂直爬蟲, 在開發中, 我們大部分是針對的是某一個行業,或者是某個分類的內容進行獲取, 再加上通用型爬蟲已經非常的發達了, 例如百度, 谷歌

1.4 爬蟲的執行原理

  • 清楚爬蟲的作用:

    • 用來獲取網路上的資料資源的
  • 爬蟲的基本流程:

      1. 指定爬蟲要獲取url
      1. 傳送http請求獲取網頁資料
      1. 解析網頁資料
      1. 儲存資料

2. 爬蟲的第一大模組: 獲取資料

  • 獲取資料需要使用到HTTP請求

2.1 回顧http請求:

  • http的組成:
    • 請求:
      • 請求行
        • 兩種請求方式: get 和post
          • get和post的區別:
            • 引數放置的位置不同: get存放在url上, post存放在請求體重
            • 資料量不同: get是有資料量限制的, 不能傳輸大量的資料, post沒有限制
            • 是否有請求體: get是沒有請求體, post是有請求體
      • 請求頭
        • user-agent: 設定請求的瀏覽器的版本資訊
        • cookie: 將本地快取該伺服器的cookie, 傳送給服務端
      • 請求體
        • 如果使用post請求, 需要向請求體放置請求引數
    • 響應:
      • 響應行
    • Http請求狀態碼:
      • 1xx(臨時響應):表示臨時響應並需要請求者繼續執行操作的狀態碼。
        • 100(繼續)請求者應當繼續提出請求。伺服器返回此程式碼表示已收到請求的第一部 分,正在等待其餘部分。
        • 101(切換協議)請求者已要求伺服器切換協議,伺服器已確認並準備切換。
        • 2xx(成功) 表示成功處理了請求的狀態碼。
      • 200:響應成功
        • 201(已建立)請求成功並且伺服器建立了新的資源。
        • 202(已接受)伺服器已接受請求,但尚未處理。
        • 203(非授權資訊)伺服器已成功處理了請求,但返回的資訊可能來自另一來源。
        • 204(無內容)伺服器成功處理了請求,但沒有返回任何內容。
        • 205(重置內容)伺服器成功處理了請求,但沒有返回任何內容。與 204響應不同,此響應要求請求者重置文件檢視(例如,清除表單內容以輸入新內容)。
        • 206(部分內容) 伺服器成功處理了部分 GET 請求。
      • 3xx(重定向) 要完成請求,需要進一步操作。通常,這些狀態碼用來重定向。Google 建議您在每次請求中使用重定向不要超過 5次。您可以使用網站管理員工具檢視一下 Googlebot 在抓取重定向時是否遇到問題。診斷下的網路抓取頁列出了由於重定向錯誤導致Googlebot 無法抓取的網址。
        • 300(多種選擇) 針對請求,伺服器可執行多種操作。伺服器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。 *301(永久移動) 請求的網頁已永久移動到新位置。伺服器返回此響應(對 GET 或 HEAD請求的響應)時,會自動將請求者轉到新位置。您應使用此程式碼告訴 Googlebot 某個網頁或網站已永久移動到新位置。
        • 302(臨時移動) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來響應以後的請求。此程式碼與響應 GET 和 HEAD 請求的301 程式碼類似,會自動將請求者轉到不同的位置,但您不應使用此程式碼來告訴 Googlebot 某個網頁或網站已經移動,因為Googlebot 會繼續抓取原有位置並編制索引。
        • 303(檢視其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此程式碼。對於除 HEAD之外的所有請求,伺服器會自動轉到其他位置。
        • 304(未修改) 自從上次請求後,請求的網頁未修改過。伺服器返回此響應時,不會返回網頁內容。 如果網頁自請求者上次請求後再也沒有更改過,您應將伺服器配置為返回此響應(稱為 If-Modified-Since HTTP標頭)。伺服器可以告訴 Googlebot 自從上次抓取後網頁沒有變更,進而節省頻寬和開銷。
        • 305(使用代理) 請求者只能使用代理訪問請求的網頁。如果伺服器返回此響應,還表示請求者應使用代理。
        • 307(臨時重定向) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來響應以後的請求。此程式碼與響應 GET 和 HEAD 請求的301程式碼類似,會自動將請求者轉到不同的位置,但您不應使用此程式碼來告訴 Googlebot 某個頁面或網站已經移動,因為 Googlebot會繼續抓取原有位置並編制索引。
        • 4xx(請求錯誤) 這些狀態碼錶示請求可能出錯,妨礙了伺服器的處理。
          • 400(錯誤請求) 伺服器不理解請求的語法。
          • 401(未授權) 請求要求身份驗證。對於登入後請求的網頁,伺服器可能返回此響應。
          • 403(禁止) 伺服器拒絕請求。如果您在 Googlebot 嘗試抓取您網站上的有效網頁時看到此狀態碼(您可以在 Google網站管理員工具診斷下的網路抓取頁面上看到此資訊),可能是您的伺服器或主機拒絕了 Googlebot 訪問。
          • 404(未找到) 伺服器找不到請求的網頁。例如,對於伺服器上不存在的網頁經常會返回此程式碼。 如果您的網站上沒有 robots.txt 檔案,而您在 Google 網站管理員工具“診斷”標籤的 robots.txt頁上看到此狀態碼,則這是正確的狀態碼。但是,如果您有 robots.txt 檔案而又看到此狀態碼,則說明您的 robots.txt檔案可能命名錯誤或位於錯誤的位置(該檔案應當位於頂級域,名為 robots.txt)。 如果對於 Googlebot 抓取的網址看到此狀態碼(在”診斷”標籤的 HTTP 錯誤頁面上),則表示 Googlebot跟隨的可能是另一個頁面的無效連結(是舊連結或輸入有誤的連結)。 *405(方法禁用) 禁用請求中指定的方法。
          • 406(不接受) 無法使用請求的內容特性響應請求的網頁。
          • 407(需要代理授權) 此狀態碼與 401(未授權)類似,但指定請求者應當授權使用代理。如果伺服器返回此響應,還表示請求者應當使用代理。
          • 408(請求超時) 伺服器等候請求時發生超時。
          • 409(衝突) 伺服器在完成請求時發生衝突。伺服器必須在響應中包含有關衝突的資訊。伺服器在響應與前一個請求相沖突的 PUT請求時可能會返回此程式碼,以及兩個請求的差異列表。
          • 410(已刪除) 如果請求的資源已永久刪除,伺服器就會返回此響應。該程式碼與404(未找到)程式碼類似,但在資源以前存在而現在不存在的情況下,有時會用來替代 404 程式碼。如果資源已永久移動,您應使用 301指定資源的新位置。
          • 411(需要有效長度) 伺服器不接受不含有效內容長度標頭欄位的請求。
          • 412(未滿足前提條件) 伺服器未滿足請求者在請求中設定的其中一個前提條件。
          • 413(請求實體過大) 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。
          • 414(請求的 URI 過長) 請求的 URI(通常為網址)過長,伺服器無法處理。
          • 415(不支援的媒體型別) 請求的格式不受請求頁面的支援。
          • 416(請求範圍不符合要求) 如果頁面無法提供請求的範圍,則伺服器會返回此狀態碼。
          • 417(未滿足期望值) 伺服器未滿足”期望”請求標頭欄位的要求。
        • 5xx(伺服器錯誤) 這些狀態碼錶示伺服器在處理請求時發生內部錯誤。這些錯誤可能是伺服器本身的錯誤,而不是請求出錯。
          • 500(伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。
          • 501(尚未實施) 伺服器不具備完成請求的功能。例如,伺服器無法識別請求方法時可能會返回此程式碼。
          • 502(錯誤閘道器) 伺服器作為閘道器或代理,從上游伺服器收到無效響應。
          • 503(服務不可用) 伺服器目前無法使用(由於超載或停機維護)。通常,這只是暫時狀態。
          • 504(閘道器超時) 伺服器作為閘道器或代理,但是沒有及時從上游伺服器收到請求。 *505(HTTP 版本不受支援)
    • 響應頭
      • Location: 響應的需要跳轉的頁面
      • set-cookie: 向瀏覽器傳送cookie
    • 響應體
      • 響應回來的頁面, 需要獲取到

2.2 使用原生JDK完成http請求

  • 使用get方式:
public class JdkGet {

  public static void main(String[] args) throws Exception {
		// 1.指定一個url
		String domain = "http://www.itcast.cn";
		// 2.開啟一個連線
		URL url = new URL(domain);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 3.如果是一個get請求,需要設定請求頭資訊
		// 請求方式,必須是大寫
		conn.setRequestMethod("GET");
		// 4.發起請求
		// 當用戶呼叫getInputStream,其實發送一個請求,並獲得了一個輸入流。
		InputStream inputStream = conn.getInputStream();
		// 5.列印資料
		BufferedReader bufferedReader = new BufferedReader(
				new InputStreamReader(inputStream, Charset.forName("utf-8")));
		String line = null;
		while ((line = bufferedReader.readLine()) != null) {
			System.out.println(line);
		}
	}
	
}
  • 使用post方式:
public class JDKPost {

	public static void main(String[] args) throws Exception {
		//1. 指定URL路徑
		String url  = "http://www.itcast.cn";
		// 2. 建立URL物件
		URL urlObj = new URL(url);
		//3. 開啟一個連線
		HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
		//3.1  指定請求方式
		connection.setRequestMethod("POST");// 注意 這裡使用的POST連線
		//3.2 開啟輸出流
		connection.setDoOutput(true);
		
		//3.3 封裝引數
		OutputStream outputStream = connection.getOutputStream();
		outputStream.write("username=張三&password=123".getBytes());
		//4. 獲取輸入流
		InputStream in = connection.getInputStream();
        //5. 列印資料
		byte[] b = new  byte[1024];
		int len;
		while((len=in.read(b))!=-1) {
			
			System.out.println(new String(b,0,len));
			
		}
		in.close();
		outputStream.close();
	}
}

  • 小結
    • 使用post獲取時, 由於需要將引數通過請求體傳送, 此時就需要一個輸出流, 而原生的JDK方式預設是將輸出流關閉的, 所以需要需要手動設定開啟, 並制定請求方式
		//3.1  指定請求方式
		connection.setRequestMethod("POST");// 注意 這裡使用的POST連線
		//3.2 開啟輸出流
		connection.setDoOutput(true);
		
		//3.3 封裝引數
		OutputStream outputStream = connection.getOutputStream();
		outputStream.write("username=張三&password=123".getBytes());

2.3 使用httpclient完成http請求

  • get方式
public static void main(String[] args) throws Exception {
		
		//1. 指定url
		String url = "http://www.itcast.cn";
		//2. 指定傳送方式,   get
		HttpGet httpGet = new HttpGet(url);
		//3. 獲取httpclient物件
		CloseableHttpClient httpClient = HttpClients.createDefault();
		//4. 執行請求
		CloseableHttpResponse response = httpClient.execute(httpGet);
		
		//5. 獲取網頁資料
		int status = response.getStatusLine().getStatusCode();
		if(status==200) {
			
			String html = EntityUtils.toString(response.getEntity(),Charset.forName("utf-8"));
			System.out.println(html);
		}
		
		response.close();
		httpClient.close();
	}
  • post方式
public static void main(String[] args) throws Exception{
		//1. 指定url
		String url = "http://www.itcast.cn";
		//2. 指定傳送方式 post
		HttpPost httpPost = new HttpPost(url);
		//3. 獲取httpclient例項, 用來執行請求
		CloseableHttpClient httpClient = HttpClients.createDefault();
		
		//3.1 封裝引數
		List <NameValuePair> parameters = new ArrayList<>();
		parameters.add(new BasicNameValuePair("userName", "張三"));
		parameters.add(new BasicNameValuePair("password", "123"));
		HttpEntity entity = new UrlEncodedFormEntity(parameters);
		httpPost.setEntity(entity );
		
		//4. 執行請求
		CloseableHttpResponse response = httpClient.execute(httpPost);
		
		//5. 獲取資料
		int statusCode = response.getStatusLine().getStatusCode();//獲取狀態碼
		if(statusCode==200) {
			String html = EntityUtils.toString(response.getEntity());
			System.out.println(html);
		}
	}
  • 小結
    • 使用httpclient傳送請求, 需要獲取CloseableHttpClient用來執行請求
    • 如果要傳送get請求, 需要獲取httpGet物件
    • 如果需要傳送post請求, 需要獲取httpPost物件
    • 如果post需要進行封裝引數, 需要使用UrlEncodedFormEntity 進行資料封裝

3. 爬蟲的第二大模組: 解析資料

  • 解析資料, 其本質上就是解析網頁, 如何獲取網頁的資料呢?
    • js中提供了DOM操作的, 將一個頁面看做是一個document文件, 然後從文件中獲取資料

###3.1 Document 物件集合

集合 描述
[all] 提供對文件中所有 HTML 元素的訪問。
[anchors] 返回對文件中所有 Anchor 物件的引用。
applets 返回對文件中所有 Applet 物件的引用。
[forms] 返回對文件中所有 Form 物件引用。
[images] 返回對文件中所有 Image 物件引用。
[links] 返回對文件中所有 Area 和 Link 物件引用。

###3.2 Document 物件屬性

屬性 描述
body 提供對 元素的直接訪問。 對於定義了框架集的文件,該屬性引用最外層的 。
設定或返回與當前文件有關的所有 cookie。
返回當前文件的域名。
返回載入當前文件的文件的 URL。
title 返回當前文件的標題。
URL 返回當前文件的 URL。

###3.3 Document 物件方法

方法 描述
關閉用 document.open() 方法開啟的輸出流,並顯示選定的資料。
開啟一個流,以收集來自任何 document.write() 或 document.writeln() 方法的輸出。
向文件寫 HTML 表示式 或 JavaScript 程式碼。
  • 在java中如何去操作呢? 使用jsoup
    • jsoup: 一款專為解析網頁資料而生的技術, 可以通過一套比較省力的API來操作網頁, jsoup提供提供了基於document的解析方式, 可以使用原生的document方式和選擇器的方式來進行資料的獲取
    • 如何使用呢?
        1. 匯入maven依賴
		<dependency>
			<!-- jsoup HTML parser library @ https://jsoup.org/ -->
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.10.3</version>
		</dependency>

​ 2) 獲取document物件

public static void main(String[] args) throws IOException {
       //獲取document的方式
        //1. 通過url路徑獲取
       // Document document = Jsoup.connect("http://www.itcast.cn").get();
       // Document document = Jsoup.connect("http://www.itcast.cn").post();
        //2. 通過HTML程式碼片段獲取
       // String  html = "<li class=\"a_gd innl\"><a href=\"http://www.itcast.cn/subject/javaeezly/index.shtml\" target=\"_blank\"><img src=\"/2018czgw/images/icon_fuli1.jpg\"> <span>學科介紹</span> </a></li>";
        //Document document = Jsoup.parse(html);
        //3. 通過讀取本地的HTML檔案的方式
        Jsoup.parse(new File("c:/a.txt"),"utf-8");

    }

​ 3) 解析網頁 : 先使用原生的api操作

public static void main(String[] args) throws IOException {
        //解析  此 http://www.itcast.cn/subject/uizly/index.shtml
        String url = "http://www.itcast.cn/subject/uizly/index.shtml";
        Document document = Jsoup.connect(url).get();
        //開始解析
        //獲取網頁的標題
        String title = document.title();
        System.out.println(title);
        //獲取網頁  獲取 class屬性為inner的標籤
        Elements divInner = document.getElementsByClass("inner");
        //獲取div下的li標籤
        Elements li = divInner.get(1).getElementsByTag("li");
        System.out.println(li);

    }

​ 4) 解析網頁: 使用選擇器的方式:

說明: jsoup中所使用的選擇器和css的選擇器以及jquery的選擇器是一樣的, 所以可以直接參考css和jquery的選擇器進行使用即可

選擇器 例子 例子描述 CSS
.intro 選擇 class=“intro” 的所有元素。 1
#id #firstname 選擇 id=“firstname” 的所有元素。 1
* * 選擇所有元素。 2
[target] 選擇帶有 target 屬性所有元素。 2
[target=_blank] 選擇 target="_blank" 的所有元素。 2
[title~=flower] 選擇 title 屬性包含單詞 “flower” 的所有元素。 2
[lang|=en] 選擇 lang 屬性值以 “en” 開頭的所有元素。 2
:link a:link 選擇所有未被訪問的連結。 1
a:visited 選擇所有已被訪問的連結。 1
a:active 選擇活動連結。 1
a:hover 選擇滑鼠指標位於其上的連結。 1
input:focus 選擇獲得焦點的 input 元素。 2
p:first-letter 選擇每個

元素的首字母。

1
p:first-line 選擇每個

元素的首行。

1
p:first-child 選擇屬於父元素的第一個子元素的每個

元素。

2
p:before 在每個

元素的內容之前插入內容。

2
p:after 在每個

元素的內容之後插入內容。

2
p:lang(it) 選擇帶有以 “it” 開頭的 lang 屬性值的每個

元素。

2
a[src^=“https”] 選擇其 src 屬性值以 “https” 開頭的每個 元素。 3
a[src$=".pdf"] 選擇其 src 屬性以 “.pdf” 結尾的所有 元素。 3
a[src*=“abc”] 選擇其 src 屬性中包含 “abc” 子串的每個 元素。 3
p:first-of-type 選擇屬於其父元素的首個

元素的每個

元素。

3
p:last-of-type 選擇屬於其父元素的最後

元素的每個

元素。

3
p:only-of-type 選擇屬於其父元素唯一的

元素的每個

元素。

3
p:only-child 選擇屬於其父元素的唯一子元素的每個

元素。

3
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每個

元素。

3
p:nth-last-child(2) 同上,從最後一個子元素開始計數。 3
p:nth-of-type(2) 選擇屬於其父元素第二個

元素的每個

元素。

3
p:nth-last-of-type(2) 同上,但是從最後一個子元素開始計數。 3
p:last-child 選擇屬於其父元素最後一個子元素每個

元素。

3
:root :root 選擇文件的根元素。 3
p:empty 選擇沒有子元素的每個

元素(包括文字節點)。

3
#news:target 選擇當前活動的 #news 元素。 3
input:enabled 選擇每個啟用的 元素。 3
input:disabled 選擇每個禁用的 元素 3
input:checked 選擇每個被選中的 元素。 3
::selection 選擇被使用者選取的元素部分。 3

常用的選擇器:

​ id選擇器, class選擇器, 標籤選擇器, 後代選擇器, 屬性選擇器

3.3.1使用jsoup獲取傳智部落格的課程分類資訊

   public static void main(String[] args) throws IOException {
      //使用選擇器解析資料: www.itcast.cn
        String url = "http://www.itcast.cn";
        Document document = Jsoup.connect(url).get();
        //需求解析出此網頁中的所有的學科
        Elements div = document.select("div.nav_txt");
       // System.out.println(div);
        Elements tagA = div.select("ul li a");
       // System.out.println(tagA);
        for (Element element : tagA){
            //獲取分類課程資訊
            String text = element.text();
            System.out.println(text);
        }

    }

3.3.2獲取新聞內容: 網易新聞

    public static void main(String[] args) throws IOException {
        //獲取網易中某一條新聞的內容: http://news.163.com/18/0714/14/DMMDKIM1000189FH.html
        String url = "http://news.163.com/18/0714/14/DMMDKIM1000189FH.html";
        //使用jsoup獲取document物件:
        Document document = Jsoup.connect(url).get();
        //開始解析網頁:  獲取網頁新聞的標題
        Elements elements = document.select("#epContentLeft>h1");
        String title = elements.text();
        System.out.println(title);
        //獲取新聞的正文
        Elements p = document.select("#endText p");
        for (Element element :p){
            System.out.println(element.text());
        }
        //獲取新聞的來源地
        Elements addr = document.select("div[class=ep-source cDGray] .left");
        System.out.println(addr.text());

    }

4. 爬蟲的第三大模組: 儲存資料

使用jdbcTemplate完成儲存資料到mysql中即可, 後期可以使用hadoop或者hbase均可

##案例一: 讀取小說網站: 起點中文網

  • 需求: 獲取起點中文的24小時的熱銷榜的書名, 讀取其中的一本書的免費章節
  • 要求: 使用httpclient獲取網頁內容, 使用jsoup進行解析
    public static void main(String[] args) throws IOException {
        //讀取起點中文網的小說
        //1. 指定url
        String url = "https://www.qidian.com/";
        //2. 獲取httpclient物件
        CloseableHttpClient httpClient = HttpClients.createDefault();
        
        //3. 獲取請求方式
        HttpGet httpGet = new HttpGet(url);
        //4. 執行請求
        CloseableHttpResponse response = httpClient.execute(httpGet);
        //5. 獲取網頁
        String html = EntityUtils.toString(response.getEntity(), "utf-8");
        //6. 解析網頁
        Document document = Jsoup.parse(html);
        //獲取24小時熱門榜單
        Elements time24H = document.select("div[class=rank-list sort-list]");
        //獲取榜單的標題
        String h3 = time24H.select("h3").text();
        //System.out.println(h3);
        //獲取書籍的列表
        Elements bookList = time24H.select(".book-list li a[href*=book.qidian.com]");
        //System.out.println(bookList);
        //獲取書籍的url
        for(Element element: bookList){

            String href = element.attr("href");
            //url拼接
            String bookUrl ="https:"+href;
            System.out.println(bookUrl+"讀取");
            httpClient = HttpClients.createDefault();
            httpGet = new HttpGet(bookUrl);
            response =  httpClient.execute(httpGet);
            html = EntityUtils.toString(response.getEntity(), "utf-8");
            document = Jsoup.parse(html);

            String readHref = document.select("#readBtn").attr("href");
            readHref = "https:"+readHref;
            while(true) {
                httpClient = HttpClients.createDefault();
                httpGet = new HttpGet(readHref);
                response = httpClient.execute(httpGet);
                html = EntityUtils.toString(response.getEntity(), "utf-8");
                //獲取小說章節的內容(第一章)
                document = Jsoup
            
           

相關推薦

python3爬蟲第一(1)

python urlopen img src 調用 表達式 鏈接 AR 2.3 1.目標:用python3爬取慕課網課程頁的圖片,然後保存到本地。 2。打開pycharm編寫python代碼。思路如下: 2.1 . 從ur

爬蟲第一——add_header()和get_header()

header www fire 請求 agent 10.6 IT request span 1 import urllib.request 2 import random 3 4 url = "http://www.baidu.com/" 5 6 # 可以

Python 爬蟲第一改良版【學習筆記】

晚上改良了下午寫的那個,可以批量獲取新浪新聞網頁了。不過也是搬磚來的別人寫好我抄了一遍。from bs4 import BeautifulSoup as bs import requests import csv import json, re import pandas #csv_file = o

爬蟲第一

今日課程的主要內容 介紹爬蟲的基本概念 爬蟲是什麼 爬蟲的價值 爬蟲的分類 爬蟲的執行原理 爬蟲的三大模組 爬蟲的第一大模組: 獲取資料 原生JDK的方式獲取網頁資料(理解) get方法 post方式 使用httpClient獲取網頁請求(重點

python爬蟲自學第一,全新的開始!

一直在學習,跟著雪峰老師的講解,跟著《Python爬蟲開發與專案實戰》,跟著笨辦法學Python(不得不說確實是新手上路的一本好書),跟著CSDN裡的大神,跟著慕課網的老師,跟著一切能跟著資源......只是今天才開始記錄自己的學習歷程,之前的會慢慢補齊,今天就從“分散式程序”開始記錄吧 話不多少

第一個沖刺周期-第一

申請 問題 環境配置 今天 發的 開發 什麽 學習 配置 站立會議 前面幾天沒什麽進展,一直鼓搗軟件環境,後從Android Studio換到了Eclipse,這幾天才開始弄APP。 今天是第一個沖刺周期的第一天,上周註冊申請了雲數據庫,今天把它連好了,能簡單的存入數據了。

RabbitMQ 第一

spring ini 缺省 plugins 分配權限 gem add erl cloud 一、安裝-Windows 1、安裝erlang 安裝包 otp_win64_19.3.exe (http://www.erlang.org/downloads) 2、安裝rabbit

第一階段沖刺周期10第一

應用程序 兩個 android cli 個人 應用 不足 andro 但是   今天(2017.5.3)是沖刺周期的第一天,我從網上查詢了開發手機軟件的環境,了解到可以使用Android Studio開發,但是此應用程序需要的條件比較高,想到自己的電腦條件不足,於是想用另一

python基礎第一

python基礎 .org 技術 2.7 安裝 官網 pytho http lease   python官網有2.7.x和3.x版本 建議初學者下載2.7.x版本 網上大多數教程是以python2.7.x版本為主 安裝直接next即可 下載地址為:https://w

大白魚備考雲筆記沖刺周期第一

bsp cnblogs 簡單程序 備考 studio 簡單 軟件 技能 運用 今天幹了什麽:今天安裝成功安卓開發工具Android studio,並運行; 明天準備幹什麽:明天準備先去圖書館借閱本關於開發Android studio的書, 並按照書中知識了解開發安卓軟件

學習php第一

出了 進度 如何 但是 學習php 認識 筆記 交流 一個   今天開始學習php了,整體上來說先理清楚需要如何學習,今天主要看了w3c上的php文檔,對於php算是有個最初的認識了,下一步準備開始從視頻教程開始入門,很早以前就整理出了學習資料也該開始學習了。有之前學習js

獲得當前日期所屬的本周第一與最後一

date 獲得 mkt 日期 時間 -m ech 當前 time echo ‘<br>本周起始時間:<br>‘;echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")

python2.7 第一

fuse python2.7 png hello span 不存在 fat alt 如何 第一天必然是“Hello world!” python實現起來很簡單,一行搞定: print "Hello World" 或者用單引號也行 print ‘Hello World‘

【轉載】5不再懼怕多線程——第一 嘗試Thread

堆棧 () ole 命名空間 sage console 我們 exc add 原本準備在mongodb之後寫一個lucene.net系列,不過這幾天用到多線程時才發現自己對多線程的了解少之又少,僅僅停留在lock上面, 故這幾天看了下線程參考手冊結合自己的心得整理一下放在博

python3第一學習(數據類型)

絕對值 pre return col pytho tar .html art 整數 參考blog地址:http://www.cnblogs.com/wupeiqi/articles/5444685.html,然後根據上面知識點練習並總結。 一.數字(int) 1.數字

AngularJs第一

display sco static ssi pla live module apple 參考   http://www.runoob.com/angularjs/angularjs-tutorial.html(參考文檔)。   下載AngularJs的js包 https:

自動化運維第一、基礎自動化工具----正則表達式

表達式正則表達式(grep,sed,awk) 一. 正則表達式正則表達式,又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個

團隊作業8----第二次項目沖刺(Beta階段) 第一

https 照片 最新 -- logs 希望 span img width 沖刺第一天 一、Daily Scrum Meeting照片 二、每個人的工作 1.昨天已完成的任務。 由於是第一天沖刺,暫無。 2.今天計劃完成的任務。 用戶的註冊和登陸功能。 3.

距離第一去實習過去了56 ::寫寫自己的想法

mce clas 互聯 inf 頁面 alert 綠色 htm data 1.從前端說起 HTML從最初的那些標簽,什麽都不懂,<br> &nbsp; 等 不懂<head><body> 這些簡單的標簽 HTML就最為印象深刻的是

團隊作業8——第二次項目沖刺(Beta階段)--第一

新的 .com 進展 作業 logs 貢獻 tab 第一天 str 團隊作業8——第二次項目沖刺(Beta階段)--第一天 會議照片: 燃盡圖: 項目進展: 新的成員在熟悉項目 在計時模式下能夠完程將成績記錄並讀入SD卡中,其他的任務在繼續完成中; 團