python爬蟲(chóng)實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片
自從接觸python以后就想著爬pixiv,之前因?yàn)樘葑佑悬c(diǎn)問(wèn)題就一直擱置,最近換了個(gè)梯子就迫不及待試了下。
爬蟲(chóng)無(wú)非request獲取html頁(yè)面然后用正則表達(dá)式或者beautifulsoup之類現(xiàn)成工具截取我們想要的頁(yè)面,pixiv也不例外。
首先我們來(lái)實(shí)現(xiàn)模擬登陸,雖然大多數(shù)情況不需要我們實(shí)現(xiàn)模擬登錄,但如果你是會(huì)員之類的,登錄和不登錄網(wǎng)頁(yè)就有區(qū)別。思路是登錄時(shí)抓包抓到post請(qǐng)求,看pixiv構(gòu)建的post的數(shù)據(jù)表格是什么格式,我們根據(jù)這個(gè)格式構(gòu)建form,然后調(diào)用post方法去請(qǐng)求,再保存到session中,之后訪問(wèn)相關(guān)頁(yè)面用session替代requests即可。
可以看到pixiv登錄的網(wǎng)址如下,直接復(fù)制:

抓包找到提交數(shù)據(jù)的請(qǐng)求:

![]()
可以看到表單數(shù)據(jù)主要是這幾個(gè),經(jīng)過(guò)幾次嘗試,我們?cè)谀M的時(shí)候只需要構(gòu)建password、pixiv_id、post_key再加上一個(gè)return_to(第二張)即可。pixiv_id就是我們的賬號(hào),password是密碼,return_to照著填就行,但這個(gè)post_key卻是隨機(jī)的。
但我們也有辦法,它是我們每次訪問(wèn)登錄頁(yè)面時(shí)動(dòng)態(tài)生成的,這就好辦了,再登錄前先爬取一次登錄前的頁(yè)面,找到postkey。
看到下圖紅圈里面:

那就可以直接正則爬?。?/p>
def get_postkey():
login_url='https://accounts.pixiv.net/login?return_to=https%3A%2F%2Fwww.pixiv.net%2F&lang=zh&source=pc&view_type=page'
response=requests.get(url=login_url,headers=headers,verify=False)
html=response.text
# print(html)
postkey=re.findall('"pixivAccount.postKey":"(.*?)","pixivAccount.recaptchaEnterpriseCheckboxSiteKey"',html)
return postkey[0]然后我們就可以構(gòu)建數(shù)據(jù)包:
pixiv_id="賬號(hào)" # 你的pixiv賬號(hào) password='xxxxx' # 你的pixiv密碼 return_to='https://www.pixiv.net/' post_key=get_postkey()
實(shí)例化一個(gè)session對(duì)象,然后post提交就能完成模擬登陸:
session=requests.Session()
form_data={
'pixiv_id':pixiv_id,
'password':password,
'return_to':return_to,
'post_key':post_key
}
login_url1='https://accounts.pixiv.net/login?return_to=https%3A%2F%2Fwww.pixiv.net%2F&lang=zh&source=pc&view_type=page'
res=session.post(url=login_url1,headers=headers,data=form_data)
# 至此模擬登錄成功到此模擬登錄就成功了,接下來(lái)就是爬我們想要的圖片,以爬排行榜為例:
打開(kāi)排行榜頁(yè)面,鼠標(biāo)懸停圖片,右鍵檢查,可以找到對(duì)應(yīng)的代碼位置:

找到每張圖片的相似結(jié)構(gòu),我們可以用BeautifulSoup 找到節(jié)點(diǎn),然后正則爬我們想要的網(wǎng)址:

先找到包含每張圖片各種信息的節(jié)點(diǎn),通過(guò)類名查找,然后對(duì)于每一個(gè)節(jié)點(diǎn)進(jìn)行正則提取,提取出對(duì)應(yīng)圖片的下載鏈接,不過(guò)需要特別注意的是,pixiv直接顯示的圖片源是騙你的,真正的圖片鏈接的形式應(yīng)該是:
https://i.pximg.net/img-original/img/xxxx/xx/xx/xx/xx/xx/xxxxxxxx_p0.png
這樣的,直接把這個(gè)網(wǎng)址復(fù)制網(wǎng)頁(yè)欄訪問(wèn)會(huì)顯示403,因?yàn)閜ixiv限制了必須從pixiv網(wǎng)頁(yè)點(diǎn)進(jìn)這個(gè)網(wǎng)址,所以我們首先必須headers構(gòu)建refer-to,然后通過(guò)排行榜提取到信息后還需要自己手動(dòng)構(gòu)建正確的網(wǎng)址:
headers = {'Referer': 'https://www.pixiv.net/',
}def get_accurate_url(url):
urll='https://i.pximg.net/img-original/img/' + str(url) + "_p0.jpg"
return urll這里的代碼偷了個(gè)懶,全部當(dāng)作jpg來(lái)處理,下載的時(shí)候再處理png的情況
下載的具體函數(shù),我們對(duì)每一個(gè)網(wǎng)址的后續(xù)部分提取出來(lái)作名字,隨機(jī)睡眠1到4秒防止pixiv認(rèn)出我們是爬蟲(chóng)把我們ip給封了,之后就是對(duì)網(wǎng)址進(jìn)行訪問(wèn)下載,這里如果訪問(wèn)返回的狀態(tài)碼是404說(shuō)明它其實(shí)是個(gè)png格式的圖片,所以對(duì)png格式的文件重新構(gòu)建正確的網(wǎng)址即可:
def download(list,filename):
i=1
for url in list:
pic_name=re.findall("https://i.pximg.net/img-original/img/(.*?)_p0.jpg",str(url))
pic_name1=str(pic_name[0]).replace("/",".")
r = random.randint(1, 4)
time.sleep(r)
response=requests.get(url=url,headers=headers,verify=False)
if(response.status_code==404):
the_url='https://i.pximg.net/img-original/img/' + str(pic_name[0]) + "_p0.png"
response = requests.get(url=the_url, headers=headers, verify=False)
with open(path + filename + '/' + str(pic_name1) + '.png', 'wb') as f:
f.write(response.content)
print("第" + str(i) + "張圖片已下載成功??!")
else:
with open(path + filename + '/' + str(pic_name1) + '.jpg', 'wb') as f:
f.write(response.content)
print("第" + str(i) + "張圖片已下載成功??!")
i+=1最后就是成功下載排行榜的圖片:

