亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

html代碼

html代碼

PHP寫(xiě)微信公眾號文章頁(yè)采集方法

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 459 次瀏覽 ? 2020-07-24 08:04 ? 來(lái)自相關(guān)話(huà)題

 ??;我的正則匹配水平有限,只能寫(xiě)成這樣的了。希望有高手能賜教更好的正則匹配方式。
  另外注意:這個(gè)匹配規則會(huì )可能在一段時(shí)間以后有變化。這篇文章會(huì )盡量保持更新。如果你按照我的文章制作了采集系統以后,當某三天失效了,別忘了回去再瞧瞧文章是否有更新。
  2)內容處理:
  通過(guò)前面的方式我們獲得了文章內容的html,但是你將文章內容顯示下來(lái)以后才會(huì )發(fā)覺(jué),圖片和視頻不能正常顯示。因為這個(gè)html還須要一些加工:
  首先是圖片,微信文章中的標簽中的src屬性全部都用了data-src屬性替代。只有在顯示的時(shí)侯就會(huì )被替換過(guò)來(lái)。所以我們也有兩個(gè)方案,將源代碼直接替換過(guò)來(lái),或者用js在顯示時(shí)侯再替換。下面我先介紹直接替換html的方式:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("data-src","src",$content);
  然后是視頻,視頻的顯示不正常,經(jīng)過(guò)常年測試后發(fā)覺(jué)只要替換一個(gè)頁(yè)面地址才能解決,過(guò)程就不說(shuō)了,直接說(shuō)結果:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("preview.html","player.html",$content);
  通過(guò)這兩個(gè)替換過(guò)后,文章內容html中的圖片和視頻就都正常了。
  3) 公眾號相關(guān)信息:
  通過(guò)本專(zhuān)欄之前的文章,介紹了我們使用陌陌客戶(hù)端,任意打開(kāi)一個(gè)公眾號的歷史消息頁(yè)以后。系統從數據庫中辨識biz的值,發(fā)現數據庫中沒(méi)有記錄,就會(huì )插入一條新的紀錄。之后的采集隊列都會(huì )定期按照這個(gè)biz來(lái)獲取這個(gè)公眾號的歷史消息列表。
  但是我們只獲得了這個(gè)公眾號的biz,公眾號的名稱(chēng),頭像這兩個(gè)重要信息還是沒(méi)有獲取到。主要誘因是歷史消息頁(yè)面中沒(méi)有這兩個(gè)信息。但是我們可以從文章頁(yè)面中獲取到。
  在陌陌文章頁(yè)面html的頂部,有一些js的變量形參的代碼,通過(guò)正則匹配然后我們就可以獲得這兩個(gè)公眾號的信息:
  1
  2
  3
  4
  5
  6
  7
  //$html變量的值是上面獲取到的文章全部html
  preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
  $nickname = $m[1][0];//公眾號愛(ài)稱(chēng)
  preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
  $head_img = $m[1][0];//公眾號頭像
  通過(guò)這兩個(gè)正則匹配,我們才能獲取到公眾號的頭像和愛(ài)稱(chēng),然后按照文章地址中的biz,可以保存到對應的微信號數據表中。
  3、文章的保存和處理
  前面的代碼已然將文章內容獲取到變量中了。如何保存雖然每個(gè)人似乎都有自己的看法。我這兒介紹一下我的保存內容的方式:
  將文章內容的html以數據庫id為文件名保存成html文件,以biz數組為目錄。
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  $dir = "./".$biz."/";
  $filename = $dir.$id.".html";
  if(!is_dir($dir)) {
  mkdir($cache_dir);
  chmod($cache_dir,0777);
  }
  $file = fopen($filename, "w");
  fwrite($file, $content);
  fclose($file);
  以上代碼是一個(gè)標準的php構建文件夾保存文件的代碼,大家可以依照自己的實(shí)際情況安排保存方式。
  在這以后我們就可以在自己的服務(wù)器上得到一個(gè)html文件,內容就是公眾號的文章內容。我們可以從瀏覽器中打開(kāi)看一下。這時(shí)你或許會(huì )發(fā)覺(jué)圖片防盜鏈了!無(wú)法正常顯示!包括數據庫中保存的文章封面圖,公眾號的頭像都是防盜鏈的。
  別急,這個(gè)問(wèn)題挺好解決,只須要將圖片也保存到自己的服務(wù)器,無(wú)非是將來(lái)會(huì )占用自己的服務(wù)器空間和帶寬。
  圖片防盜鏈的原理是當圖片在網(wǎng)頁(yè)中顯示的時(shí)侯php 采集微信文章圖片,圖片服務(wù)器會(huì )測量到引用這張圖片的服務(wù)器域名,當發(fā)覺(jué)服務(wù)器域名不包含或的時(shí)侯才會(huì )被替換成防盜鏈圖片。
  但是假若測量不到引用頁(yè)面的域名才會(huì )正常顯示,所以我們通過(guò)php的函數file_get_content()就可以將圖片的二進(jìn)制代碼獲取過(guò)來(lái),然后按照自己的看法起個(gè)文件名保存到自己的服務(wù)器上。在這里再介紹一個(gè)保存圖片的方式,我目前使用了騰訊云的“萬(wàn)象優(yōu)圖”,通過(guò)它們提供的api將圖片保存到云空間,這樣的用處是讀取圖片時(shí)直接在圖片的鏈接地址加上希望得到的圖片規格大小參數,就可以直接得到一張縮略圖。比存在自己的服務(wù)器便捷得多。阿里云也應當有同樣的產(chǎn)品php 采集微信文章圖片,好像名叫對象儲存。
  另外,我采集公眾號內容的目的是制做成一個(gè)新聞app,在app上將html代碼顯示下來(lái)以后,因為app同樣沒(méi)有域名,防盜鏈服務(wù)器也同樣不會(huì )覺(jué)得圖片被盜鏈了。這樣就可以直接顯示圖片下來(lái)。 查看全部
 ??;我的正則匹配水平有限,只能寫(xiě)成這樣的了。希望有高手能賜教更好的正則匹配方式。
  另外注意:這個(gè)匹配規則會(huì )可能在一段時(shí)間以后有變化。這篇文章會(huì )盡量保持更新。如果你按照我的文章制作了采集系統以后,當某三天失效了,別忘了回去再瞧瞧文章是否有更新。
  2)內容處理:
  通過(guò)前面的方式我們獲得了文章內容的html,但是你將文章內容顯示下來(lái)以后才會(huì )發(fā)覺(jué),圖片和視頻不能正常顯示。因為這個(gè)html還須要一些加工:
  首先是圖片,微信文章中的標簽中的src屬性全部都用了data-src屬性替代。只有在顯示的時(shí)侯就會(huì )被替換過(guò)來(lái)。所以我們也有兩個(gè)方案,將源代碼直接替換過(guò)來(lái),或者用js在顯示時(shí)侯再替換。下面我先介紹直接替換html的方式:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("data-src","src",$content);
  然后是視頻,視頻的顯示不正常,經(jīng)過(guò)常年測試后發(fā)覺(jué)只要替換一個(gè)頁(yè)面地址才能解決,過(guò)程就不說(shuō)了,直接說(shuō)結果:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("preview.html","player.html",$content);
  通過(guò)這兩個(gè)替換過(guò)后,文章內容html中的圖片和視頻就都正常了。
  3) 公眾號相關(guān)信息:
  通過(guò)本專(zhuān)欄之前的文章,介紹了我們使用陌陌客戶(hù)端,任意打開(kāi)一個(gè)公眾號的歷史消息頁(yè)以后。系統從數據庫中辨識biz的值,發(fā)現數據庫中沒(méi)有記錄,就會(huì )插入一條新的紀錄。之后的采集隊列都會(huì )定期按照這個(gè)biz來(lái)獲取這個(gè)公眾號的歷史消息列表。
  但是我們只獲得了這個(gè)公眾號的biz,公眾號的名稱(chēng),頭像這兩個(gè)重要信息還是沒(méi)有獲取到。主要誘因是歷史消息頁(yè)面中沒(méi)有這兩個(gè)信息。但是我們可以從文章頁(yè)面中獲取到。
  在陌陌文章頁(yè)面html的頂部,有一些js的變量形參的代碼,通過(guò)正則匹配然后我們就可以獲得這兩個(gè)公眾號的信息:
  1
  2
  3
  4
  5
  6
  7
  //$html變量的值是上面獲取到的文章全部html
  preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
  $nickname = $m[1][0];//公眾號愛(ài)稱(chēng)
  preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
  $head_img = $m[1][0];//公眾號頭像
  通過(guò)這兩個(gè)正則匹配,我們才能獲取到公眾號的頭像和愛(ài)稱(chēng),然后按照文章地址中的biz,可以保存到對應的微信號數據表中。
  3、文章的保存和處理
  前面的代碼已然將文章內容獲取到變量中了。如何保存雖然每個(gè)人似乎都有自己的看法。我這兒介紹一下我的保存內容的方式:
  將文章內容的html以數據庫id為文件名保存成html文件,以biz數組為目錄。
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  $dir = "./".$biz."/";
  $filename = $dir.$id.".html";
  if(!is_dir($dir)) {
  mkdir($cache_dir);
  chmod($cache_dir,0777);
  }
  $file = fopen($filename, "w");
  fwrite($file, $content);
  fclose($file);
  以上代碼是一個(gè)標準的php構建文件夾保存文件的代碼,大家可以依照自己的實(shí)際情況安排保存方式。
  在這以后我們就可以在自己的服務(wù)器上得到一個(gè)html文件,內容就是公眾號的文章內容。我們可以從瀏覽器中打開(kāi)看一下。這時(shí)你或許會(huì )發(fā)覺(jué)圖片防盜鏈了!無(wú)法正常顯示!包括數據庫中保存的文章封面圖,公眾號的頭像都是防盜鏈的。
  別急,這個(gè)問(wèn)題挺好解決,只須要將圖片也保存到自己的服務(wù)器,無(wú)非是將來(lái)會(huì )占用自己的服務(wù)器空間和帶寬。
  圖片防盜鏈的原理是當圖片在網(wǎng)頁(yè)中顯示的時(shí)侯php 采集微信文章圖片,圖片服務(wù)器會(huì )測量到引用這張圖片的服務(wù)器域名,當發(fā)覺(jué)服務(wù)器域名不包含或的時(shí)侯才會(huì )被替換成防盜鏈圖片。
  但是假若測量不到引用頁(yè)面的域名才會(huì )正常顯示,所以我們通過(guò)php的函數file_get_content()就可以將圖片的二進(jìn)制代碼獲取過(guò)來(lái),然后按照自己的看法起個(gè)文件名保存到自己的服務(wù)器上。在這里再介紹一個(gè)保存圖片的方式,我目前使用了騰訊云的“萬(wàn)象優(yōu)圖”,通過(guò)它們提供的api將圖片保存到云空間,這樣的用處是讀取圖片時(shí)直接在圖片的鏈接地址加上希望得到的圖片規格大小參數,就可以直接得到一張縮略圖。比存在自己的服務(wù)器便捷得多。阿里云也應當有同樣的產(chǎn)品php 采集微信文章圖片,好像名叫對象儲存。
  另外,我采集公眾號內容的目的是制做成一個(gè)新聞app,在app上將html代碼顯示下來(lái)以后,因為app同樣沒(méi)有域名,防盜鏈服務(wù)器也同樣不會(huì )覺(jué)得圖片被盜鏈了。這樣就可以直接顯示圖片下來(lái)。

