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)~~
