着手寫爬蟲前,需要了解的幾個概念:
URL
全稱 Uniform Resource Locator (統一資源定位器),格式為:協定+主機+端口+路徑。
比如:https://www.bilibili.com/video/BV17x411w7KC
https:// 是協定,www.bilibili.com 是主機域名,這個例子中端口号并未在主機域名後指定,使用的是預設端口,/video/BV17x411w7KC 是檔案路徑。
簡單來說,就是使用浏覽器打開一個網頁時,顯示在最上方搜尋欄中的内容。
正規表達式
通過使用一些預設的字元來建立的通常用于檢索字元串的具有一定規則的文本。
需要掌握基本的用法。
比如這個正規表達式:a(.*?)z
可以比對的字元串有:“abz”,“ab123z”,“ab123字元串z”。
除了以上三種,隻要字元串滿足第一個字元是 ‘a’,最後一個字元是 ‘z’,都可以被這個正規表達式比對。因為表達式中的 (.*?) 表示比對任意字元串。
爬蟲
自動從網頁上抓取資料的程式或者腳本。
為什麼需要爬蟲?
試想一下,當你在某桌面網站閑逛時,發現一個分欄下的桌面都很好看,想要将他們都下載下傳下來,如果手動操作的話,你需要一張一張地點選下載下傳,而如果使用爬蟲,你則可以運作爬蟲,然後沖一杯咖啡,稍等片刻,桌面就都已經下載下傳并儲存到你的檔案中了。
了解了基本的概念,再來了解爬蟲的基本流程。
爬蟲的三個主要流程:
(1)請求
向伺服器發送請求,并得到伺服器響應後傳回的資料。
(2)比對
對傳回的資料使用正規表達式進行處理,比對出需要的内容。
(3)儲存
比對出的内容通常為資源連結,我們通過解析該連結并發送請求,将擷取到的資料儲存到本地。
OK,開始寫爬蟲吧。
本次目标:爬取B站首頁熱門推薦視訊标題
首先,我們需要導入必要的子產品
#HTTP請求
import urllib
import urllib.request
#正規表達式
import re
#檔案
import os
複制
然後,我們依次實作爬蟲的三個流程:
請求:
浏覽器請求頭需要我們進入網站按 f12 擷取。
#發送請求并傳回擷取到的HTML資料(字元串)
def GetHTML(url):
#僞裝浏覽器請求頭
header = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75'}
#使用傳入的url建立一個請求
request = urllib.request.Request(url, headers = header)
#發送請求并得到響應
response = urllib.request.urlopen(request)
#擷取通過utf-8格式解碼後的HTML資料
HTML = response.read().decode('utf-8')
#傳回HTML資料
return HTML
複制
比對:
正規表達式需要進入網站按 f12 定位到想要爬取的資源,根據資源的屬性寫出對應的正規表達式。
#從HTML資料中比對出所有标題
def GetTitles(HTML):
#通過正規表達式建立一個正則比對模式
pattern = re.compile('<p.*?class="title">(.*?)</p>')
#得到所有比對結果,findall的傳回值類型為清單
titles = re.findall(pattern, HTML)
#傳回所有标題内容
return titles
複制
儲存:
#将資料儲存到檔案
def SaveData(data):
#判斷一個檔案夾是否存在
flag = os.path.exists('title')
if not flag:
#不存在則建立一個檔案夾
os.mkdir('title')
print('檔案夾','title','建立成功')
else:
print('檔案夾','title','已存在')
#将清單中的資料寫入檔案并儲存在檔案夾中
i = 0
for title in data:
#打開檔案時在檔案名前加上檔案夾路徑
file = open('title/'+'标題'+str(i)+'.txt', 'w')
file.write(title)
file.close()
print('标題',str(i),'寫入成功!')
i += 1
複制
歐克,調用函數運作一下:
#發送請求并擷取資料
HTML = GetHTML('https://www.bilibili.com/')
#比對出我們需要的資料
titles = GetTitles(HTML)
#将資料儲存到本地
SaveData(titles)
#暫停一下
pause = input('任意鍵退出')
複制
運作效果:
其他類型的資源的爬取思路相同,感興趣的小夥伴趕快試試吧~