国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python爬蟲入門保姆級教程!看完不會來找我

什么是爬蟲?

爬蟲就是自動獲取網(wǎng)頁內(nèi)容的程序,例如搜索引擎,Google,Baidu 等,每天都運(yùn)行著龐大的爬蟲系統(tǒng),從全世界的網(wǎng)站中爬蟲數(shù)據(jù),供用戶檢索時使用。

爬蟲流程

其實(shí)把網(wǎng)絡(luò)爬蟲抽象開來看,它無外乎包含如下幾個步驟

  • 模擬請求網(wǎng)頁。模擬瀏覽器,打開目標(biāo)網(wǎng)站。
  • 獲取數(shù)據(jù)。打開網(wǎng)站之后,就可以自動化的獲取我們所需要的網(wǎng)站數(shù)據(jù)。
  • 保存數(shù)據(jù)。拿到數(shù)據(jù)之后,需要持久化到本地文件或者數(shù)據(jù)庫等存儲設(shè)備中。

那么我們該如何使用 Python 來編寫自己的爬蟲程序呢,在這里我要重點(diǎn)介紹一個 Python 庫:Requests。

Requests 使用

Requests 庫是 Python 中發(fā)起 HTTP 請求的庫,使用非常方便簡單。

模擬發(fā)送 HTTP 請求

發(fā)送 GET 請求

當(dāng)我們用瀏覽器打開豆瓣首頁時,其實(shí)發(fā)送的最原始的請求就是 GET 請求

import requestsres = requests.get('http://www.douban.com')print(res)print(type(res))>>><Response [200]><class 'requests.models.Response'>

可以看到,我們得到的是一個 Response 對象

如果我們要獲取網(wǎng)站返回的數(shù)據(jù),可以使用 text 或者 content 屬性來獲取

text:是以字符串的形式返回?cái)?shù)據(jù)

content:是以二進(jìn)制的方式返回?cái)?shù)據(jù)

print(type(res.text))print(res.text)>>><class 'str'> <!DOCTYPE HTML><html lang='zh-cmn-Hans' class=''><head><meta charset='UTF-8'><meta name='google-site-verification' content='ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw' /><meta name='description' content='提供圖書、電影、音樂唱片的推薦、評論和價(jià)格比較,以及城市獨(dú)特的文化生活。'><meta name='keywords' content='豆瓣,廣播,登陸豆瓣'>.....

發(fā)送 POST 請求

對于 POST 請求,一般就是提交一個表單

r = requests.post('http://www.xxxx.com', data={'key''value'})

data 當(dāng)中,就是需要傳遞的表單信息,是一個字典類型的數(shù)據(jù)。

header 增強(qiáng)

對于有些網(wǎng)站,會拒絕掉沒有攜帶 header 的請求的,所以需要做一些 header 增強(qiáng)。比如:UA,Cookie,host 等等信息。

header = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',         'Cookie''your cookie'}res = requests.get('http://www.xxx.com', headers=header)

解析 HTML

現(xiàn)在我們已經(jīng)獲取到了網(wǎng)頁返回的數(shù)據(jù),即 HTML 代碼,下面就需要解析 HTML,來提取其中有效的信息。

BeautifulSoup

BeautifulSoup 是 Python 的一個庫,最主要的功能是從網(wǎng)頁解析數(shù)據(jù)。

from bs4 import BeautifulSoup  # 導(dǎo)入 BeautifulSoup 的方法# 可以傳入一段字符串,或者傳入一個文件句柄。一般都會先用 requests 庫獲取網(wǎng)頁內(nèi)容,然后使用 soup 解析。soup = BeautifulSoup(html_doc,'html.parser')  # 這里一定要指定解析器,可以使用默認(rèn)的 html,也可以使用 lxml。print(soup.prettify())  # 按照標(biāo)準(zhǔn)的縮進(jìn)格式輸出獲取的 soup 內(nèi)容。

BeautifulSoup 的一些簡單用法

