未分类

用Python爬取Instagram上某用户的图片(动态页面)(一)

1.打开任意一位Instagram用户的首页,这里以https://www.instagram.com/melissamale/为例,对任意一张图片进行检查,没有发现图片链接,

2.打开图片所在页面,对图片进行检查,发现两个div都指向了该图片,在其中一个div中找到了图片的地址,

3.复制找到的图片地址,回到用户首页,查看页面的源代码,查找链接找到了一个display_url节点,

4.搜索display_url节点,找到了十来个,对应的地址打开后均是图片,并且这些都包含在js脚本中

5.其中的脚本很像json数据,校验之后,确实是json数据,这样就可以利用python中的json库提取相应的节点

搜索json解析,找到一个在线校验工具

6.下面的Python代码将对首页的html源码中的图片链接数据进行提取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# -*- coding: utf-8 -*-

import requests
import json
from lxml import etree
import click
import os

# =========================需要自定义的参数========================================

# 在网站不变动的情况下,只需要更改此处用户名就可以获取首页的12张图片
BASE_URL = "https://www.instagram.com/melissamale/"

# 存储图片的文件夹的路径
path_dir = "C:/Users/xxx/Desktop/intagrsm_img"


# 添加代理,指定本地代理端口
proxies = {
'https': 'https://127.0.0.1:38251'
}

# =========================需要自定义的参数========================================


headers = {"Referer": "https://www.instagram.com/urnotchrislee/?hl=zh-cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}


# 存储首页图片的真实链接的列表
img_list = []


# 下载指定链接的文件到指定目录,path是文件夹的全路径,file_url必须是以后缀名结尾的文件
def download_file(file_url, path):
# 从链接中取出文件的名称
filename = file_url.split("/")[-1]
response = requests.get(file_url, headers=headers, proxies=proxies)
fb = open(path + '/' + filename, 'wb')
fb.write(response.content)
fb.close()


def crawl():
click.echo('start')

# 判断指定存储图片的文件夹是否存在,不存在则创建
if not os.path.exists(path_dir):
os.makedirs(path_dir)

try:
# 发送请求,获取源码
res = requests.get(BASE_URL, headers=headers, proxies=proxies)
html = etree.HTML(res.content.decode())

# 提取所有的script标签中的文本
all_script_tags = html.xpath('//body/script[@type="text/javascript"]/text()')

for script_tag in all_script_tags:
# strip()默认过滤掉空格
if script_tag.strip().startswith(''):
data = script_tag.replace('window._sharedData = ', '')[
:-1] # 提取json数据,必须保证{}外面没有其余数据,尾部的[:-1]去除最后一个字符,这里json数据尾部有个;
json_data = json.loads(data, encoding='utf-8') # 将str格式化成json格式
# 下面的节点可能会随着网站的更新而改变
edges = json_data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media'][
'edges']
for edge in edges:
img_url = edge['node']['display_url'] # 图片的真实链接
img_list.append(img_url)
print(edge['node']['display_url'])
download_file(img_url, path_dir) # 下载图片
break
click.echo('success')

except Exception as e:
raise e


if __name__ == '__main__':
crawl()

以上内容参照下面的文章一本正经的胡说八道着:

Python之Instagram图片爬虫(一)

【python爬虫】动态加载页面的解决办法(以ins为例)

纯属小白,大佬轻喷。

分享到