爬蟲第一天
今日課程的主要內容
- 介紹爬蟲的基本概念
- 爬蟲是什麼
- 爬蟲的價值
- 爬蟲的分類
- 爬蟲的執行原理
- 爬蟲的三大模組
- 爬蟲的第一大模組: 獲取資料
- 原生JDK的方式獲取網頁資料(理解)
- get方法
- post方式
- 使用httpClient獲取網頁請求(重點)
- get方式
- post方式
- 原生JDK的方式獲取網頁資料(理解)
- 爬蟲的第二大模組: 解析資料
- 使用原生DOM操作(瞭解)
- 對js中相關方法的回顧
- 使用jsoup解析資料(重點)
- 對選擇器的使用
- 使用原生DOM操作(瞭解)
- 爬蟲的第三大模組: 儲存資料
- 使用JDBCTemplate完成資料的儲存工作(mysql)
- 爬蟲的第一大模組: 獲取資料
- 完成一個爬取起點中文網小說的爬蟲程式
- 使用爬蟲完成使用者登入,獲取登陸後的資料
1. 爬蟲的基本概念
1.1 什麼是爬蟲?
網路爬蟲是一種按照一定的規則,自動地抓取全球資訊網資訊的程式 , 通常由三個模組組成: 獲取資料, 解析資料, 儲存資料
1.2爬蟲有什麼價值呢?
- 爬蟲就是用來獲取網際網路的資料的, 資料就是無價之寶,一旦獲取了海量的資料後, 我們就可以對資料進行分類和分析,最終可以做一個網站用來展示分析後的資料: 比如 競價網站 或者 提供使用者各個維度的分析等
- 總結:
- 爬蟲的價值就是獲取資料的價值
- 資料的價值,取決於獲取的資料內容的重要性(比如, 獲取一個網站上每一個使用者的購買記錄)
1.3 爬蟲的分類
- 爬蟲主要分為兩大類:
- 一類: 通用型爬蟲
- 通用型爬蟲主要是用來爬蟲網際網路上的所有的資料, 不限制行業, 不限制分類,這種爬蟲被稱為是通用型的爬蟲, 例如 百度 就是一個巨大的通用型爬蟲了
- 一類: 垂直爬蟲
- 垂直爬蟲主要是用來獲取網站上某一個分類, 或者是某一行業的資料, 這種爬蟲被為是垂直爬蟲, 例如: 慢慢買(商城網站)
- 一類: 通用型爬蟲
- 那麼一般我們需要開發那種型別的爬蟲呢?
- 答案: 是垂直爬蟲, 在開發中, 我們大部分是針對的是某一個行業,或者是某個分類的內容進行獲取, 再加上通用型爬蟲已經非常的發達了, 例如百度, 谷歌
1.4 爬蟲的執行原理
-
清楚爬蟲的作用:
- 用來獲取網路上的資料資源的
-
爬蟲的基本流程:
-
- 指定爬蟲要獲取url
-
- 傳送http請求獲取網頁資料
-
- 解析網頁資料
-
- 儲存資料
-
2. 爬蟲的第一大模組: 獲取資料
- 獲取資料需要使用到HTTP請求
2.1 回顧http請求:
- http的組成:
- 請求:
- 請求行
- 兩種請求方式: get 和post
- get和post的區別:
- 引數放置的位置不同: get存放在url上, post存放在請求體重
- 資料量不同: get是有資料量限制的, 不能傳輸大量的資料, post沒有限制
- 是否有請求體: get是沒有請求體, 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 版本不受支援)
- 1xx(臨時響應):表示臨時響應並需要請求者繼續執行操作的狀態碼。
- 響應頭
- 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方式和選擇器的方式來進行資料的獲取
- 如何使用呢?
-
- 匯入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> 等 不懂<head><body> 這些簡單的標簽
HTML就最為印象深刻的是
團隊作業8——第二次項目沖刺(Beta階段)--第一天
新的 .com 進展 作業 logs 貢獻 tab 第一天 str 團隊作業8——第二次項目沖刺(Beta階段)--第一天
會議照片:
燃盡圖:
項目進展:
新的成員在熟悉項目
在計時模式下能夠完程將成績記錄並讀入SD卡中,其他的任務在繼續完成中;
團