Python爬蟲(chóng)日記一:爬取豆瓣電影中速度與激情8演員圖片

一、前言

這是我第一次寫(xiě)文章,作為一個(gè)非計(jì)算機(jī),編程類(lèi)專(zhuān)業(yè)的大二學(xué)生,我希望能夠給像我這樣的入門(mén)的朋友一些幫助,也同時(shí)激勵(lì)自己努力寫(xiě)代碼。好了廢話不多說(shuō),今天我做的爬蟲(chóng)是豆瓣的一個(gè)電影——速度與激情8的全部影人頁(yè)面,貼出網(wǎng)址:速度與激情8 全部影人。
目標(biāo):爬取速度與激情8中全部影人的圖片并且用圖中人物的名字給圖片文件命名,最后保存在電腦中。

豆瓣1.png

二、運(yùn)行環(huán)境

  • 系統(tǒng)版本
    Windows10 64位
  • Python版本
    Python3.6 我用的是Anaconda集成版本
  • IDE
    PyCharm 學(xué)生可以通過(guò)edu郵箱免費(fèi)使用,不是學(xué)生的朋友可以試試社區(qū)版,不明白怎么安裝的可以留言或者 私信我。

三、分析

爬蟲(chóng)的三個(gè)要點(diǎn):請(qǐng)求,解析,存儲(chǔ)
請(qǐng)求可以使用urllib Requests ,其中urllib是自帶的, Requests是第三方庫(kù),功能更強(qiáng)大,本次使用的是urllib。
解析我用的有正則表達(dá)式,xpath,本次使用的是正則表達(dá)式,主要是想自己用正則來(lái)練練 只看正則的說(shuō)明不能理解其中的奧秘ヾ(o???)?ヾ,必須多試試。
儲(chǔ)存常用的有保存到內(nèi)存,數(shù)據(jù)庫(kù),硬盤(pán)中,本次是保存到電腦硬盤(pán)中

四、實(shí)戰(zhàn)

首先導(dǎo)入我們需要的模塊
import urllib.request import os import re
urllib.request是用來(lái)請(qǐng)求的,os是操作文件目錄常用的模塊,re是python中正則表達(dá)式的模塊,
url = 'https://movie.douban.com/subject/26260853/celebrities' r = urllib.request.urlopen(url) html = r.read().decode('utf-8')
第一行很明顯是本次爬蟲(chóng)的網(wǎng)頁(yè), r = urllib.request.urlopen(url)用來(lái)打開(kāi)網(wǎng)頁(yè), r.read()是讀取網(wǎng)頁(yè)內(nèi)容,decode('utf-8')是用utf-8編碼對(duì)字符串str進(jìn)行解碼,以獲取unicode。

之后我們來(lái)獲取一下圖片的地址,用Chrome瀏覽器打開(kāi)速度與激情8的全部影人頁(yè)面,按下F12,分析一下,可知每個(gè)人的照片地址都是img1或者3.doubanio.com/img/celebrity/medium/幾個(gè)數(shù)字.jpg

Paste_Image.png

我們使用正則表達(dá)式來(lái)匹配一下這些圖片地址,1或者3部分用\d匹配,末尾數(shù)字部分用.*來(lái)匹配即可。
result = re.findall(r'https://img\d.doubanio.com/img/celebrity/medium/.*.jpg',html)
現(xiàn)在圖片地址也有了,還需要把這些人物的名字給爬下來(lái),之后才能配對(duì)文件,再次分析一下剛才的網(wǎng)址。看到這些人物的名字都是以title=開(kāi)頭,我們就用它來(lái)正則匹配一下,來(lái)獲取全部的人物名字,放進(jìn)一個(gè)列表中。
Paste_Image.png

result2 = re.findall(r'(?<=title=").\S+', html) result2.pop() result3 = sorted(set(result2), key=result2.index) result3.pop(-3)
第一行代碼中re.findall(r'(?<=title=").\S+', html)用來(lái)匹配截圖中title="后面的名字
第二行代碼中pop()是去除最后一個(gè)元素,因?yàn)榍懊嫫ヅ浜蟮牧斜碇杏幸粋€(gè)非人物名字的元素所以我們就需要把它去掉
第三行代碼中sorted(set(result2), key=result2.index)有兩個(gè)功能,一個(gè)是使用set()集合函數(shù)來(lái)去除列表中重復(fù)元素,另一個(gè)是sorted()函數(shù)是給列表排序用的,key=result2.index的意思是以result2原來(lái)的索引順序來(lái)給新的列表排序,因?yàn)槊繌垐D片很名字是對(duì)應(yīng)的,如果單單使用set(),雖然重復(fù)的去除了但是順序也變了,所以我們需要利用sort()結(jié)合key=result2.index來(lái)排序才行。
result3.pop(-3)意思是刪除result3中倒數(shù)第三個(gè)元素,因?yàn)榭死锼埂つΩ@個(gè)沒(méi)照片所以我就把他刪了。

之后我們來(lái)給本地創(chuàng)建一個(gè)文件夾用來(lái)保存圖片,這里就用到了os模塊
if not os.path.exists('douban'): os.makedirs('douban')

之后需要的是下載這些人物圖片,利用之前爬取的人物名字給對(duì)應(yīng)圖片命名并保存。
i = 0 for link in result: filename = 'douban\' + str(result3[i])+ '.jpg' i += 1 with open(filename, 'w') as file: urllib.request.urlretrieve(link, filename)

完整代碼貼出來(lái),需要的同學(xué)可以試試。
import urllib.request import os import re url = 'https://movie.douban.com/subject/26260853/celebrities' r = urllib.request.urlopen(url) html = r.read().decode('utf-8') result = re.findall(r'https://img\d.doubanio.com/img/celebrity/medium/.*.jpg', html) result2 = re.findall(r'(?<=title=").\S+', html) result2.pop() result3 = sorted(set(result2), key=result2.index) result3.pop(-3) if not os.path.exists('douban'): os.makedirs('douban') i = 0 for link in result: filename = 'douban\\' + str(result3[i]) + '.jpg' i += 1 with open(filename, 'w') as file: urllib.request.urlretrieve(link, filename)

五、總結(jié)

最后效果,圖片都下載在我剛才指定的文件夾中了。


Paste_Image.png

第一次寫(xiě)文章,對(duì)很多東西不是很熟悉,如果有任何問(wèn)題,請(qǐng)多多指教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容