原創(chuàng)?小瑜??3月28日
大家好沪摄,我是小瑜!在文末給大家準(zhǔn)備了一些爬蟲的學(xué)習(xí)資料纱烘,需要的自己提取杨拐。
最近小瑜在跟別人聊天的時(shí)候,常常因?yàn)闆]有一個(gè)有趣的表情包而使得聊天枯燥無味且尷尬擂啥,所以哄陶,小瑜花費(fèi)了一個(gè)小時(shí),用Python爬取了40w+表情包∑∷現(xiàn)在來分享給大家!
分析網(wǎng)頁
我們此次是從百度圖片中爬取表情包奕筐。
首先我們按F12打開開發(fā)者模式,對name里面的網(wǎng)頁進(jìn)行觀察变骡,發(fā)現(xiàn)我們要的圖片數(shù)據(jù)存在XHR中离赫,如圖:
我們進(jìn)一步發(fā)現(xiàn),單個(gè)網(wǎng)頁中只存有30張表情包的數(shù)據(jù)塌碌,那么我們只要找到每個(gè)網(wǎng)頁URL之間的關(guān)系渊胸,就可以進(jìn)行批量提取了。我觀察了前三個(gè)URL中的params參數(shù)台妆,發(fā)現(xiàn)了URL之間存在的規(guī)律翎猛,每一頁的params參數(shù)中的gsm參數(shù)在上一頁中存儲著,且pn參數(shù)比上一頁多30接剩。如圖:
所以切厘,綜上我們就構(gòu)建出了網(wǎng)頁的URL,部分代碼如下:
('word','表情包'),
('s',''),
('se',''),
('tab',''),
('width',''),
('height',''),
('face','0'),
('istype','2'),
('qc',''),
('nc','1'),
('fr',''),
('expermode',''),
('force',''),
('pn', str(page *30)),
('rn','30'),
('gsm', re.findall('"gsm":"(.*?)"',response.text)),
)
獲取數(shù)據(jù)
從上面我們可以看出百度圖片的數(shù)據(jù)用json轉(zhuǎn)化成字典的形式提取是最簡單的方式懊缺,但是它提取到第10頁后會出現(xiàn)這個(gè)錯(cuò)誤疫稿。
好不容易才分析好了網(wǎng)頁,沒想到才爬取了10頁數(shù)據(jù)就over了鹃两。
不過遗座,小瑜并沒有放棄,而是繼續(xù)的研究俊扳。
皇天不負(fù)有心人途蒋,終于讓小瑜找到了解決辦法。我們不在將數(shù)據(jù)轉(zhuǎn)化成字典馋记,而是轉(zhuǎn)化成字符串号坡,然后用正則表達(dá)式進(jìn)行提取懊烤,就可以批量獲取表情包了。代碼如下:
response = requests.get('https://image.baidu.com/search/acjson', headers=headers,cookies=cookies,params=params)
a = re.findall('"thumbURL":"(.*?jpg)"', response.text)
names = re.findall('"fromPageTitleEnc":"(.*?)",',response.text)
讓我們來看看提取的效果:
效果很好筋帖,沒有什么問題奸晴,那我們就可以開始著手準(zhǔn)備存儲圖片了。
存儲圖片
數(shù)據(jù)存儲的方式在之前的文章已經(jīng)講的很清楚了(不懂的朋友可以看看這篇文章一文教會你日麸,Python數(shù)據(jù)如何存儲)寄啼,這里我們不在詳細(xì)介紹,我們直接展示代碼:
foriina:
r = requests.get(i)
try:
withopen(f'{names[x]}.jpg','ab')asf:
f.write(r.content)
x=x+1
except:
pass
讓我們來看看效果圖:
總結(jié)
1.?本文詳細(xì)的介紹了如何從百度圖片上批量獲取表情包代箭,請讀者仔細(xì)閱讀墩划,并加以操作!(僅供學(xué)習(xí),不做商用)
2. URL中params參數(shù)需要在上一頁數(shù)據(jù)中獲取嗡综,是URL構(gòu)造的新形式乙帮,請讀者仔細(xì)研究!
3. 資料下載到本地打開极景,直接網(wǎng)頁打開會顯示壓縮包錯(cuò)誤察净。(鏈接:https://pan.baidu.com/s/1Lq5J9-o7horh0RN15mS9Iw
提取碼:gols)