【原創(chuàng )源碼】網(wǎng)絡(luò )爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 370 次瀏覽 ? 2020-07-02 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  最近因為女朋友工作需求,需要獲取各大團購網(wǎng)站上的店家信息,這樣自動(dòng)一個(gè)一個(gè)點(diǎn)不得氣死,于是我就寫(xiě)了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)來(lái)解決這個(gè)問(wèn)題,是用java寫(xiě)的,主要用到了兩個(gè)開(kāi)源庫,httpclient和jsoup...用來(lái)獲取網(wǎng)頁(yè)數據和得到想要的數據,不過(guò)最好是有點(diǎn)web基礎網(wǎng)絡(luò )爬蟲(chóng)代碼,這樣就可以只要想要的值,不然會(huì )有很多沒(méi)用的數據,后期還要自動(dòng)刪掉,比較麻煩...下面附上源碼和說(shuō)明...
  [Asm] 純文本查看 復制代碼
  public static String getHtmlByUrl(String url){
String html = null;

HttpClient httpClient = new DefaultHttpClient();//創(chuàng )建httpClient對象
HttpGet httpget = new HttpGet(url);//以get方式請求該URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce對象
int resStatu = responce.getStatusLine().getStatusCode();//返回碼
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不對
//獲得相應實(shí)體
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//獲得html源代碼

InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("訪(fǎng)問(wèn)【"+url+"】出現異常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}

return html;
}
  上面的就是httpclient庫的內容,用它來(lái)獲取html頁(yè)面的數據
  [Java] 純文本查看 復制代碼
  public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要獲取數據的網(wǎng)址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基礎的話(huà),可以設置一下這里,知道自己想要的數據

for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
  這個(gè)就是解析獲取來(lái)的html數據,找到自己想要的數據....
  然后把取到的數據存入excel獲取txt里就隨大伙便了,不過(guò)這個(gè)方式有一個(gè)漏洞就是,只能取靜態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面未能實(shí)現,我還要再繼續研究一下,研究下來(lái)了,再發(fā)下來(lái),如果有哪些不懂的網(wǎng)絡(luò )爬蟲(chóng)代碼,可以問(wèn)我,知道的一定告訴你們,希望你們多評分,多鼓勵,非常謝謝?。。?! 查看全部

  
  最近因為女朋友工作需求,需要獲取各大團購網(wǎng)站上的店家信息,這樣自動(dòng)一個(gè)一個(gè)點(diǎn)不得氣死,于是我就寫(xiě)了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)來(lái)解決這個(gè)問(wèn)題,是用java寫(xiě)的,主要用到了兩個(gè)開(kāi)源庫,httpclient和jsoup...用來(lái)獲取網(wǎng)頁(yè)數據和得到想要的數據,不過(guò)最好是有點(diǎn)web基礎網(wǎng)絡(luò )爬蟲(chóng)代碼,這樣就可以只要想要的值,不然會(huì )有很多沒(méi)用的數據,后期還要自動(dòng)刪掉,比較麻煩...下面附上源碼和說(shuō)明...
  [Asm] 純文本查看 復制代碼
  public static String getHtmlByUrl(String url){
String html = null;

HttpClient httpClient = new DefaultHttpClient();//創(chuàng )建httpClient對象
HttpGet httpget = new HttpGet(url);//以get方式請求該URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce對象
int resStatu = responce.getStatusLine().getStatusCode();//返回碼
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不對
//獲得相應實(shí)體
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//獲得html源代碼

InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("訪(fǎng)問(wèn)【"+url+"】出現異常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}

return html;
}
  上面的就是httpclient庫的內容,用它來(lái)獲取html頁(yè)面的數據
  [Java] 純文本查看 復制代碼
  public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要獲取數據的網(wǎng)址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基礎的話(huà),可以設置一下這里,知道自己想要的數據

for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
  這個(gè)就是解析獲取來(lái)的html數據,找到自己想要的數據....
  然后把取到的數據存入excel獲取txt里就隨大伙便了,不過(guò)這個(gè)方式有一個(gè)漏洞就是,只能取靜態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面未能實(shí)現,我還要再繼續研究一下,研究下來(lái)了,再發(fā)下來(lái),如果有哪些不懂的網(wǎng)絡(luò )爬蟲(chóng)代碼,可以問(wèn)我,知道的一定告訴你們,希望你們多評分,多鼓勵,非常謝謝?。。?!

java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 314 次瀏覽 ? 2020-05-15 08:01 ? 來(lái)自相關(guān)話(huà)題

  更新時(shí)間:2017年11月13日 08:50:04 作者:在遠行的路上
  這篇文章主要介紹了java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例,還是挺不錯的,這里分享給你們,需要的同學(xué)可以參考下。
  目前市面上流行的爬蟲(chóng)以python居多,簡(jiǎn)單了解過(guò)后網(wǎng)絡(luò )爬蟲(chóng)代碼,覺(jué)得簡(jiǎn)單的一些頁(yè)面的爬蟲(chóng),主要就是去解析目標頁(yè)面(html)。那么就在想網(wǎng)絡(luò )爬蟲(chóng)代碼,java有沒(méi)有用戶(hù)便捷解析html頁(yè)面呢?找到了一個(gè)jsoup包,一個(gè)十分便捷解析html的工具呢。
  使用方法也十分簡(jiǎn)單,引入jar包:
  
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
  使用http工具,請求獲取目標頁(yè)面的整個(gè)html頁(yè)面信息,然后使用jsoup解析:
  
//獲取html頁(yè)面信息
String html = getHtml();
//使用jsoup將html解析為Document對象
Document doc = Jsoup.parse(html);
//后續操作就可以解析這個(gè)DOM樹(shù)了,非常簡(jiǎn)單。
  總結
  以上就是本文關(guān)于java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例的全部?jì)热?,希望對你們有所幫助。感興趣的同學(xué)可以繼續參閱本站: 查看全部

  更新時(shí)間:2017年11月13日 08:50:04 作者:在遠行的路上
  這篇文章主要介紹了java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例,還是挺不錯的,這里分享給你們,需要的同學(xué)可以參考下。
  目前市面上流行的爬蟲(chóng)以python居多,簡(jiǎn)單了解過(guò)后網(wǎng)絡(luò )爬蟲(chóng)代碼,覺(jué)得簡(jiǎn)單的一些頁(yè)面的爬蟲(chóng),主要就是去解析目標頁(yè)面(html)。那么就在想網(wǎng)絡(luò )爬蟲(chóng)代碼,java有沒(méi)有用戶(hù)便捷解析html頁(yè)面呢?找到了一個(gè)jsoup包,一個(gè)十分便捷解析html的工具呢。
  使用方法也十分簡(jiǎn)單,引入jar包:
  
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
  使用http工具,請求獲取目標頁(yè)面的整個(gè)html頁(yè)面信息,然后使用jsoup解析:
  
//獲取html頁(yè)面信息
String html = getHtml();
//使用jsoup將html解析為Document對象
Document doc = Jsoup.parse(html);
//后續操作就可以解析這個(gè)DOM樹(shù)了,非常簡(jiǎn)單。
  總結
  以上就是本文關(guān)于java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例的全部?jì)热?,希望對你們有所幫助。感興趣的同學(xué)可以繼續參閱本站:

