最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲(chóng)實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片

 更新時(shí)間:2022年07月07日 10:43:40   作者:EastMage  
最近決定寫(xiě)個(gè)P站的爬蟲(chóng),實(shí)際操作起來(lái)確實(shí)遇到了些新問(wèn)題,通過(guò)解決也有所收獲,下面這篇文章主要給大家介紹了關(guān)于python爬蟲(chóng)實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片的相關(guān)資料,需要的朋友可以參考下

自從接觸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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 中類的構(gòu)造方法 __New__的妙用

    Python 中類的構(gòu)造方法 __New__的妙用

    這篇文章主要介紹了Python 中類的構(gòu)造方法 New的妙用,Python 的類中,所有以雙下劃線__包起來(lái)的方法,叫魔術(shù)方法,魔術(shù)方法在類或?qū)ο蟮哪承┦录l(fā)出后可以自動(dòng)執(zhí)行,讓類具有神奇的魔力。下面就來(lái)學(xué)習(xí)文章的詳細(xì)內(nèi)容把
    2021-10-10
  • python實(shí)現(xiàn)連連看輔助(圖像識(shí)別)

    python實(shí)現(xiàn)連連看輔助(圖像識(shí)別)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)連連看輔助程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • python 從list中隨機(jī)取值的方法

    python 從list中隨機(jī)取值的方法

    這篇文章主要介紹了python 從list中隨機(jī)取值的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 使用Python實(shí)現(xiàn)批量修改文件的修改日期功能

    使用Python實(shí)現(xiàn)批量修改文件的修改日期功能

    在日常的文件管理中,您可能需要批量修改文件的修改日期,比如,您可能希望將某個(gè)文件夾中的所有文件的修改日期隨機(jī)設(shè)置為6到8月份之間的日期,這在數(shù)據(jù)整理中可能非常有用,本文將詳細(xì)介紹如何使用Python實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2024-10-10
  • 實(shí)例詳解Python模塊decimal

    實(shí)例詳解Python模塊decimal

    這篇文章主要介紹了Python模塊decimal ,Python提供了decimal模塊用于十進(jìn)制數(shù)學(xué)計(jì)算,它具有以下特點(diǎn)在文中給大家詳細(xì)介紹,需要的朋友可以參考下
    2019-06-06
  • 全面理解python命名空間字典

    全面理解python命名空間字典

    本文主要介紹了全面理解python命名空間字典,python的命名空間由字典實(shí)現(xiàn),屬性為鍵,對(duì)象為值,通過(guò)屬性找到對(duì)象,下面就來(lái)具體了解一下,感興趣的可以了解一下
    2023-12-12
  • python接口自動(dòng)化之正則用例參數(shù)化的示例詳解

    python接口自動(dòng)化之正則用例參數(shù)化的示例詳解

    這篇文章主要介紹了python接口自動(dòng)化之正則用例參數(shù)化,它是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Python?數(shù)據(jù)類型中的字符串和數(shù)字

    Python?數(shù)據(jù)類型中的字符串和數(shù)字

    這篇文章主要介紹了Python?數(shù)據(jù)類型中的字符串和數(shù)字,Python3中有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型,Number、String、List、Tuple、Set、Dictionary,加先來(lái)我們就來(lái)看看這幾種數(shù)據(jù)類型的具體相關(guān)介紹,需要的小伙伴可以參考一下
    2022-02-02
  • 《Python學(xué)習(xí)手冊(cè)》學(xué)習(xí)總結(jié)

    《Python學(xué)習(xí)手冊(cè)》學(xué)習(xí)總結(jié)

    本篇文章是讀者朋友在學(xué)習(xí)了《Python學(xué)習(xí)手冊(cè)》這本書(shū)以后,總結(jié)出的學(xué)習(xí)心得,值得大家參考學(xué)習(xí)。
    2018-01-01
  • Python實(shí)現(xiàn)粒子群算法詳解

    Python實(shí)現(xiàn)粒子群算法詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)粒子群算法詳解,粒子群算法,縮寫(xiě)為PSO(Particle Swarm Optimization),是一種非線性尋優(yōu)算法,其特點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單、收斂速度快,對(duì)多元函數(shù)的局部最優(yōu)有較好的克服能力,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

新沂市| 西平县| 札达县| 化隆| 定州市| 库车县| 师宗县| 汶上县| 称多县| 临泽县| 肇东市| 隆安县| 徐水县| 松江区| 贵溪市| 水富县| 丰原市| 汝州市| 阜城县| 星子县| 荔波县| 平山县| 清河县| 凉城县| 杨浦区| 密山市| 泰兴市| 新野县| 德兴市| 依安县| 珲春市| 繁昌县| 高密市| 鄢陵县| 林口县| 临安市| 陈巴尔虎旗| 宾阳县| 韶山市| 龙海市| 额尔古纳市|