自从上次爬取了虎牙1000多位小姐姐照片《》之后,有粉丝反馈说 虎牙这些小姐姐照片都太俗气了,建议去爬爬 图虫网美女标签(https://tuchong.com/tags/%E7%BE%8E%E5%A5%B3
)上的高质量小姐姐照片。
我打开网页找到某个封面图点进去查看组图,直接点击下载按钮提示“该照片有版权限制不可下载”,所以咱们还是别去下载了吧。
鉴于以上情况,这里咱们重点强调声明:本文仅限于做技术交流学习,请勿用作任何非法商用!
图虫创意是北京字节跳动科技有限公司所创立的正版照片及视频素材平台 ,致力于为用户提供正版素材内容及数字资产管理解决方案。
接下来,我们按照上次在《》介绍的爬虫流程来展开介绍这次爬虫实战哈。
打开目标网页(https://tuchong.com/tags/%E7%BE%8E%E5%A5%B3
),发现下拉会加载更多但是网页地址栏的url没有变化。因此,我们断定这是一个动态网页,于是有了以下步骤:
- 需要按“F12”进入到浏览器的开发者模式;
- 点击“Network”—>XHR或JS或者你全部查找看;
- 进行翻页(可能是点击下一页或者下滑加载更多或者直接F5刷新页面);
- 观察第2步中name模块的内容变化,寻找。
很好,我们找到了照片组图信息所在,如下图所示,在请求的结果中的postList里是单页全部照片组信息列表,列表的每个元素中的imges里是该组照片信息列表。通过这些字段大致能理解照片img_id
归属于某个作者user_id
或author_id
。
记住这组照片信息:
# 照片id
img_id = 360962642
# 照片归属作者id
author_id = 5489136
我们点开Headers模块,可以看到真实请求地址基础URL和请求参数如下:
# 基础URL
url='https://tuchong.com/rest/tags/%E7%BE%8E%E5%A5%B3/posts'
# 请求参数
parames ={
'page': 1, # 随着翻页而递增变化
'count': 20,
'order': 'weekly',
'before_timestamp': ''
}
到这里没完,单纯知道了请求这些组图信息列表的地址,但是每个组图里照片的地址暂时还无法得知。于是我们点开某个组图进行进一步查看,在组图的详情页里,F12->Elements
查看照片元素信息,发现结果如下:
在网页HTML源代码里,我们找到了照片的地址为https://photo.tuchong.com/5489136/f/360962642.jpg
。
结合之前我们记住的照片信息如下,我们便可以拼接出目标照片的地址了。
# 照片id img_id = 360962642 # 照片归属作者id author_id = 5489136 # 照片地址 img_url = f'https://photo.tuchong.com/{author_id}/f/{img_id}.jpg'
在浏览器输入这个照片地址,我们发现果然就是我们需要的:
这一步就比较简单了,直接引入requests库,然后get请求即可。
import requests
# 基础URL地址
url = 'https://tuchong.com/rest/tags/%E7%BE%8E%E5%A5%B3/posts'
# 请求参数
parames ={
'page': 1,
'count': 20,
'order': 'weekly',
'before_timestamp': ''
}
r = requests.get(url, params=parames)
# 前面网页分析结果是请求结果为json格式数据
j = r.json()
我们查看请求结果中的json数据结构,可以很快找到目标照片的url地址参数:
我们以获取单个照片url地址为例展示:
# 获取postList列表
postList = j['postList']
# 选取某一个为例
post = postList[3]
# 作者id
author_id = post['author_id']
# 组图列表
images = post['images']
# 以第一张图为例
image = images[0]
# 照片id
img_id = image['img_id']
# 照片地址
img_url = f'https://photo.tuchong.com/{author_id}/f/{img_id}.jpg'
# 请求照片数据(图片内容存储在请求结果的content中二进制格式)
r_img = requests.get(img_url)
img = r_img.content
由于本篇抓取的是照片这类二进制文件,因此存储方式可以选择创建一个文件,然后写入请求的二进制文件内容即可。
# 以作者id和图片id组合而成图片名称
name = f'{author_id}-{img_id}.jpg'
with open(name,'wb') as f:
f.write(img)
毕竟图虫网提供高质量的图片,而且都是版权所有的,咱们也就只是用于学习演示不要太过分,爬取10页数据。
代码比较简单不够优雅,没有做模块化处理,大家可以自行优化哈~
import requests
import time
url = 'https://tuchong.com/rest/tags/%E7%BE%8E%E5%A5%B3/posts'
# 翻页
num = 10
total = 0
for page in range(1,num+1):
time.sleep(5)
parames ={
'page': page,
'count': 20,
'order': 'weekly',
'before_timestamp': ''
}
r = requests.get(url, params=parames)
j = r.json()
# 组图列表
postList = j['postList']
# 遍历组图
for post in postList:
# 作者id
author_id = post['author_id']
# 组图照片列表
images = post['images']
# 遍历组图照片列表图片并下载
for image in images:
total = total+1
img_id = image['img_id']
img_url = f'https://photo.tuchong.com/{author_id}/f/{img_id}.jpg'
r_img = requests.get(img_url)
img = r_img.content
name = f'{author_id}-{img_id}.jpg'
# 写入本地
with open(name,'wb') as f:
f.write(img)
print(f'{page}页 共 {total}张 照片已经下载')