爬蟲(chóng)基本原理

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 371 次瀏覽 ? 2020-05-14 08:08 ? 來(lái)自相關(guān)話(huà)題

  這篇文章的定位是,給有一些python基礎,但是對爬蟲(chóng)一無(wú)所知的人寫(xiě)的。文中只會(huì )涉及到爬蟲(chóng)最核心的部份,完全避免莫名其妙的坑或概念,讓讀者認為爬蟲(chóng)是一件極其簡(jiǎn)單的事情,而事實(shí)上爬蟲(chóng)確實(shí)是一件極其簡(jiǎn)單的事情(如果你不是以爬蟲(chóng)為工作的話(huà))。
  本文分為如下幾個(gè)部份
  簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
  首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
  下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的
  
  
  抓取標題完整代碼如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  這樣才會(huì )復印出所有標題,展示一部分如下
  
  
  上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的
  
  
  我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
  注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
  pip install requests
pip install beautifulsoup4
  知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
  1.URL
  URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
  但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片
  
  
  這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
  不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
  r = requests.get('https://www.csdn.net/')
  就是在將URL傳入懇求函數。
  2.網(wǎng)頁(yè)懇求
  說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
  而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
  我們可以print(r.text)看一下上面有哪些東西
  
  
  我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)
  
  
  源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
  r = requests.get('https://www.csdn.net/')
  再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
  但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
  3.網(wǎng)頁(yè)解析
  網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
  因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
  為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
  引用維基百科中的一段話(huà)來(lái)介紹HTML
  超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
  為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
  <!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
  保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面
  
  
  你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
  接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
  再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
  但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
  為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
  css句子類(lèi)似這樣
  h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
  即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
  p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
  在HTML代碼中則這樣寫(xiě)
  <p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
  所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
  做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
  如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
  現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
  把上面的代碼再粘貼一遍如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  解釋一下里面代碼的過(guò)程
  可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
  那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
  我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
  用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示
  
  
 ?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
  這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
  其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示
  
  
  可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
  當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
  雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。
  
  
  在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示
  
  
  當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
  現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
  如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
  如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
  在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
  爬蟲(chóng)代碼改進(jìn)(一)
  爬蟲(chóng)代碼改進(jìn)(二)
  爬蟲(chóng)代碼改進(jìn)(三)
  專(zhuān)欄主頁(yè):python編程
  專(zhuān)欄目錄:目錄
  爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
  版本說(shuō)明:軟件及包版本說(shuō)明 查看全部

  這篇文章的定位是,給有一些python基礎,但是對爬蟲(chóng)一無(wú)所知的人寫(xiě)的。文中只會(huì )涉及到爬蟲(chóng)最核心的部份,完全避免莫名其妙的坑或概念,讓讀者認為爬蟲(chóng)是一件極其簡(jiǎn)單的事情,而事實(shí)上爬蟲(chóng)確實(shí)是一件極其簡(jiǎn)單的事情(如果你不是以爬蟲(chóng)為工作的話(huà))。
  本文分為如下幾個(gè)部份
  簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
  首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
  下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的
  
  
  抓取標題完整代碼如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  這樣才會(huì )復印出所有標題,展示一部分如下
  
  
  上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的
  
  
  我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
  注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
  pip install requests
pip install beautifulsoup4
  知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
  1.URL
  URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
  但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片
  
  
  這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
  不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
  r = requests.get('https://www.csdn.net/')
  就是在將URL傳入懇求函數。
  2.網(wǎng)頁(yè)懇求
  說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
  而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
  我們可以print(r.text)看一下上面有哪些東西
  
  
  我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)
  
  
  源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
  r = requests.get('https://www.csdn.net/')
  再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
  但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
  3.網(wǎng)頁(yè)解析
  網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
  因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
  為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
  引用維基百科中的一段話(huà)來(lái)介紹HTML
  超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
  為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
  <!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
  保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面
  
  
  你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
  接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
  再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
  但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
  為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
  css句子類(lèi)似這樣
  h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
  即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
  p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
  在HTML代碼中則這樣寫(xiě)
  <p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
  所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
  做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
  如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
  現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
  把上面的代碼再粘貼一遍如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  解釋一下里面代碼的過(guò)程
  可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
  那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
  我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
  用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示
  
  
 ?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
  這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
  其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示
  
  
  可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
  當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
  雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。
  
  
  在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示
  
  
  當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
  現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
  如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
  如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
  在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
  爬蟲(chóng)代碼改進(jìn)(一)
  爬蟲(chóng)代碼改進(jìn)(二)
  爬蟲(chóng)代碼改進(jìn)(三)
  專(zhuān)欄主頁(yè):python編程
  專(zhuān)欄目錄:目錄
  爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
  版本說(shuō)明:軟件及包版本說(shuō)明

了解網(wǎng)頁(yè)結構

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 297 次瀏覽 ? 2020-05-08 08:01 ? 來(lái)自相關(guān)話(huà)題

  學(xué)習資料:
  學(xué)習爬蟲(chóng), 首先要懂的是網(wǎng)頁(yè). 支撐起各類(lèi)光鮮亮麗的網(wǎng)頁(yè)的不是別的, 全都是一些代碼.這種代碼我們稱(chēng)之為 HTML,HTML 是一種瀏覽器(Chrome, Safari, IE, Firefox等)看得懂的語(yǔ)言, 瀏覽器能將這些語(yǔ)言轉換成我們用肉眼見(jiàn)到的網(wǎng)頁(yè).所以 HTML 里面必將存在著(zhù)好多規律, 我們的爬蟲(chóng)還能根據這樣的規律來(lái)爬取你須要的信息.
  其實(shí)不僅 HTML, 一同打造多彩/多功能網(wǎng)頁(yè)的組件還有 CSS 和. 但是這個(gè)簡(jiǎn)單的爬蟲(chóng)教程,大部分時(shí)間會(huì )將會(huì )使用 HTML.CSS 和 JavaScript 會(huì )在后期簡(jiǎn)單介紹一下. 因為爬網(wǎng)頁(yè)的時(shí)侯多多少少還是要和 CSS JavaScript 打交道的.
  
  雖然莫煩Python主打的是機器學(xué)習的教程. 但是這個(gè)爬蟲(chóng)教程適用于任何想學(xué)爬蟲(chóng)的朋友們.從機器學(xué)習的角度看爬蟲(chóng)結構, 機器學(xué)習中的大量數據, 也是可以從這種網(wǎng)頁(yè)中來(lái), 使用爬蟲(chóng)來(lái)爬取各類(lèi)網(wǎng)頁(yè)里面的信息, 然后再裝入各類(lèi)機器學(xué)習的方式,這樣的應用途徑正在越來(lái)越多被采用. 所以假如你的數據也是分散在各個(gè)網(wǎng)頁(yè)中, 爬蟲(chóng)是你降低人力勞動(dòng)的必修課.
  網(wǎng)頁(yè)基本組成部分
  在真正步入爬蟲(chóng)之前, 我們先來(lái)做一下熱身運動(dòng), 弄明白網(wǎng)頁(yè)的基礎, HTML 有什么組成部分,是怎么樣運作的. 如果你早已十分熟悉網(wǎng)頁(yè)的構造了, 歡迎直接跳過(guò)這一節, 進(jìn)入下邊的學(xué)習.
  我制做了一個(gè)特別簡(jiǎn)易的網(wǎng)頁(yè), 給你們呈現以下最肉感的 HTML 結構.如果你點(diǎn)開(kāi)它, 呈現在你眼前的, 就是下邊這張圖的上半部份. 而下半部份就是我們網(wǎng)頁(yè)背后的 HTML code.
  
  想問(wèn)我是怎么見(jiàn)到 HTML 的 source code 的? 其實(shí)很簡(jiǎn)單, 在你的瀏覽器中 (我用的是 Google Chrome),顯示網(wǎng)頁(yè)的地方, 點(diǎn)擊滑鼠右鍵,大多數瀏覽器就會(huì )有類(lèi)似這樣一個(gè)選項 “View Page Source”. 點(diǎn)擊它能夠看見(jiàn)頁(yè)面的源碼了.
  
  在 HTML 中, 基本上所有的實(shí)體內容, 都會(huì )有個(gè) tag 來(lái)框住它. 而這個(gè)被 tag 住的內容, 就可以被展示成不同的方式, 或有不同的功能.主體的 tag 分成兩部份, header 和 body. 在 header 中, 存放這一些網(wǎng)頁(yè)的網(wǎng)頁(yè)的元信息, 比如說(shuō) title, 這些信息是不會(huì )被顯示到你看見(jiàn)的網(wǎng)頁(yè)中的.這些信息大多數時(shí)侯是給瀏覽器看, 或者是給搜索引擎的爬蟲(chóng)看.
  <head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
  HTML 的第二大塊是 body, 這個(gè)部份才是你看見(jiàn)的網(wǎng)頁(yè)信息. 網(wǎng)頁(yè)中的 heading, 視頻, 圖片和文字等都儲存在這里.這里的 <h1></h1> tag 就是主標題, 我們看見(jiàn)呈現下來(lái)的療效就是大一號的文字. <p></p> 里面的文字就是一個(gè)段落.<a></a>里面都是一些鏈接. 所以好多情況, 東西都是置于這種 tag 中的.
  <body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
  爬蟲(chóng)想要做的就是按照這種 tag 來(lái)找到合適的信息.
  用 Python 登錄網(wǎng)頁(yè)
  好了, 對網(wǎng)頁(yè)結構和 HTML 有了一些基本認識之后, 我們能夠用 Python 來(lái)爬取這個(gè)網(wǎng)頁(yè)的一些基本信息.首先要做的, 是使用 Python 來(lái)登入這個(gè)網(wǎng)頁(yè), 并復印出這個(gè)網(wǎng)頁(yè) HTML 的 source code.注意, 因為網(wǎng)頁(yè)中存在英文, 為了正常顯示英文, read() 完之后, 我們要對讀下來(lái)的文字進(jìn)行轉換, decode() 成可以正常顯示英文的方式.
  from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
  print 出來(lái)就是下邊這樣啦. 這就證明了我們能否成功讀取這個(gè)網(wǎng)頁(yè)的所有信息了. 但我們還沒(méi)有對網(wǎng)頁(yè)的信息進(jìn)行匯總和借助.我們發(fā)覺(jué), 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
  <!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
