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

爬蟲(chóng)基本原理

優(yōu)采云 發(fā)布時(shí)間: 2020-05-14 08:08

  這篇文章的定位是,給有一些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ō)明

0 個(gè)評論

要回復文章請先登錄注冊


官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

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