首頁>技術>

"Elements"選項卡里面的內容可以理解為就是網頁的原始碼,最後爬蟲爬到的內容大致是這樣。

另外一個獲取網頁原始碼的方式是在網頁上右擊選擇"檢視網頁原始碼"。

1.2網頁結構初步瞭解

結構其實很簡單,就是一個大框套著一個小框,一個小框再套著一個小小框,一般文字內容都是在最後的小框裡

前兩行的

<!DOCTYPE html>與<html>是固定寫法,作用是將程式碼宣告為HTML文件。

<body>框表示主體資訊,是最終展示在網頁上的內容。<>包圍起來的內容就是標籤,例如,<body>讀作body標籤。通常寫完<body>之後,最後得寫一個</body>,表示一個框的閉合。

如果網頁出現亂碼(亂碼就是中文顯示成奇怪的符號),可以把charset="utf-8"中的utf-8改成gbk,這是兩種不同的中文格式,各個瀏覽器可能各有不同。

1.3HTML基礎知識

1.標題<h>標籤:

標題是透過<h1> - <h6> 標籤來定義的,一般格式為:<h1>標題內容</h1>。其中h1的字號最大,h6的字號最小。

2.段落<p>標籤:

段落是透過標籤 <p> 來定義的,一般格式為:<p>段落內容</p>

3.連結<a>標籤:(定義連結)

還有些常用的標籤:定義表格的label標籤、定義序號的<li>標籤、定義圖片的<img>標籤、定義樣式的<script>標籤等

4.區塊:

區塊最主要的表現形式就是<div>**</div>格式了,例:可以看到每個新聞都被包圍在一個叫做<div class ="result" id="*">***</div>的框裡,更加學術的說法來講,這個<div>**</div>其實起到了一個分割槽的作用,將百度新聞上這10條新聞分別放置了10個區域中。

5.類(class)與 ID

(1) 類 (class): class的寫法就是寫在框的型別後面,比如<h3 class="c-title">以及<div class="result" id="1">.

(2) ID:id的區分作用則更加每個class(類)可能相同,但是他們的id一般都不會相同

1.4百度新聞原始碼獲取1.4.1獲取網頁原始碼

透過requests庫來嘗試獲取下百度新聞的網頁原始碼,程式碼如下:

獲取到的原始碼如下圖所示:

可以看到其並沒有獲取到真正的網頁原始碼,這是因為這裡的百度資訊網站

只認可瀏覽器傳送過去的訪問,而不認可直接透過Python傳送過去的訪問請求。

這時就需要設定下requests.get()中的headers引數,用來模擬瀏覽器進行訪問。

執行結果如下圖所示,可以發現此時已經獲取到網頁的原始碼了:

這裡的headers是一個字典,它的第一個元素的鍵名為'User-Agent',值為'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'。User-Agent實際上代表訪問網站的瀏覽器是哪種瀏覽器。以谷歌瀏覽器為例講解如何獲取瀏覽器的User-Agent。開啟谷歌瀏節器,在位址列中輸入"about:version",注意要用英文格式的冒號,按Enter鍵後在開啟的界而中找到"使用者代理"項,後面的字串就是User-Agent.

對於之後的實戰,只要記得在程式碼的最前面寫上如下程式碼:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}

然後每次用requests.get()訪問網站時,加上headers=headers即可。

三法之1: (2)使用2.1.2介紹的右擊選擇"檢視網頁原始碼"

然後便可以透過Ctrl + F快捷鍵(快速搜尋快捷鍵)定位關心的內容了。

三法之1: (3)在Python獲得的網頁原始碼中檢視

然後便可以透過Ctrl + F快捷鍵(快速搜尋快捷鍵)定位關心的內容了。

1.5正則表示式1.5.1findall()函式

正則表示式庫re

Findall()函式的功能是在原始文字中尋找所有符合匹配規則的文字內容,其使用格式如下所示:re.findall(匹配規則,原始文字),匹配規則是由一個特定符號組成的字串。findall()函式得到的是一個列表。

'\d'表示匹配一個數字,'\d\d\d'就表示匹配三個數字

1.5.2非貪婪匹配之(.*?)

簡單來說(.*?)的作用就是來找到想要的內容,同時不確定它的長度以及格式,但是知道它在哪兩塊內容中間。其使用格式如下所示:文字A(.*?)文字B

1.5.3非貪婪匹配之 .*?

如果說(.*?)是用來獲取文字A與文字B之間的內容;.*?的作用簡單來說是表示文字C和文字D之間的內容。之所以要使用.*?,是因為文字C和文字D之間的內容經常變動或沒有規律,無法寫到匹配規則裡;或者文字C和文字D之間的內容較多,我們不想寫到匹配規則裡。

1.5.4自動考慮換行的修飾符re.S

修飾符有很多,用的最多的就是re.S,它的作用就是在findall查詢的時候,可以自動考慮到換行的影響,使得.*?可以匹配換行,使用格式如下:

re.findall(匹配規則,原始文字,re.S)

獲取的標題裡包含了\n換行符,可以利用strip()函式清除換行符,程式碼如下

注:如果想把title裡的<em></em>給去掉,我們可以是原來學過的.replace

1. sub()函式

sub()函式中的sub是英文substitute(替換)的縮寫,其格式為:re.sub(需要替換的內容,替換值,原字串),該函式主要用於清洗正則表示式獲取到的內容。

這個方法不自會去掉<em></em>,還會去掉其它的<>裡的內容。

2. 中括號[ ]的用法

中括號最主要的功能是使中括號裡的內容不再有特殊含義。在正則表示式裡,".""*""?"等符號都有特殊的含義,但是如果想定位的就是這些符號,就需要使用中括號。

27
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 筆記-pd.set_option()引數詳解