Python之Instagram圖片爬蟲(chóng)(一)

Hello大家好,許久未見(jiàn),昨天終于打算再寫(xiě)個(gè)爬蟲(chóng)例子,于是今天果斷來(lái)分享一下成果。
本代碼使用Python進(jìn)行書(shū)寫(xiě)。


分析頁(yè)面

然后,我們先打開(kāi)Instagram網(wǎng)站,確認(rèn)能打開(kāi)就表明正常翻墻。由于本期主要爬取圖片,所以特意選取了一個(gè)美女的Instagram為例子,尺度不高,我們打開(kāi)Chrome F12的調(diào)試功能,點(diǎn)選中Network Tab頁(yè)。

個(gè)人首頁(yè)

按照慣例,首先檢查index頁(yè)面的HTML文件中是否存在圖片鏈接。
縮略圖

這里我們復(fù)制class = _mck9w _gvoze _f2mse的字符串去Source Tab頁(yè)下查找,發(fā)現(xiàn)并沒(méi)有結(jié)果,將之拷貝出來(lái),發(fā)現(xiàn)里面的內(nèi)容都是動(dòng)態(tài)生成的。

Source頁(yè)面下的首頁(yè)HTML

這就不得不懷疑,是不是所有的數(shù)據(jù)都以其他形式放在首頁(yè)HTML文件中,或者通過(guò)Ajax異步請(qǐng)求過(guò)來(lái)。我們從Network中隨便拷貝一張圖片的鏈接,如下,然后放到HTML文件中搜索,結(jié)果出現(xiàn)了。

notepad++中搜索出了3條記錄

搜索記錄過(guò)程中,我們發(fā)現(xiàn)了一個(gè)驚喜的地方,那就是被script包裹在里面的windows._shareData,圖片的鏈接就在里面,難得可貴的就是數(shù)據(jù)格式還是json格式的,我們單獨(dú)提取出來(lái)format一下。

json數(shù)據(jù)塊

真正的圖片URL就在nodes數(shù)據(jù)中,這可是個(gè)極大的好消息。

代碼

# -*- coding: utf-8 -*-

import json
from lxml import etree
import requests
import click

headers = {
    "Origin": "https://www.instagram.com/",
    "Referer": "https://www.instagram.com/_8_jjini/",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/58.0.3029.110 Safari/537.36",
    "Host": "www.instagram.com",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "accept-encoding": "gzip, deflate, sdch, br",
    "accept-language": "zh-CN,zh;q=0.8",
    "X-Instragram-AJAX": "1",
    "X-Requested-With": "XMLHttpRequest",
    "Upgrade-Insecure-Requests": "1",
}

BASE_URL = "https://www.instagram.com/_8_jjini/"

proxy = {
    'http': 'http://127.0.0.1:38251',
    'https': 'http://127.0.0.1:38251'
}


def crawl():
    click.echo('start')
    try:
        res = requests.get(BASE_URL, headers=headers, proxies=proxy)
        html = etree.HTML(res.content.decode())
        all_a_tags = html.xpath('//script[@type="text/javascript"]/text()')
        for a_tag in all_a_tags:
            if a_tag.strip().startswith('window'):
                data = a_tag.split('= {')[1][:-1]  # 獲取json數(shù)據(jù)塊
                js_data = json.loads('{' + data, encoding='utf-8')
                edges = js_data["entry_data"]["ProfilePage"][0]["graphql"]["user"]["edge_owner_to_timeline_media"]["edges"]
                for edge in edges:
                    if top_url and top_url == edge["node"]["display_url"]:
                        in_top_url_flag = True
                        break
                    click.echo(edge["node"]["display_url"])
                    new_imgs_url.append(edge["node"]["display_url"])
                click.echo('ok')
    except Exception as e:
        raise e


if __name__ == '__main__':
    crawl()

運(yùn)行的結(jié)果:


圖片的URL
隨便打開(kāi)一條URL

注意了,這里的proxy的配置,只要啟動(dòng)Firefly就能看到的。


代理配置

什么,你說(shuō)怎么下載?那是下回的事情了,我們都還沒(méi)有爬取所有的URL呢,你忘了更多那個(gè)按鈕了嗎?大家下回見(jiàn)~~

下一篇

最后編輯于
?著作權(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)容