</html>
  匹配網(wǎng)頁(yè)內容
  所以這兒我們使用 Python 的正則表達式 RegEx 進(jìn)行匹配文字, 篩選信息的工作. 我有一個(gè)很不錯的正則表達式的教程,如果是中級的網(wǎng)頁(yè)匹配, 我們使用正則完全就可以了, 高級一點(diǎn)或則比較冗長(cháng)的匹配, 我還是推薦使用 BeautifulSoup.不急不急, 我知道你想偷懶, 我然后馬上還會(huì )教 beautiful soup 了. 但是如今我們還是使用正則來(lái)做幾個(gè)簡(jiǎn)單的事例, 讓你熟悉一下套路.
  如果我們想用代碼找到這個(gè)網(wǎng)頁(yè)的 title, 我們能夠這樣寫(xiě). 選好要使用的 tag 名稱(chēng) <title>. 使用正則匹配.
  import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫煩Python
  如果想要找到中間的那種段落 <p>, 我們使用下邊方式, 因為這個(gè)段落在 HTML 中還參雜著(zhù) tab, new line, 所以我們給一個(gè)flags=re.DOTALL 來(lái)對那些 tab, new line 不敏感.
  res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
  最后一個(gè)練習是找一找所有的鏈接, 這個(gè)比較有用, 有時(shí)候你想找到網(wǎng)頁(yè)里的鏈接, 然后下載一些內容到筆記本里,就靠這樣的途徑了.
  res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
  下次我們就來(lái)瞧瞧為了圖方面爬蟲(chóng)結構, 我們怎樣使用 BeautifulSoup.
  相關(guān)教程 查看全部

  學(xué)習資料:
  學(xué)習爬蟲(chóng), 首先要懂的是網(wǎng)頁(yè). 支撐起各類(lèi)光鮮亮麗的網(wǎng)頁(yè)的不是別的, 全都是一些代碼.這種代碼我們稱(chēng)之為 HTML,HTML 是一種瀏覽器(Chrome, Safari, IE, Firefox等)看得懂的語(yǔ)言, 瀏覽器能將這些語(yǔ)言轉換成我們用肉眼見(jiàn)到的網(wǎng)頁(yè).所以 HTML 里面必將存在著(zhù)好多規律, 我們的爬蟲(chóng)還能根據這樣的規律來(lái)爬取你須要的信息.
  其實(shí)不僅 HTML, 一同打造多彩/多功能網(wǎng)頁(yè)的組件還有 CSS 和. 但是這個(gè)簡(jiǎn)單的爬蟲(chóng)教程,大部分時(shí)間會(huì )將會(huì )使用 HTML.CSS 和 JavaScript 會(huì )在后期簡(jiǎn)單介紹一下. 因為爬網(wǎng)頁(yè)的時(shí)侯多多少少還是要和 CSS JavaScript 打交道的.
  
  雖然莫煩Python主打的是機器學(xué)習的教程. 但是這個(gè)爬蟲(chóng)教程適用于任何想學(xué)爬蟲(chóng)的朋友們.從機器學(xué)習的角度看爬蟲(chóng)結構, 機器學(xué)習中的大量數據, 也是可以從這種網(wǎng)頁(yè)中來(lái), 使用爬蟲(chóng)來(lái)爬取各類(lèi)網(wǎng)頁(yè)里面的信息, 然后再裝入各類(lèi)機器學(xué)習的方式,這樣的應用途徑正在越來(lái)越多被采用. 所以假如你的數據也是分散在各個(gè)網(wǎng)頁(yè)中, 爬蟲(chóng)是你降低人力勞動(dòng)的必修課.
  網(wǎng)頁(yè)基本組成部分
  在真正步入爬蟲(chóng)之前, 我們先來(lái)做一下熱身運動(dòng), 弄明白網(wǎng)頁(yè)的基礎, HTML 有什么組成部分,是怎么樣運作的. 如果你早已十分熟悉網(wǎng)頁(yè)的構造了, 歡迎直接跳過(guò)這一節, 進(jìn)入下邊的學(xué)習.
  我制做了一個(gè)特別簡(jiǎn)易的網(wǎng)頁(yè), 給你們呈現以下最肉感的 HTML 結構.如果你點(diǎn)開(kāi)它, 呈現在你眼前的, 就是下邊這張圖的上半部份. 而下半部份就是我們網(wǎng)頁(yè)背后的 HTML code.
  
  想問(wèn)我是怎么見(jiàn)到 HTML 的 source code 的? 其實(shí)很簡(jiǎn)單, 在你的瀏覽器中 (我用的是 Google Chrome),顯示網(wǎng)頁(yè)的地方, 點(diǎn)擊滑鼠右鍵,大多數瀏覽器就會(huì )有類(lèi)似這樣一個(gè)選項 “View Page Source”. 點(diǎn)擊它能夠看見(jiàn)頁(yè)面的源碼了.
  
  在 HTML 中, 基本上所有的實(shí)體內容, 都會(huì )有個(gè) tag 來(lái)框住它. 而這個(gè)被 tag 住的內容, 就可以被展示成不同的方式, 或有不同的功能.主體的 tag 分成兩部份, header 和 body. 在 header 中, 存放這一些網(wǎng)頁(yè)的網(wǎng)頁(yè)的元信息, 比如說(shuō) title, 這些信息是不會(huì )被顯示到你看見(jiàn)的網(wǎng)頁(yè)中的.這些信息大多數時(shí)侯是給瀏覽器看, 或者是給搜索引擎的爬蟲(chóng)看.
  <head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
  HTML 的第二大塊是 body, 這個(gè)部份才是你看見(jiàn)的網(wǎng)頁(yè)信息. 網(wǎng)頁(yè)中的 heading, 視頻, 圖片和文字等都儲存在這里.這里的 <h1></h1> tag 就是主標題, 我們看見(jiàn)呈現下來(lái)的療效就是大一號的文字. <p></p> 里面的文字就是一個(gè)段落.<a></a>里面都是一些鏈接. 所以好多情況, 東西都是置于這種 tag 中的.
  <body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
  爬蟲(chóng)想要做的就是按照這種 tag 來(lái)找到合適的信息.
  用 Python 登錄網(wǎng)頁(yè)
  好了, 對網(wǎng)頁(yè)結構和 HTML 有了一些基本認識之后, 我們能夠用 Python 來(lái)爬取這個(gè)網(wǎng)頁(yè)的一些基本信息.首先要做的, 是使用 Python 來(lái)登入這個(gè)網(wǎng)頁(yè), 并復印出這個(gè)網(wǎng)頁(yè) HTML 的 source code.注意, 因為網(wǎng)頁(yè)中存在英文, 為了正常顯示英文, read() 完之后, 我們要對讀下來(lái)的文字進(jìn)行轉換, decode() 成可以正常顯示英文的方式.
  from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
  print 出來(lái)就是下邊這樣啦. 這就證明了我們能否成功讀取這個(gè)網(wǎng)頁(yè)的所有信息了. 但我們還沒(méi)有對網(wǎng)頁(yè)的信息進(jìn)行匯總和借助.我們發(fā)覺(jué), 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
  <!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
</html>
  匹配網(wǎng)頁(yè)內容
  所以這兒我們使用 Python 的正則表達式 RegEx 進(jìn)行匹配文字, 篩選信息的工作. 我有一個(gè)很不錯的正則表達式的教程,如果是中級的網(wǎng)頁(yè)匹配, 我們使用正則完全就可以了, 高級一點(diǎn)或則比較冗長(cháng)的匹配, 我還是推薦使用 BeautifulSoup.不急不急, 我知道你想偷懶, 我然后馬上還會(huì )教 beautiful soup 了. 但是如今我們還是使用正則來(lái)做幾個(gè)簡(jiǎn)單的事例, 讓你熟悉一下套路.
  如果我們想用代碼找到這個(gè)網(wǎng)頁(yè)的 title, 我們能夠這樣寫(xiě). 選好要使用的 tag 名稱(chēng) <title>. 使用正則匹配.
  import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫煩Python
  如果想要找到中間的那種段落 <p>, 我們使用下邊方式, 因為這個(gè)段落在 HTML 中還參雜著(zhù) tab, new line, 所以我們給一個(gè)flags=re.DOTALL 來(lái)對那些 tab, new line 不敏感.
  res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
  最后一個(gè)練習是找一找所有的鏈接, 這個(gè)比較有用, 有時(shí)候你想找到網(wǎng)頁(yè)里的鏈接, 然后下載一些內容到筆記本里,就靠這樣的途徑了.
  res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
  下次我們就來(lái)瞧瞧為了圖方面爬蟲(chóng)結構, 我們怎樣使用 BeautifulSoup.
  相關(guān)教程

