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