【python】爬取堆糖的一些图片

本博文爬取的都是公开分享的官方允许爬取的图片,不涉及隐私,爬取的数据量很小,仅用于技术学习。

一、准备工作

IDE:pycharm
浏览器:Chrome或者Firefox,别的也行,只要有审查元素的功能就行
工具包: requests模块,如果未安装,则执行pip install requests
要爬取的图片所在的网址:
https://www.duitang.com/search/?kw=%E5%B0%8F%E5%A7%90%E5%A7%90&type=feed

二、步骤

以Chrome为例,首先进入
https://www.duitang.com/search/?kw=%E5%B0%8F%E5%A7%90%E5%A7%90&type=feed
然后按F12或鼠标右键菜单中的检查选项
按如下所示点击,可以看到json文件的内容,每个json文件包含了24张图片的信息,包括图片的url地址
指引
以第二个json文件为例,我们按照json对象的层级关系找到了第2张图片的地址,如下所示
图片地址
下面是要请求的json文件的URL
json_url
注意下面三个URL的区别
第一个json
第二个json
第三个json

  1. 根据上述数据,写代码,如下所示。
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
# -- coding: utf-8 --
# @Time : 2023/3/14 15:32
# @Author : LiYuexi
# @File : 堆糖.py
# @Software: PyCharm


import requests

# 网页前缀(不包括数据)
pre_url = 'https://www.duitang.com/napi/blogv2/list/by_search/'

# HTTP请求携带的数据
# 请按照你当时的实际抓到的json的url,填写data中的数据,每个人都不一样
data = {
'kw': '小姐姐',
'after_id': '0',
'type': 'feed',
'include_fields': 'top_comments,is_root,source_link,item,buyable,root_id,status,like_count,like_id,sender,album,reply_count,favorite_blog_id',
'_type': '',
'_': '1678775422730'
}

# 请求头信息
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}

num = 1
#爬取3次,每次爬24张图片
for k in range(3):
# 发送HTTP请求,请求一个包含了24张图片url信息的json文件,请求方式是get,并依次指定不带数据的url,携带的数据和请求头
response = requests.get(url=pre_url,params=data,headers=header)
# '_'表示组号,将'_'加1,表示请求下一组
data['_'] = str(int(data['_']) + 1)
# 起始图片id加24,也表示请求下一组
data['after_id'] = str(int(data['after_id']) + 24)
#将HTTP响应的数据字段从字符串格式转化为json格式
response_json = response.json()
# 检索json格式中的object_list字段
object_list = response_json['data']['object_list']
# 依次下载列表中每一个url所指定的图片
for i in object_list:
img_url = i['photo']['path']
# 发送HTTP请求,请求方式是get,请求一张图片
img = requests.get(url=img_url,headers=header)
# 将图片保存到本地路径,事先创建好图片文件夹
with open('图片\\' + str(num) + '.jpeg', mode='wb') as f:
#将图片的内存写入文件
f.write(img.content)
# 计数变量加1
num += 1