Python爬虫 | 批量爬取某图网站高质量小姐姐照片

大邓和他的Python

共 3978字,需浏览 8分钟

 · 2021-01-23

腾讯课堂 | Python网络爬虫与文本分析(现在只需198元)~~




大家好,今天我们一起来看看那么多高质量的漂亮小姐姐吧。

简直了

自从上次爬取了虎牙1000多位小姐姐照片《Python爬虫 | 爬取虎牙直播星秀区1000多位漂亮小姐姐照片并做颜值评分》之后,有粉丝反馈说 虎牙这些小姐姐照片都太俗气了,建议去爬爬 图虫网美女标签(https://tuchong.com/tags/%E7%BE%8E%E5%A5%B3)上的高质量小姐姐照片。

我打开网页找到某个封面图点进去查看组图,直接点击下载按钮提示“该照片有版权限制不可下载”,所以咱们还是别去下载了吧。

有版权不可下载

鉴于以上情况,这里咱们重点强调声明:本文仅限于做技术交流学习,请勿用作任何非法商用!

图虫创意是北京字节跳动科技有限公司所创立的正版照片及视频素材平台 ,致力于为用户提供正版素材内容及数字资产管理解决方案。

0.先看一波美照吧

很正经的图

接下来,我们按照上次在《Python爬虫 | 爬虫基础入门看这一篇就够了》介绍的爬虫流程来展开介绍这次爬虫实战哈。

1.网页分析

打开目标网页(https://tuchong.com/tags/%E7%BE%8E%E5%A5%B3),发现下拉会加载更多但是网页地址栏的url没有变化。因此,我们断定这是一个动态网页,于是有了以下步骤:

  1. 需要按“F12”进入到浏览器的开发者模式;
  2. 点击“Network”—>XHR或JS或者你全部查找看;
  3. 进行翻页(可能是点击下一页或者下滑加载更多或者直接F5刷新页面);
  4. 观察第2步中name模块的内容变化,寻找。

很好,我们找到了照片组图信息所在,如下图所示,在请求的结果中的postList里是单页全部照片组信息列表,列表的每个元素中的imges里是该组照片信息列表。通过这些字段大致能理解照片img_id归属于某个作者user_idauthor_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'''
    }
真实URL地址及参数

到这里没完,单纯知道了请求这些组图信息列表的地址,但是每个组图里照片的地址暂时还无法得知。于是我们点开某个组图进行进一步查看,在组图的详情页里,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'

在浏览器输入这个照片地址,我们发现果然就是我们需要的:

目标照片

2.请求数据

这一步就比较简单了,直接引入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()

3.解析数据

我们查看请求结果中的json数据结构,可以很快找到目标照片的url地址参数:

json数据结构

我们以获取单个照片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

4.存储数据

由于本篇抓取的是照片这类二进制文件,因此存储方式可以选择创建一个文件,然后写入请求的二进制文件内容即可。

# 以作者id和图片id组合而成图片名称
name = f'{author_id}-{img_id}.jpg'
with open(name,'wb'as f:
    f.write(img)

5.完整代码

毕竟图虫网提供高质量的图片,而且都是版权所有的,咱们也就只是用于学习演示不要太过分,爬取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}张 照片已经下载')
批量下载

近期文章

Python网络爬虫与文本数据分析
bsite库 | 采集B站视频信息、评论数据
爬虫实战 | 采集&可视化知乎问题的回答
pdf2docx库 | 转文件格式,支持抽取文件中的表格数据
rpy2库 | 在jupyter中调用R语言代码
tidytext | 耳目一新的R-style文本分析库
reticulate包 | 在Rmarkdown中调用Python代码
plydata库 | 数据操作管道操作符>>
plotnine: Python版的ggplot2作图库
七夕礼物 | 全网最火的钉子绕线图制作教程
读完本文你就了解什么是文本分析
文本分析在经管领域中的应用概述  
综述:文本分析在市场营销研究中的应用
plotnine: Python版的ggplot2作图库
小案例: Pandas的apply方法  
stylecloud:简洁易用的词云库 
用Python绘制近20年地方财政收入变迁史视频  
Wow~70G上市公司定期报告数据集
漂亮~pandas可以无缝衔接Bokeh  
YelpDaset: 酒店管理类数据集10+G  

    分享”和“在看”是更好的支持!



浏览 64
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报