另外我在爬的時(shí)候發(fā)現(xiàn)pixiv很多網(wǎng)頁(yè)獲取時(shí)會(huì)隱藏body部分的內(nèi)容,包括但不限于各個(gè)tag的網(wǎng)頁(yè)和單個(gè)id圖片的網(wǎng)頁(yè),一開(kāi)始以為是沒(méi)有登錄的原因,但是實(shí)現(xiàn)登錄后發(fā)現(xiàn)依然如此,推測(cè)可能是body部分內(nèi)容是子網(wǎng)頁(yè)或者javsscript生成之類的,反正前端有一萬(wàn)種方法達(dá)成這個(gè)目的,這個(gè)之后再研究怎么爬。
總結(jié)
到此這篇關(guān)于python爬蟲(chóng)實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片的文章就介紹到這了,更多相關(guān)python爬取pixiv圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 十個(gè)Python練手的實(shí)戰(zhàn)項(xiàng)目,學(xué)會(huì)這些Python就基本沒(méi)問(wèn)題了(推薦)
- 分享7個(gè) Python 實(shí)戰(zhàn)項(xiàng)目練習(xí)
- Python實(shí)戰(zhàn)項(xiàng)目刮刮樂(lè)的實(shí)現(xiàn)詳解流程
- Python實(shí)戰(zhàn)項(xiàng)目之MySQL tkinter pyinstaller實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- python實(shí)戰(zhàn)項(xiàng)目scrapy管道學(xué)習(xí)爬取在行高手?jǐn)?shù)據(jù)
- python游戲?qū)崙?zhàn)項(xiàng)目之童年經(jīng)典超級(jí)瑪麗
- python游戲的魅力之冒險(xiǎn)島實(shí)戰(zhàn)項(xiàng)目
- Python實(shí)戰(zhàn)項(xiàng)目用PyQt5制作漫畫(huà)臉GUI界面
- Python PyQt5實(shí)戰(zhàn)項(xiàng)目之網(wǎng)速監(jiān)控器的實(shí)現(xiàn)
- 使用python來(lái)玩一次股票代碼詳解
相關(guān)文章
python實(shí)現(xiàn)的生成word文檔功能示例
這篇文章主要介紹了python實(shí)現(xiàn)的生成word文檔功能,涉及Python數(shù)據(jù)查詢、遍歷及word文檔生成相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
Python使用lambda表達(dá)式對(duì)字典排序操作示例
這篇文章主要介紹了Python使用lambda表達(dá)式對(duì)字典排序操作,結(jié)合實(shí)例形式分析了lambda表達(dá)式實(shí)現(xiàn)字典按鍵排序、按值排序、多條件排序相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
Python數(shù)據(jù)可視化探索實(shí)例分享
這篇文章主要介紹了Python數(shù)據(jù)可視化探索實(shí)例分享,數(shù)據(jù)可視化是指用圖形或表格的方式來(lái)呈現(xiàn)數(shù)據(jù),關(guān)于更多相關(guān)介紹需要的小伙伴可以參考下面文章的具體內(nèi)容2022-05-05
使用python搭建代理IP池實(shí)現(xiàn)接口設(shè)置與整體調(diào)度
在網(wǎng)絡(luò)爬蟲(chóng)中,代理IP池是一個(gè)非常重要的組件,由于許多網(wǎng)站對(duì)單個(gè)IP的請(qǐng)求有限制,因此,我們需要一個(gè)代理IP池,在本文中,我們將使用Python來(lái)構(gòu)建一個(gè)代理IP池,然后,我們將使用這個(gè)代理IP池來(lái)訪問(wèn)我們需要的數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12
Jupyter notebook 遠(yuǎn)程配置及SSL加密教程
這篇文章主要介紹了Jupyter notebook 遠(yuǎn)程配置及SSL加密教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5基本控件使用解析
PyQt5 提供了豐富的輸入輸出控件。本文介紹通過(guò) QtDesigner 工具欄創(chuàng)建常用的基本控件,包括各種按鈕控件、文本輸入控件和調(diào)節(jié)輸入控件2021-10-10
python如何實(shí)現(xiàn)圖片轉(zhuǎn)文字
這篇文章主要介紹了python如何實(shí)現(xiàn)圖片轉(zhuǎn)文字問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Pytorch反向傳播中的細(xì)節(jié)-計(jì)算梯度時(shí)的默認(rèn)累加操作
這篇文章主要介紹了Pytorch反向傳播中的細(xì)節(jié)-計(jì)算梯度時(shí)的默認(rèn)累加操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