PHP寫(xiě)微信公眾號文章頁(yè)采集方法

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 459 次瀏覽 ? 2020-07-24 08:04 ? 來(lái)自相關(guān)話(huà)題

 ??;我的正則匹配水平有限,只能寫(xiě)成這樣的了。希望有高手能賜教更好的正則匹配方式。
  另外注意:這個(gè)匹配規則會(huì )可能在一段時(shí)間以后有變化。這篇文章會(huì )盡量保持更新。如果你按照我的文章制作了采集系統以后,當某三天失效了,別忘了回去再瞧瞧文章是否有更新。
  2)內容處理:
  通過(guò)前面的方式我們獲得了文章內容的html,但是你將文章內容顯示下來(lái)以后才會(huì )發(fā)覺(jué),圖片和視頻不能正常顯示。因為這個(gè)html還須要一些加工:
  首先是圖片,微信文章中的標簽中的src屬性全部都用了data-src屬性替代。只有在顯示的時(shí)侯就會(huì )被替換過(guò)來(lái)。所以我們也有兩個(gè)方案,將源代碼直接替換過(guò)來(lái),或者用js在顯示時(shí)侯再替換。下面我先介紹直接替換html的方式:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("data-src","src",$content);
  然后是視頻,視頻的顯示不正常,經(jīng)過(guò)常年測試后發(fā)覺(jué)只要替換一個(gè)頁(yè)面地址才能解決,過(guò)程就不說(shuō)了,直接說(shuō)結果:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("preview.html","player.html",$content);
  通過(guò)這兩個(gè)替換過(guò)后,文章內容html中的圖片和視頻就都正常了。
  3) 公眾號相關(guān)信息:
  通過(guò)本專(zhuān)欄之前的文章,介紹了我們使用陌陌客戶(hù)端,任意打開(kāi)一個(gè)公眾號的歷史消息頁(yè)以后。系統從數據庫中辨識biz的值,發(fā)現數據庫中沒(méi)有記錄,就會(huì )插入一條新的紀錄。之后的采集隊列都會(huì )定期按照這個(gè)biz來(lái)獲取這個(gè)公眾號的歷史消息列表。
  但是我們只獲得了這個(gè)公眾號的biz,公眾號的名稱(chēng),頭像這兩個(gè)重要信息還是沒(méi)有獲取到。主要誘因是歷史消息頁(yè)面中沒(méi)有這兩個(gè)信息。但是我們可以從文章頁(yè)面中獲取到。
  在陌陌文章頁(yè)面html的頂部,有一些js的變量形參的代碼,通過(guò)正則匹配然后我們就可以獲得這兩個(gè)公眾號的信息:
  1
  2
  3
  4
  5
  6
  7
  //$html變量的值是上面獲取到的文章全部html
  preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
  $nickname = $m[1][0];//公眾號愛(ài)稱(chēng)
  preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
  $head_img = $m[1][0];//公眾號頭像
  通過(guò)這兩個(gè)正則匹配,我們才能獲取到公眾號的頭像和愛(ài)稱(chēng),然后按照文章地址中的biz,可以保存到對應的微信號數據表中。
  3、文章的保存和處理
  前面的代碼已然將文章內容獲取到變量中了。如何保存雖然每個(gè)人似乎都有自己的看法。我這兒介紹一下我的保存內容的方式:
  將文章內容的html以數據庫id為文件名保存成html文件,以biz數組為目錄。
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  $dir = "./".$biz."/";
  $filename = $dir.$id.".html";
  if(!is_dir($dir)) {
  mkdir($cache_dir);
  chmod($cache_dir,0777);
  }
  $file = fopen($filename, "w");
  fwrite($file, $content);
  fclose($file);
  以上代碼是一個(gè)標準的php構建文件夾保存文件的代碼,大家可以依照自己的實(shí)際情況安排保存方式。
  在這以后我們就可以在自己的服務(wù)器上得到一個(gè)html文件,內容就是公眾號的文章內容。我們可以從瀏覽器中打開(kāi)看一下。這時(shí)你或許會(huì )發(fā)覺(jué)圖片防盜鏈了!無(wú)法正常顯示!包括數據庫中保存的文章封面圖,公眾號的頭像都是防盜鏈的。
  別急,這個(gè)問(wèn)題挺好解決,只須要將圖片也保存到自己的服務(wù)器,無(wú)非是將來(lái)會(huì )占用自己的服務(wù)器空間和帶寬。
  圖片防盜鏈的原理是當圖片在網(wǎng)頁(yè)中顯示的時(shí)侯php 采集微信文章圖片,圖片服務(wù)器會(huì )測量到引用這張圖片的服務(wù)器域名,當發(fā)覺(jué)服務(wù)器域名不包含或的時(shí)侯才會(huì )被替換成防盜鏈圖片。
  但是假若測量不到引用頁(yè)面的域名才會(huì )正常顯示,所以我們通過(guò)php的函數file_get_content()就可以將圖片的二進(jìn)制代碼獲取過(guò)來(lái),然后按照自己的看法起個(gè)文件名保存到自己的服務(wù)器上。在這里再介紹一個(gè)保存圖片的方式,我目前使用了騰訊云的“萬(wàn)象優(yōu)圖”,通過(guò)它們提供的api將圖片保存到云空間,這樣的用處是讀取圖片時(shí)直接在圖片的鏈接地址加上希望得到的圖片規格大小參數,就可以直接得到一張縮略圖。比存在自己的服務(wù)器便捷得多。阿里云也應當有同樣的產(chǎn)品php 采集微信文章圖片,好像名叫對象儲存。
  另外,我采集公眾號內容的目的是制做成一個(gè)新聞app,在app上將html代碼顯示下來(lái)以后,因為app同樣沒(méi)有域名,防盜鏈服務(wù)器也同樣不會(huì )覺(jué)得圖片被盜鏈了。這樣就可以直接顯示圖片下來(lái)。 查看全部
 ??;我的正則匹配水平有限,只能寫(xiě)成這樣的了。希望有高手能賜教更好的正則匹配方式。
  另外注意:這個(gè)匹配規則會(huì )可能在一段時(shí)間以后有變化。這篇文章會(huì )盡量保持更新。如果你按照我的文章制作了采集系統以后,當某三天失效了,別忘了回去再瞧瞧文章是否有更新。
  2)內容處理:
  通過(guò)前面的方式我們獲得了文章內容的html,但是你將文章內容顯示下來(lái)以后才會(huì )發(fā)覺(jué),圖片和視頻不能正常顯示。因為這個(gè)html還須要一些加工:
  首先是圖片,微信文章中的標簽中的src屬性全部都用了data-src屬性替代。只有在顯示的時(shí)侯就會(huì )被替換過(guò)來(lái)。所以我們也有兩個(gè)方案,將源代碼直接替換過(guò)來(lái),或者用js在顯示時(shí)侯再替換。下面我先介紹直接替換html的方式:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("data-src","src",$content);
  然后是視頻,視頻的顯示不正常,經(jīng)過(guò)常年測試后發(fā)覺(jué)只要替換一個(gè)頁(yè)面地址才能解決,過(guò)程就不說(shuō)了,直接說(shuō)結果:
  1
  2
  3
  4
  //$content變量的值是上面獲取到的文章內容html
  $content = str_replace("preview.html","player.html",$content);
  通過(guò)這兩個(gè)替換過(guò)后,文章內容html中的圖片和視頻就都正常了。
  3) 公眾號相關(guān)信息:
  通過(guò)本專(zhuān)欄之前的文章,介紹了我們使用陌陌客戶(hù)端,任意打開(kāi)一個(gè)公眾號的歷史消息頁(yè)以后。系統從數據庫中辨識biz的值,發(fā)現數據庫中沒(méi)有記錄,就會(huì )插入一條新的紀錄。之后的采集隊列都會(huì )定期按照這個(gè)biz來(lái)獲取這個(gè)公眾號的歷史消息列表。
  但是我們只獲得了這個(gè)公眾號的biz,公眾號的名稱(chēng),頭像這兩個(gè)重要信息還是沒(méi)有獲取到。主要誘因是歷史消息頁(yè)面中沒(méi)有這兩個(gè)信息。但是我們可以從文章頁(yè)面中獲取到。
  在陌陌文章頁(yè)面html的頂部,有一些js的變量形參的代碼,通過(guò)正則匹配然后我們就可以獲得這兩個(gè)公眾號的信息:
  1
  2
  3
  4
  5
  6
  7
  //$html變量的值是上面獲取到的文章全部html
  preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
  $nickname = $m[1][0];//公眾號愛(ài)稱(chēng)
  preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
  $head_img = $m[1][0];//公眾號頭像
  通過(guò)這兩個(gè)正則匹配,我們才能獲取到公眾號的頭像和愛(ài)稱(chēng),然后按照文章地址中的biz,可以保存到對應的微信號數據表中。
  3、文章的保存和處理
  前面的代碼已然將文章內容獲取到變量中了。如何保存雖然每個(gè)人似乎都有自己的看法。我這兒介紹一下我的保存內容的方式:
  將文章內容的html以數據庫id為文件名保存成html文件,以biz數組為目錄。
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  $dir = "./".$biz."/";
  $filename = $dir.$id.".html";
  if(!is_dir($dir)) {
  mkdir($cache_dir);
  chmod($cache_dir,0777);
  }
  $file = fopen($filename, "w");
  fwrite($file, $content);
  fclose($file);
  以上代碼是一個(gè)標準的php構建文件夾保存文件的代碼,大家可以依照自己的實(shí)際情況安排保存方式。
  在這以后我們就可以在自己的服務(wù)器上得到一個(gè)html文件,內容就是公眾號的文章內容。我們可以從瀏覽器中打開(kāi)看一下。這時(shí)你或許會(huì )發(fā)覺(jué)圖片防盜鏈了!無(wú)法正常顯示!包括數據庫中保存的文章封面圖,公眾號的頭像都是防盜鏈的。
  別急,這個(gè)問(wèn)題挺好解決,只須要將圖片也保存到自己的服務(wù)器,無(wú)非是將來(lái)會(huì )占用自己的服務(wù)器空間和帶寬。
  圖片防盜鏈的原理是當圖片在網(wǎng)頁(yè)中顯示的時(shí)侯php 采集微信文章圖片,圖片服務(wù)器會(huì )測量到引用這張圖片的服務(wù)器域名,當發(fā)覺(jué)服務(wù)器域名不包含或的時(shí)侯才會(huì )被替換成防盜鏈圖片。
  但是假若測量不到引用頁(yè)面的域名才會(huì )正常顯示,所以我們通過(guò)php的函數file_get_content()就可以將圖片的二進(jìn)制代碼獲取過(guò)來(lái),然后按照自己的看法起個(gè)文件名保存到自己的服務(wù)器上。在這里再介紹一個(gè)保存圖片的方式,我目前使用了騰訊云的“萬(wàn)象優(yōu)圖”,通過(guò)它們提供的api將圖片保存到云空間,這樣的用處是讀取圖片時(shí)直接在圖片的鏈接地址加上希望得到的圖片規格大小參數,就可以直接得到一張縮略圖。比存在自己的服務(wù)器便捷得多。阿里云也應當有同樣的產(chǎn)品php 采集微信文章圖片,好像名叫對象儲存。
  另外,我采集公眾號內容的目的是制做成一個(gè)新聞app,在app上將html代碼顯示下來(lái)以后,因為app同樣沒(méi)有域名,防盜鏈服務(wù)器也同樣不會(huì )覺(jué)得圖片被盜鏈了。這樣就可以直接顯示圖片下來(lái)。