print(soup.title)  # 獲取文檔的 titleprint(soup.title.name)  # 獲取 title 的 name 屬性print(soup.title.string)  # 獲取 title 的內(nèi)容print(soup.p)  # 獲取文檔中第一個 p 節(jié)點(diǎn)print(soup.p['class'])  # 獲取第一個 p 節(jié)點(diǎn)的 class 內(nèi)容print(soup.find_all('a'))  # 獲取文檔中所有的 a 節(jié)點(diǎn),返回一個 listprint(soup.find_all('span', attrs={'style''color:#ff0000'}))  # 獲取文檔中所有的 span 且 style 符合規(guī)則的節(jié)點(diǎn),返回一個 list

具體的用法和效果,我會在后面的實(shí)戰(zhàn)中詳細(xì)說明。

XPath 定位

XPath 是 XML 的路徑語言,是通過元素和屬性進(jìn)行導(dǎo)航定位的。幾種常用的表達(dá)式

表達(dá)式含義node選擇 node 節(jié)點(diǎn)的所有子節(jié)點(diǎn)/從根節(jié)點(diǎn)選取//選取所有當(dāng)前節(jié)點(diǎn).當(dāng)前節(jié)點(diǎn)..父節(jié)點(diǎn)@屬性選取text()當(dāng)前路徑下的文本內(nèi)容

一些簡單的例子

xpath('node')  # 選取 node 節(jié)點(diǎn)的所有子節(jié)點(diǎn)xpath('/div')  # 從根節(jié)點(diǎn)上選取 div 元素xpath('//div')  # 選取所有 div 元素xpath('./div')  # 選取當(dāng)前節(jié)點(diǎn)下的 div 元素xpath('//@id')  # 選取所有 id 屬性的節(jié)點(diǎn)

當(dāng)然,XPath 非常強(qiáng)大,但是語法也相對復(fù)雜,不過我們可以通過 Chrome 的開發(fā)者工具來快速定位到元素的 xpath,如下圖

得到的 xpath 為

//*[@id='anony-nav']/div[1]/ul/li[1]/a

在實(shí)際的使用過程中,到底使用 BeautifulSoup 還是 XPath,完全取決于個人喜好,哪個用起來更加熟練方便,就使用哪個。

爬蟲實(shí)戰(zhàn):爬取豆瓣海報(bào)

我們可以從豆瓣影人頁,進(jìn)入都影人對應(yīng)的影人圖片頁面,比如以劉濤為例子,她的影人圖片頁面地址為

https://movie.douban.com/celebrity/1011562/photos/

下面我們就來分析下這個網(wǎng)頁

目標(biāo)網(wǎng)站頁面分析

注意:網(wǎng)絡(luò)上的網(wǎng)站頁面構(gòu)成總是會變化的,所以這里你需要學(xué)會分析的方法,以此類推到其他網(wǎng)站。正所謂授人以魚不如授人以漁,就是這個原因。

Chrome 開發(fā)者工具

Chrome 開發(fā)者工具(按 F12 打開),是分析網(wǎng)頁的絕佳利器,一定要好好使用。

我們在任意一張圖片上右擊鼠標(biāo),選擇“檢查”,可以看到同樣打開了“開發(fā)者工具”,而且自動定位到了該圖片所在的位置

可以清晰的看到,每張圖片都是保存在 li 標(biāo)簽中的,圖片的地址保存在 li 標(biāo)簽中的 img 中。

知道了這些規(guī)律后,我們就可以通過 BeautifulSoup 或者 XPath 來解析 HTML 頁面,從而獲取其中的圖片地址。

代碼編寫

我們只需要短短的幾行代碼,就能完成圖片 url 的提取

