發(fā)送 GET 請求
當(dāng)我們用瀏覽器打開豆瓣首頁時,其實發(fā)送的最原始的請求就是 GET 請求
可以看到,我們得到的是一個 對象
如果我們要獲取網(wǎng)站返回的數(shù)據(jù),可以使用 text 或者 屬性來獲取
text:是以字符串的形式返回數(shù)據(jù)
:是以二進(jìn)制的方式返回數(shù)據(jù)
print(type(res.text))
print(res.text)
>>>
lang="zh-cmn-Hans" class="">
="UTF-8">
name="-site-" ="eyw" />
name="" ="提供圖書、電影、音樂唱片的推薦、評論和價格比較,以及城市獨特的文化生活。">
name="" ="豆瓣,廣播,登陸豆瓣">.....
發(fā)送 POST 請求
對于 POST 請求,一般就是提交一個表單
r = .post('#39;, data={"key": "value"})
data 當(dāng)中,就是需要傳遞的表單信息,是一個字典類型的數(shù)據(jù)。
增強
對于有些網(wǎng)站,會拒絕掉沒有攜帶 的請求的,所以需要做一些 增強。比如:UA,,host 等等信息。
= {"User-Agent": "/5.0 ( NT 10.0; Win64; x64) /537.36 (KHTML, like Gecko) /76.0.3809.100 /537.36","": "your "}
res = .get('#39;, =)
解析 HTML
現(xiàn)在我們已經(jīng)獲取到了網(wǎng)頁返回的數(shù)據(jù),即 HTML 代碼,下面就需要解析 HTML,來提取其中有效的信息。
是 的一個庫,最主要的功能是從網(wǎng)頁解析數(shù)據(jù)。
from bs4 # 導(dǎo)入 的方法
# 可以傳入一段字符串,或者傳入一個文件句柄。一般都會先用 庫獲取網(wǎng)頁內(nèi)容,然后使用 soup 解析。
soup = (,'html.')
# 這里一定要指定解析器,可以使用默認(rèn)的 html,也可以使用 lxml。print(soup.()) # 按照標(biāo)準(zhǔn)的縮進(jìn)格式輸出獲取的 soup 內(nèi)容。
的一些簡單用法
print(soup.title) # 獲取文檔的 title
print(soup.title.name) # 獲取 title 的 name 屬性print(soup.title.) # 獲取 title 的內(nèi)容
print(soup.p) # 獲取文檔中第一個 p 節(jié)點
print(soup.p['class']) # 獲取第一個 p 節(jié)點的 class 內(nèi)容print(soup.('a')) # 獲取文檔中所有的 a 節(jié)點,返回一個 list
print(soup.('span', attrs={'style': "color:#"})) # 獲取文檔中所有的 span 且 style 符合規(guī)則的節(jié)點,返回一個 list
具體的用法和效果,我會在后面的實戰(zhàn)中詳細(xì)說明。
XPath 定位
XPath 是 XML 的路徑語言,是通過元素和屬性進(jìn)行導(dǎo)航定位的。幾種常用的表達(dá)式
表達(dá)式含義node選擇 node 節(jié)點的所有子節(jié)點/從根節(jié)點選取//選取所有當(dāng)前節(jié)點.當(dāng)前節(jié)點..父節(jié)點@屬性選取text()當(dāng)前路徑下的文本內(nèi)容
一些簡單的例子
當(dāng)然,XPath 非常強大用python爬取網(wǎng)站數(shù)據(jù),但是語法也相對復(fù)雜,不過我們可以通過 的開發(fā)者工具來快速定位到元素的 xpath,如下圖
得到的 xpath 為
//*[@id="anony-nav"]/div[1]/ul/li[1]/a
在實際的使用過程中,到底使用 還是 XPath,完全取決于個人喜好,哪個用起來更加熟練方便,就使用哪個。
爬蟲實戰(zhàn):爬取豆瓣海報
我們可以從豆瓣影人頁用python爬取網(wǎng)站數(shù)據(jù),進(jìn)入都影人對應(yīng)的影人圖片頁面,比如以劉濤為例子,她的影人圖片頁面地址為
////
下面我們就來分析下這個網(wǎng)頁
目標(biāo)網(wǎng)站頁面分析
注意:網(wǎng)絡(luò)上的網(wǎng)站頁面構(gòu)成總是會變化的,所以這里你需要學(xué)會分析的方法,以此類推到其他網(wǎng)站。正所謂授人以魚不如授人以漁,就是這個原因。
開發(fā)者工具
開發(fā)者工具(按 F12 打開),是分析網(wǎng)頁的絕佳利器,一定要好好使用。
我們在任意一張圖片上右擊鼠標(biāo),選擇“檢查”,可以看到同樣打開了“開發(fā)者工具”,而且自動定位到了該圖片所在的位置
可以清晰的看到,每張圖片都是保存在 li 標(biāo)簽中的,圖片的地址保存在 li 標(biāo)簽中的 img 中。
知道了這些規(guī)律后,我們就可以通過 或者 XPath 來解析 HTML 頁面,從而獲取其中的圖片地址。
代碼編寫
我們只需要短短的幾行代碼,就能完成圖片 url 的提取
可以看到,是非常干凈的列表,里面存儲了海報地址。
但是這里也只是一頁海報的數(shù)據(jù),我們觀察頁面發(fā)現(xiàn)它有好多分頁,如何處理分頁呢。
分頁處理
我們點擊第二頁,看看瀏覽器 url 的變化
////?type=C&start=30&=like&size=a&=a
發(fā)現(xiàn)瀏覽器 url 增加了幾個參數(shù)
再點擊第三頁,繼續(xù)觀察 url
////?type=C&start=60&=like&size=a&=a
通過觀察可知,這里的參數(shù),只有 start 是變化的,即為變量,其余參數(shù)都可以按照常理來處理
同時還可以知道,這個 start 參數(shù)應(yīng)該是起到了類似于 page 的作用,start = 30 是第二頁,start = 60 是第三頁,依次類推,最后一頁是 start = 420。
于是我們處理分頁的代碼也呼之欲出了
首先將上面處理 HTML 頁面的代碼封裝成函數(shù)
然后我們在另一個函數(shù)中處理分頁和調(diào)用上面的函數(shù)
此時,我們所有的海報數(shù)據(jù)都保存在了 data 變量中,現(xiàn)在就需要一個下載器來保存海報了
再增加下載器到 fire 函數(shù),此時為了不是請求過于頻繁而影響豆瓣網(wǎng)的正常訪問,設(shè)置 sleep time 為1秒
下面就執(zhí)行 fire 函數(shù),等待程序運行完成后,當(dāng)前目錄下會生成一個 的文件夾,里面保存了我們下載的所有海報
核心代碼講解
下面再來看下完整的代碼
fire 函數(shù)
這是一個主執(zhí)行函數(shù),使用 range 函數(shù)來處理分頁。
函數(shù)
這個就是解析 HTML 的函數(shù),使用的是
函數(shù)
簡易圖片下載器
總結(jié)
本節(jié)講解了爬蟲的基本流程以及需要用到的 庫和方法,并通過一個實際的例子完成了從分析網(wǎng)頁,到數(shù)據(jù)存儲的全過程。其實爬蟲,無外乎模擬請求,解析數(shù)據(jù),保存數(shù)據(jù)。
當(dāng)然有的時候,網(wǎng)站還會設(shè)置各種反爬機制,比如 校驗,請求頻度檢查,非瀏覽器訪問限制,JS 混淆等等,這個時候就需要用到反反爬技術(shù)了,比如抓取 放到 中,使用代理 IP 訪問,使用 模擬瀏覽器等待方式。
由于本課程不是專門的爬蟲課,這些技能就留待你自己去探索挖掘啦。