【原創(chuàng )源碼】網(wǎng)絡(luò )爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 370 次瀏覽 ? 2020-07-02 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  最近因為女朋友工作需求,需要獲取各大團購網(wǎng)站上的店家信息,這樣自動(dòng)一個(gè)一個(gè)點(diǎn)不得氣死,于是我就寫(xiě)了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)來(lái)解決這個(gè)問(wèn)題,是用java寫(xiě)的,主要用到了兩個(gè)開(kāi)源庫,httpclient和jsoup...用來(lái)獲取網(wǎng)頁(yè)數據和得到想要的數據,不過(guò)最好是有點(diǎn)web基礎網(wǎng)絡(luò )爬蟲(chóng)代碼,這樣就可以只要想要的值,不然會(huì )有很多沒(méi)用的數據,后期還要自動(dòng)刪掉,比較麻煩...下面附上源碼和說(shuō)明...
  [Asm] 純文本查看 復制代碼
  public static String getHtmlByUrl(String url){
String html = null;

HttpClient httpClient = new DefaultHttpClient();//創(chuàng )建httpClient對象
HttpGet httpget = new HttpGet(url);//以get方式請求該URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce對象
int resStatu = responce.getStatusLine().getStatusCode();//返回碼
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不對
//獲得相應實(shí)體
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//獲得html源代碼

InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("訪(fǎng)問(wèn)【"+url+"】出現異常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}

return html;
}
  上面的就是httpclient庫的內容,用它來(lái)獲取html頁(yè)面的數據
  [Java] 純文本查看 復制代碼
  public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要獲取數據的網(wǎng)址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基礎的話(huà),可以設置一下這里,知道自己想要的數據

for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
  這個(gè)就是解析獲取來(lái)的html數據,找到自己想要的數據....
  然后把取到的數據存入excel獲取txt里就隨大伙便了,不過(guò)這個(gè)方式有一個(gè)漏洞就是,只能取靜態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面未能實(shí)現,我還要再繼續研究一下,研究下來(lái)了,再發(fā)下來(lái),如果有哪些不懂的網(wǎng)絡(luò )爬蟲(chóng)代碼,可以問(wèn)我,知道的一定告訴你們,希望你們多評分,多鼓勵,非常謝謝?。。?! 查看全部

  
  最近因為女朋友工作需求,需要獲取各大團購網(wǎng)站上的店家信息,這樣自動(dòng)一個(gè)一個(gè)點(diǎn)不得氣死,于是我就寫(xiě)了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)來(lái)解決這個(gè)問(wèn)題,是用java寫(xiě)的,主要用到了兩個(gè)開(kāi)源庫,httpclient和jsoup...用來(lái)獲取網(wǎng)頁(yè)數據和得到想要的數據,不過(guò)最好是有點(diǎn)web基礎網(wǎng)絡(luò )爬蟲(chóng)代碼,這樣就可以只要想要的值,不然會(huì )有很多沒(méi)用的數據,后期還要自動(dòng)刪掉,比較麻煩...下面附上源碼和說(shuō)明...
  [Asm] 純文本查看 復制代碼
  public static String getHtmlByUrl(String url){
String html = null;

HttpClient httpClient = new DefaultHttpClient();//創(chuàng )建httpClient對象
HttpGet httpget = new HttpGet(url);//以get方式請求該URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce對象
int resStatu = responce.getStatusLine().getStatusCode();//返回碼
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不對
//獲得相應實(shí)體
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//獲得html源代碼

InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("訪(fǎng)問(wèn)【"+url+"】出現異常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}

return html;
}
  上面的就是httpclient庫的內容,用它來(lái)獲取html頁(yè)面的數據
  [Java] 純文本查看 復制代碼
  public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要獲取數據的網(wǎng)址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基礎的話(huà),可以設置一下這里,知道自己想要的數據

for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
  這個(gè)就是解析獲取來(lái)的html數據,找到自己想要的數據....
  然后把取到的數據存入excel獲取txt里就隨大伙便了,不過(guò)這個(gè)方式有一個(gè)漏洞就是,只能取靜態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面未能實(shí)現,我還要再繼續研究一下,研究下來(lái)了,再發(fā)下來(lái),如果有哪些不懂的網(wǎng)絡(luò )爬蟲(chóng)代碼,可以問(wèn)我,知道的一定告訴你們,希望你們多評分,多鼓勵,非常謝謝?。。?!

java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 314 次瀏覽 ? 2020-05-15 08:01 ? 來(lái)自相關(guān)話(huà)題

  更新時(shí)間:2017年11月13日 08:50:04 作者:在遠行的路上
  這篇文章主要介紹了java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例,還是挺不錯的,這里分享給你們,需要的同學(xué)可以參考下。
  目前市面上流行的爬蟲(chóng)以python居多,簡(jiǎn)單了解過(guò)后網(wǎng)絡(luò )爬蟲(chóng)代碼,覺(jué)得簡(jiǎn)單的一些頁(yè)面的爬蟲(chóng),主要就是去解析目標頁(yè)面(html)。那么就在想網(wǎng)絡(luò )爬蟲(chóng)代碼,java有沒(méi)有用戶(hù)便捷解析html頁(yè)面呢?找到了一個(gè)jsoup包,一個(gè)十分便捷解析html的工具呢。
  使用方法也十分簡(jiǎn)單,引入jar包:
  
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
  使用http工具,請求獲取目標頁(yè)面的整個(gè)html頁(yè)面信息,然后使用jsoup解析:
  
//獲取html頁(yè)面信息
String html = getHtml();
//使用jsoup將html解析為Document對象
Document doc = Jsoup.parse(html);
//后續操作就可以解析這個(gè)DOM樹(shù)了,非常簡(jiǎn)單。
  總結
  以上就是本文關(guān)于java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例的全部?jì)热?,希望對你們有所幫助。感興趣的同學(xué)可以繼續參閱本站: 查看全部

  更新時(shí)間:2017年11月13日 08:50:04 作者:在遠行的路上
  這篇文章主要介紹了java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例,還是挺不錯的,這里分享給你們,需要的同學(xué)可以參考下。
  目前市面上流行的爬蟲(chóng)以python居多,簡(jiǎn)單了解過(guò)后網(wǎng)絡(luò )爬蟲(chóng)代碼,覺(jué)得簡(jiǎn)單的一些頁(yè)面的爬蟲(chóng),主要就是去解析目標頁(yè)面(html)。那么就在想網(wǎng)絡(luò )爬蟲(chóng)代碼,java有沒(méi)有用戶(hù)便捷解析html頁(yè)面呢?找到了一個(gè)jsoup包,一個(gè)十分便捷解析html的工具呢。
  使用方法也十分簡(jiǎn)單,引入jar包:
  
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
  使用http工具,請求獲取目標頁(yè)面的整個(gè)html頁(yè)面信息,然后使用jsoup解析:
  
//獲取html頁(yè)面信息
String html = getHtml();
//使用jsoup將html解析為Document對象
Document doc = Jsoup.parse(html);
//后續操作就可以解析這個(gè)DOM樹(shù)了,非常簡(jiǎn)單。
  總結
  以上就是本文關(guān)于java實(shí)現一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)代碼示例的全部?jì)热?,希望對你們有所幫助。感興趣的同學(xué)可以繼續參閱本站:

爬蟲(chóng)基本原理

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 371 次瀏覽 ? 2020-05-14 08:08 ? 來(lái)自相關(guān)話(huà)題

  這篇文章的定位是,給有一些python基礎,但是對爬蟲(chóng)一無(wú)所知的人寫(xiě)的。文中只會(huì )涉及到爬蟲(chóng)最核心的部份,完全避免莫名其妙的坑或概念,讓讀者認為爬蟲(chóng)是一件極其簡(jiǎn)單的事情,而事實(shí)上爬蟲(chóng)確實(shí)是一件極其簡(jiǎn)單的事情(如果你不是以爬蟲(chóng)為工作的話(huà))。
  本文分為如下幾個(gè)部份
  簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
  首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
  下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的
  
  
  抓取標題完整代碼如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  這樣才會(huì )復印出所有標題,展示一部分如下
  
  
  上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的
  
  
  我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
  注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
  pip install requests
pip install beautifulsoup4
  知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
  1.URL
  URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
  但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片
  
  
  這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
  不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
  r = requests.get('https://www.csdn.net/')
  就是在將URL傳入懇求函數。
  2.網(wǎng)頁(yè)懇求
  說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
  而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
  我們可以print(r.text)看一下上面有哪些東西
  
  
  我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)
  
  
  源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
  r = requests.get('https://www.csdn.net/')
  再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
  但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
  3.網(wǎng)頁(yè)解析
  網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
  因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
  為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
  引用維基百科中的一段話(huà)來(lái)介紹HTML
  超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
  為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
  <!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
  保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面
  
  
  你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
  接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
  再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
  但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
  為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
  css句子類(lèi)似這樣
  h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
  即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
  p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
  在HTML代碼中則這樣寫(xiě)
  <p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
  所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
  做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
  如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
  現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
  把上面的代碼再粘貼一遍如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  解釋一下里面代碼的過(guò)程
  可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
  那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
  我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
  用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示
  
  
 ?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
  這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
  其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示
  
  
  可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
  當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
  雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。
  
  
  在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示
  
  
  當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
  現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
  如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
  如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
  在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
  爬蟲(chóng)代碼改進(jìn)(一)
  爬蟲(chóng)代碼改進(jìn)(二)
  爬蟲(chóng)代碼改進(jìn)(三)
  專(zhuān)欄主頁(yè):python編程
  專(zhuān)欄目錄:目錄
  爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
  版本說(shuō)明:軟件及包版本說(shuō)明 查看全部

  這篇文章的定位是,給有一些python基礎,但是對爬蟲(chóng)一無(wú)所知的人寫(xiě)的。文中只會(huì )涉及到爬蟲(chóng)最核心的部份,完全避免莫名其妙的坑或概念,讓讀者認為爬蟲(chóng)是一件極其簡(jiǎn)單的事情,而事實(shí)上爬蟲(chóng)確實(shí)是一件極其簡(jiǎn)單的事情(如果你不是以爬蟲(chóng)為工作的話(huà))。
  本文分為如下幾個(gè)部份
  簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
  首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
  下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的
  
  
  抓取標題完整代碼如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  這樣才會(huì )復印出所有標題,展示一部分如下
  
  
  上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的
  
  
  我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
  注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
  pip install requests
pip install beautifulsoup4
  知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
  1.URL
  URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
  但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片
  
  
  這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
  不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
  r = requests.get('https://www.csdn.net/')
  就是在將URL傳入懇求函數。
  2.網(wǎng)頁(yè)懇求
  說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
  而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
  我們可以print(r.text)看一下上面有哪些東西
  
  
  我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)
  
  
  源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
  r = requests.get('https://www.csdn.net/')
  再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
  但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
  3.網(wǎng)頁(yè)解析
  網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
  因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
  為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
  引用維基百科中的一段話(huà)來(lái)介紹HTML
  超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
  為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
  <!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
  保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面
  
  
  你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
  接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
  再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
  但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
  為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
  css句子類(lèi)似這樣
  h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
  即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
  p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
  在HTML代碼中則這樣寫(xiě)
  <p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
  所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
  做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
  如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
  現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
  把上面的代碼再粘貼一遍如下
  import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
  解釋一下里面代碼的過(guò)程
  可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
  那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
  我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
  用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示
  
  
 ?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
  這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
  其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示
  
  
  可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
  當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
  雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。
  
  
  在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示
  
  
  當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
  現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
  如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
  如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
  在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
  爬蟲(chóng)代碼改進(jìn)(一)
  爬蟲(chóng)代碼改進(jìn)(二)
  爬蟲(chóng)代碼改進(jìn)(三)
  專(zhuān)欄主頁(yè):python編程
  專(zhuān)欄目錄:目錄
  爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
  版本說(shuō)明:軟件及包版本說(shuō)明

了解網(wǎng)頁(yè)結構

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 297 次瀏覽 ? 2020-05-08 08:01 ? 來(lái)自相關(guān)話(huà)題

  學(xué)習資料:
  學(xué)習爬蟲(chóng), 首先要懂的是網(wǎng)頁(yè). 支撐起各類(lèi)光鮮亮麗的網(wǎng)頁(yè)的不是別的, 全都是一些代碼.這種代碼我們稱(chēng)之為 HTML,HTML 是一種瀏覽器(Chrome, Safari, IE, Firefox等)看得懂的語(yǔ)言, 瀏覽器能將這些語(yǔ)言轉換成我們用肉眼見(jiàn)到的網(wǎng)頁(yè).所以 HTML 里面必將存在著(zhù)好多規律, 我們的爬蟲(chóng)還能根據這樣的規律來(lái)爬取你須要的信息.
  其實(shí)不僅 HTML, 一同打造多彩/多功能網(wǎng)頁(yè)的組件還有 CSS 和. 但是這個(gè)簡(jiǎn)單的爬蟲(chóng)教程,大部分時(shí)間會(huì )將會(huì )使用 HTML.CSS 和 JavaScript 會(huì )在后期簡(jiǎn)單介紹一下. 因為爬網(wǎng)頁(yè)的時(shí)侯多多少少還是要和 CSS JavaScript 打交道的.
  
  雖然莫煩Python主打的是機器學(xué)習的教程. 但是這個(gè)爬蟲(chóng)教程適用于任何想學(xué)爬蟲(chóng)的朋友們.從機器學(xué)習的角度看爬蟲(chóng)結構, 機器學(xué)習中的大量數據, 也是可以從這種網(wǎng)頁(yè)中來(lái), 使用爬蟲(chóng)來(lái)爬取各類(lèi)網(wǎng)頁(yè)里面的信息, 然后再裝入各類(lèi)機器學(xué)習的方式,這樣的應用途徑正在越來(lái)越多被采用. 所以假如你的數據也是分散在各個(gè)網(wǎng)頁(yè)中, 爬蟲(chóng)是你降低人力勞動(dòng)的必修課.
  網(wǎng)頁(yè)基本組成部分
  在真正步入爬蟲(chóng)之前, 我們先來(lái)做一下熱身運動(dòng), 弄明白網(wǎng)頁(yè)的基礎, HTML 有什么組成部分,是怎么樣運作的. 如果你早已十分熟悉網(wǎng)頁(yè)的構造了, 歡迎直接跳過(guò)這一節, 進(jìn)入下邊的學(xué)習.
  我制做了一個(gè)特別簡(jiǎn)易的網(wǎng)頁(yè), 給你們呈現以下最肉感的 HTML 結構.如果你點(diǎn)開(kāi)它, 呈現在你眼前的, 就是下邊這張圖的上半部份. 而下半部份就是我們網(wǎng)頁(yè)背后的 HTML code.
  
  想問(wèn)我是怎么見(jiàn)到 HTML 的 source code 的? 其實(shí)很簡(jiǎn)單, 在你的瀏覽器中 (我用的是 Google Chrome),顯示網(wǎng)頁(yè)的地方, 點(diǎn)擊滑鼠右鍵,大多數瀏覽器就會(huì )有類(lèi)似這樣一個(gè)選項 “View Page Source”. 點(diǎn)擊它能夠看見(jiàn)頁(yè)面的源碼了.
  
  在 HTML 中, 基本上所有的實(shí)體內容, 都會(huì )有個(gè) tag 來(lái)框住它. 而這個(gè)被 tag 住的內容, 就可以被展示成不同的方式, 或有不同的功能.主體的 tag 分成兩部份, header 和 body. 在 header 中, 存放這一些網(wǎng)頁(yè)的網(wǎng)頁(yè)的元信息, 比如說(shuō) title, 這些信息是不會(huì )被顯示到你看見(jiàn)的網(wǎng)頁(yè)中的.這些信息大多數時(shí)侯是給瀏覽器看, 或者是給搜索引擎的爬蟲(chóng)看.
  <head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
  HTML 的第二大塊是 body, 這個(gè)部份才是你看見(jiàn)的網(wǎng)頁(yè)信息. 網(wǎng)頁(yè)中的 heading, 視頻, 圖片和文字等都儲存在這里.這里的 <h1></h1> tag 就是主標題, 我們看見(jiàn)呈現下來(lái)的療效就是大一號的文字. <p></p> 里面的文字就是一個(gè)段落.<a></a>里面都是一些鏈接. 所以好多情況, 東西都是置于這種 tag 中的.
  <body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
  爬蟲(chóng)想要做的就是按照這種 tag 來(lái)找到合適的信息.
  用 Python 登錄網(wǎng)頁(yè)
  好了, 對網(wǎng)頁(yè)結構和 HTML 有了一些基本認識之后, 我們能夠用 Python 來(lái)爬取這個(gè)網(wǎng)頁(yè)的一些基本信息.首先要做的, 是使用 Python 來(lái)登入這個(gè)網(wǎng)頁(yè), 并復印出這個(gè)網(wǎng)頁(yè) HTML 的 source code.注意, 因為網(wǎng)頁(yè)中存在英文, 為了正常顯示英文, read() 完之后, 我們要對讀下來(lái)的文字進(jìn)行轉換, decode() 成可以正常顯示英文的方式.
  from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
  print 出來(lái)就是下邊這樣啦. 這就證明了我們能否成功讀取這個(gè)網(wǎng)頁(yè)的所有信息了. 但我們還沒(méi)有對網(wǎng)頁(yè)的信息進(jìn)行匯總和借助.我們發(fā)覺(jué), 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
  <!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