import requestsfrom bs4 import BeautifulSoup url = 'https://movie.douban.com/celebrity/1011562/photos/'res = requests.get(url).textcontent = BeautifulSoup(res, 'html.parser')data = content.find_all('div', attrs={'class''cover'})picture_list = []for d in data:    plist = d.find('img')['src']    picture_list.append(plist)print(picture_list)>>>['https://img1.doubanio.com/view/photo/m/public/p2564834267.jpg''https://img1.doubanio.com/view/photo/m/public/p860687617.jpg''https://img1.doubanio.com/view/photo/m/public/p2174001857.jpg''https://img1.doubanio.com/view/photo/m/public/p1563789129.jpg''https://img3.doubanio.com/view/photo/m/public/p2363429946.jpg''https://img1.doubanio.com/view/photo/m/public/p2382591759.jpg''https://img3.doubanio.com/view/photo/m/public/p2363269182.jpg''https://img1.doubanio.com/view/photo/m/public/p1959495269.jpg''https://img3.doubanio.com/view/photo/m/public/p2356638830.jpg''https://img3.doubanio.com/view/photo/m/public/p1959495471.jpg''https://img3.doubanio.com/view/photo/m/public/p1834379290.jpg''https://img3.doubanio.com/view/photo/m/public/p2325385303.jpg''https://img3.doubanio.com/view/photo/m/public/p2361707270.jpg''https://img3.doubanio.com/view/photo/m/public/p2325385321.jpg''https://img3.doubanio.com/view/photo/m/public/p2196488184.jpg''https://img1.doubanio.com/view/photo/m/public/p2186019528.jpg''https://img1.doubanio.com/view/photo/m/public/p2363270277.jpg''https://img3.doubanio.com/view/photo/m/public/p2325240501.jpg''https://img1.doubanio.com/view/photo/m/public/p2258657168.jpg''https://img1.doubanio.com/view/photo/m/public/p2319710627.jpg''https://img3.doubanio.com/view/photo/m/public/p2319710591.jpg''https://img3.doubanio.com/view/photo/m/public/p2311434791.jpg''https://img1.doubanio.com/view/photo/m/public/p2363270708.jpg''https://img3.doubanio.com/view/photo/m/public/p2258657185.jpg''https://img3.doubanio.com/view/photo/m/public/p2166193915.jpg''https://img3.doubanio.com/view/photo/m/public/p2363265595.jpg''https://img3.doubanio.com/view/photo/m/public/p2312085755.jpg''https://img3.doubanio.com/view/photo/m/public/p2311434790.jpg''https://img3.doubanio.com/view/photo/m/public/p2276569205.jpg''https://img1.doubanio.com/view/photo/m/public/p2165332728.jpg']

可以看到,是非常干凈的列表,里面存儲了海報(bào)地址。
但是這里也只是一頁海報(bào)的數(shù)據(jù),我們觀察頁面發(fā)現(xiàn)它有好多分頁,如何處理分頁呢。

分頁處理

我們點(diǎn)擊第二頁,看看瀏覽器 url 的變化

https://movie.douban.com/celebrity/1011562/photos/?type=C&start=30&sortby=like&size=a&subtype=a

發(fā)現(xiàn)瀏覽器 url 增加了幾個參數(shù)

再點(diǎn)擊第三頁,繼續(xù)觀察 url

https://movie.douban.com/celebrity/1011562/photos/?type=C&start=60&sortby=like&size=a&subtype=a

通過觀察可知,這里的參數(shù),只有 start 是變化的,即為變量,其余參數(shù)都可以按照常理來處理

同時還可以知道,這個 start 參數(shù)應(yīng)該是起到了類似于 page 的作用,start = 30 是第二頁,start = 60 是第三頁,依次類推,最后一頁是 start = 420。

于是我們處理分頁的代碼也呼之欲出了

首先將上面處理 HTML 頁面的代碼封裝成函數(shù)

def get_poster_url(res):    content = BeautifulSoup(res, 'html.parser')    data = content.find_all('div', attrs={'class''cover'})    picture_list = []    for d in data:        plist = d.find('img')['src']        picture_list.append(plist)    return picture_list

然后我們在另一個函數(shù)中處理分頁和調(diào)用上面的函數(shù)

def fire():    page = 0    for i in range(045030):        print('開始爬取第 %s 頁' % page)        url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i)        res = requests.get(url).text        data = get_poster_url(res)        page  = 1

此時,我們所有的海報(bào)數(shù)據(jù)都保存在了 data 變量中,現(xiàn)在就需要一個下載器來保存海報(bào)了

def download_picture(pic_l):    if not os.path.exists(r'picture'):        os.mkdir(r'picture')    for i in pic_l:        pic = requests.get(i)        p_name = i.split('/')[7]        with open('picture\\'   p_name, 'wb'as f:            f.write(pic.content)

再增加下載器到 fire 函數(shù),此時為了不是請求過于頻繁而影響豆瓣網(wǎng)的正常訪問,設(shè)置 sleep time 為1秒

def fire():    page = 0    for i in range(045030):        print('開始爬取第 %s 頁' % page)        url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i)        res = requests.get(url).text        data = get_poster_url(res)        download_picture(data)        page  = 1        time.sleep(1)