</html>
  匹配網(wǎng)頁(yè)內容
  所以這兒我們使用 Python 的正則表達式 RegEx 進(jìn)行匹配文字, 篩選信息的工作. 我有一個(gè)很不錯的正則表達式的教程,如果是中級的網(wǎng)頁(yè)匹配, 我們使用正則完全就可以了, 高級一點(diǎn)或則比較冗長(cháng)的匹配, 我還是推薦使用 BeautifulSoup.不急不急, 我知道你想偷懶, 我然后馬上還會(huì )教 beautiful soup 了. 但是如今我們還是使用正則來(lái)做幾個(gè)簡(jiǎn)單的事例, 讓你熟悉一下套路.
  如果我們想用代碼找到這個(gè)網(wǎng)頁(yè)的 title, 我們能夠這樣寫(xiě). 選好要使用的 tag 名稱(chēng) <title>. 使用正則匹配.
  import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫煩Python
  如果想要找到中間的那種段落 <p>, 我們使用下邊方式, 因為這個(gè)段落在 HTML 中還參雜著(zhù) tab, new line, 所以我們給一個(gè)flags=re.DOTALL 來(lái)對那些 tab, new line 不敏感.
  res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
  最后一個(gè)練習是找一找所有的鏈接, 這個(gè)比較有用, 有時(shí)候你想找到網(wǎng)頁(yè)里的鏈接, 然后下載一些內容到筆記本里,就靠這樣的途徑了.
  res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
  下次我們就來(lái)瞧瞧為了圖方面爬蟲(chóng)結構, 我們怎樣使用 BeautifulSoup.
  相關(guān)教程 查看全部

  學(xué)習資料:
  學(xué)習爬蟲(chóng), 首先要懂的是網(wǎng)頁(yè). 支撐起各類(lèi)光鮮亮麗的網(wǎng)頁(yè)的不是別的, 全都是一些代碼.這種代碼我們稱(chēng)之為 HTML,HTML 是一種瀏覽器(Chrome, Safari, IE, Firefox等)看得懂的語(yǔ)言, 瀏覽器能將這些語(yǔ)言轉換成我們用肉眼見(jiàn)到的網(wǎng)頁(yè).所以 HTML 里面必將存在著(zhù)好多規律, 我們的爬蟲(chóng)還能根據這樣的規律來(lái)爬取你須要的信息.
  其實(shí)不僅 HTML, 一同打造多彩/多功能網(wǎng)頁(yè)的組件還有 CSS 和. 但是這個(gè)簡(jiǎn)單的爬蟲(chóng)教程,大部分時(shí)間會(huì )將會(huì )使用 HTML.CSS 和 JavaScript 會(huì )在后期簡(jiǎn)單介紹一下. 因為爬網(wǎng)頁(yè)的時(shí)侯多多少少還是要和 CSS JavaScript 打交道的.
  
  雖然莫煩Python主打的是機器學(xué)習的教程. 但是這個(gè)爬蟲(chóng)教程適用于任何想學(xué)爬蟲(chóng)的朋友們.從機器學(xué)習的角度看爬蟲(chóng)結構, 機器學(xué)習中的大量數據, 也是可以從這種網(wǎng)頁(yè)中來(lái), 使用爬蟲(chóng)來(lái)爬取各類(lèi)網(wǎng)頁(yè)里面的信息, 然后再裝入各類(lèi)機器學(xué)習的方式,這樣的應用途徑正在越來(lái)越多被采用. 所以假如你的數據也是分散在各個(gè)網(wǎng)頁(yè)中, 爬蟲(chóng)是你降低人力勞動(dòng)的必修課.
  網(wǎng)頁(yè)基本組成部分
  在真正步入爬蟲(chóng)之前, 我們先來(lái)做一下熱身運動(dòng), 弄明白網(wǎng)頁(yè)的基礎, HTML 有什么組成部分,是怎么樣運作的. 如果你早已十分熟悉網(wǎng)頁(yè)的構造了, 歡迎直接跳過(guò)這一節, 進(jìn)入下邊的學(xué)習.
  我制做了一個(gè)特別簡(jiǎn)易的網(wǎng)頁(yè), 給你們呈現以下最肉感的 HTML 結構.如果你點(diǎn)開(kāi)它, 呈現在你眼前的, 就是下邊這張圖的上半部份. 而下半部份就是我們網(wǎng)頁(yè)背后的 HTML code.
  
  想問(wèn)我是怎么見(jiàn)到 HTML 的 source code 的? 其實(shí)很簡(jiǎn)單, 在你的瀏覽器中 (我用的是 Google Chrome),顯示網(wǎng)頁(yè)的地方, 點(diǎn)擊滑鼠右鍵,大多數瀏覽器就會(huì )有類(lèi)似這樣一個(gè)選項 “View Page Source”. 點(diǎn)擊它能夠看見(jiàn)頁(yè)面的源碼了.
  
  在 HTML 中, 基本上所有的實(shí)體內容, 都會(huì )有個(gè) tag 來(lái)框住它. 而這個(gè)被 tag 住的內容, 就可以被展示成不同的方式, 或有不同的功能.主體的 tag 分成兩部份, header 和 body. 在 header 中, 存放這一些網(wǎng)頁(yè)的網(wǎng)頁(yè)的元信息, 比如說(shuō) title, 這些信息是不會(huì )被顯示到你看見(jiàn)的網(wǎng)頁(yè)中的.這些信息大多數時(shí)侯是給瀏覽器看, 或者是給搜索引擎的爬蟲(chóng)看.
  <head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
  HTML 的第二大塊是 body, 這個(gè)部份才是你看見(jiàn)的網(wǎng)頁(yè)信息. 網(wǎng)頁(yè)中的 heading, 視頻, 圖片和文字等都儲存在這里.這里的 <h1></h1> tag 就是主標題, 我們看見(jiàn)呈現下來(lái)的療效就是大一號的文字. <p></p> 里面的文字就是一個(gè)段落.<a></a>里面都是一些鏈接. 所以好多情況, 東西都是置于這種 tag 中的.
  <body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
  爬蟲(chóng)想要做的就是按照這種 tag 來(lái)找到合適的信息.
  用 Python 登錄網(wǎng)頁(yè)
  好了, 對網(wǎng)頁(yè)結構和 HTML 有了一些基本認識之后, 我們能夠用 Python 來(lái)爬取這個(gè)網(wǎng)頁(yè)的一些基本信息.首先要做的, 是使用 Python 來(lái)登入這個(gè)網(wǎng)頁(yè), 并復印出這個(gè)網(wǎng)頁(yè) HTML 的 source code.注意, 因為網(wǎng)頁(yè)中存在英文, 為了正常顯示英文, read() 完之后, 我們要對讀下來(lái)的文字進(jìn)行轉換, decode() 成可以正常顯示英文的方式.
  from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
  print 出來(lái)就是下邊這樣啦. 這就證明了我們能否成功讀取這個(gè)網(wǎng)頁(yè)的所有信息了. 但我們還沒(méi)有對網(wǎng)頁(yè)的信息進(jìn)行匯總和借助.我們發(fā)覺(jué), 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
  <!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫煩Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬蟲(chóng)測試1</h1>
<p>
這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
</p>
</body>
</html>
  匹配網(wǎng)頁(yè)內容
  所以這兒我們使用 Python 的正則表達式 RegEx 進(jìn)行匹配文字, 篩選信息的工作. 我有一個(gè)很不錯的正則表達式的教程,如果是中級的網(wǎng)頁(yè)匹配, 我們使用正則完全就可以了, 高級一點(diǎn)或則比較冗長(cháng)的匹配, 我還是推薦使用 BeautifulSoup.不急不急, 我知道你想偷懶, 我然后馬上還會(huì )教 beautiful soup 了. 但是如今我們還是使用正則來(lái)做幾個(gè)簡(jiǎn)單的事例, 讓你熟悉一下套路.
  如果我們想用代碼找到這個(gè)網(wǎng)頁(yè)的 title, 我們能夠這樣寫(xiě). 選好要使用的 tag 名稱(chēng) <title>. 使用正則匹配.
  import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫煩Python
  如果想要找到中間的那種段落 <p>, 我們使用下邊方式, 因為這個(gè)段落在 HTML 中還參雜著(zhù) tab, new line, 所以我們給一個(gè)flags=re.DOTALL 來(lái)對那些 tab, new line 不敏感.
  res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 這是一個(gè)在 <a href="https://morvanzhou.github.io/">莫煩Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬蟲(chóng)教程</a> 中的簡(jiǎn)單測試.
  最后一個(gè)練習是找一找所有的鏈接, 這個(gè)比較有用, 有時(shí)候你想找到網(wǎng)頁(yè)里的鏈接, 然后下載一些內容到筆記本里,就靠這樣的途徑了.
  res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
  下次我們就來(lái)瞧瞧為了圖方面爬蟲(chóng)結構, 我們怎樣使用 BeautifulSoup.
  相關(guān)教程

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久