下面就執(zhí)行 fire 函數(shù),等待程序運(yùn)行完成后,當(dāng)前目錄下會生成一個 picture 的文件夾,里面保存了我們下載的所有海報(bào)

核心代碼講解

下面再來看下完整的代碼

import requestsfrom bs4 import BeautifulSoupimport timeimport osdef fire():    page = 0    for i in range(045030):        print('開始爬取第 %s 頁' % page)        url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i)        res = requests.get(url).text        data = get_poster_url(res)        download_picture(data)        page  = 1        time.sleep(1)def get_poster_url(res):    content = BeautifulSoup(res, 'html.parser')    data = content.find_all('div', attrs={'class''cover'})    picture_list = []    for d in data:        plist = d.find('img')['src']        picture_list.append(plist)    return picture_listdef download_picture(pic_l):    if not os.path.exists(r'picture'):        os.mkdir(r'picture')    for i in pic_l:        pic = requests.get(i)        p_name = i.split('/')[7]        with open('picture\\'   p_name, 'wb'as f:            f.write(pic.content)if __name__ == '__main__':    fire()

fire 函數(shù)

這是一個主執(zhí)行函數(shù),使用 range 函數(shù)來處理分頁。

  • range 函數(shù)可以快速的創(chuàng)建整數(shù)列表,在 for 循環(huán)時及其好用。函數(shù)中的0代表從0開始計(jì)數(shù),450代表一直迭代到450,不包含450,30代表步長,即每次遞增的數(shù)字間隔。range(0, 450, 30),依次會輸出:0,30,60,90 …
  • format 函數(shù),是一種字符串格式化方式
  • time.sleep(1) 即為暫停1秒鐘

get_poster_url 函數(shù)

這個就是解析 HTML 的函數(shù),使用的是 BeautifulSoup

  • 通過 find_all 方法查找所有 class 為 “cover” 的 div 元素,返回的是一個列表
  • 使用 for 循環(huán),循環(huán)上一步拿到的列表,取出 src 的內(nèi)容,append 到列表中
  • append 是列表的一個方法,可以在列表后面追加元素

download_picture 函數(shù)

簡易圖片下載器

  • 首先判斷當(dāng)前目錄下是否存在 picture 文件夾,os.path.exists
  • os 庫是非常常用用來操作系統(tǒng)相關(guān)的命令庫,os.mkdir 就是創(chuàng)建文件夾
  • split 用于切割字符串,取出角標(biāo)為7的元素,作為存儲圖片的名稱
  • with 方法用來快速打開文件,打開的進(jìn)程可以自行關(guān)閉文件句柄,而不再需要手動執(zhí)行 f.close() 關(guān)閉文件

總結(jié)

本節(jié)講解了爬蟲的基本流程以及需要用到的 Python 庫和方法,并通過一個實(shí)際的例子完成了從分析網(wǎng)頁,到數(shù)據(jù)存儲的全過程。其實(shí)爬蟲,無外乎模擬請求,解析數(shù)據(jù),保存數(shù)據(jù)。

當(dāng)然有的時候,網(wǎng)站還會設(shè)置各種反爬機(jī)制,比如 cookie 校驗(yàn),請求頻度檢查,非瀏覽器訪問限制,JS 混淆等等,這個時候就需要用到反反爬技術(shù)了,比如抓取 cookie 放到 headers 中,使用代理 IP 訪問,使用 Selenium 模擬瀏覽器等待方式。

由于本課程不是專門的爬蟲課,這些技能就留待你自己去探索挖掘啦。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python爬蟲日記一:爬取豆瓣電影中速度與激情8演員圖片
淺談Python網(wǎng)絡(luò)爬蟲
程序員使用爬蟲的一些技巧和方法
網(wǎng)絡(luò)爬蟲 | 使用Python采集小組組員信息
python爬蟲15 | 害羞,用多線程秒爬那些萬惡的妹紙們,紙巾呢?
學(xué)會Python這幾個類庫使用,快速寫爬蟲不是問題(詳細(xì)步驟附源碼)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服