不知羞耻!!我居然爬取了图X网站的图片

写在前面

目标网站

  1. 目标网站首页:https://tuchong.com/
  2. 热门摄影师https://tuchong.com/contacts/
  3. 各类标签https://tuchong.com/v3/explore

个人声明

本网站提供的图片均为版权图片,因此本文爬取仅为提供初学者学习教程,不准用于商业用途!!!

思路分析

整体思路是:

  1. 爬取所有热门摄影师的个人数据;
  2. 根据摄影师的编号去获取摄影师的所有作品并下载;
  3. 获取标签(部分);
  4. 获取指定标签下的图片并下载(部分)

源码展示

需要安装并导入的库

os			   与文件操作相关的库
requests       与请求网络数据相关的库

完整代码

import os
import requests

# 摄影师作品网站
url = "https://tuchong.com/rest/users/rank"
# 设置访问headers
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}

# 获取热门摄影师基本数据
def getAuthor():
    # 准备页码数
    pages = [1,2,3]
    # 定义数据存储所有数据
    data = []
    # 循环每个页面
    for page in pages:
        # 访问页面需要传入的参数,page设置为每一页
        params = {
            "page": page,
            "count": 20,
            "order": "daily-rank",
            "_signature": "_02B4Z6wo00101Z8YmcAAAIDCL - l1CeDGVVWfHJ1AAAdKF9bxwH8VsNrDbTu5UyndXDV2Dy8mquKyKJ.8t57VY2U0sRjCxzuZZKDSpfSCQ08e4g - dB1mV - Nmc1MSLcMZTBAs1CJVENxYJwyA - d1"
        }
        # 访问并返回结果
        resp = requests.get(url,headers=headers,params= params)
        # 获取结果的json数据
        js = resp.json()
        # 解析json数据
        infos = js['data']['user_list']
        # 定义集合存储单条记录
        li = []
        # 遍历每一条记录并存储到集合中
        for info in infos:
            li.append("描述:"+info['description'])
            li.append("粉丝数:"+str(info['followers']))
            li.append("位置:"+info['location'])
            li.append("昵称:"+info['name'])
            li.append("编号:"+info['site_id'])
            # 将集合存到data中
            data.append(li)
            # 初始化集合
            li=[]
    # 最后返回结果
    return data

#根据摄影师的编号获取其图片链接并下载
# 参数:摄影师编号、图片将要下载的地址(如:r'D:/')
def downlandImg(num,mUrl):
    # 定义需要获取的链接
    url = "https://tuchong.com/rest/2/sites/"+str(num)+"/posts";
    # 访问链接
    resp = requests.get(url, headers=headers)
    # 得到结果的json数据
    js = resp.json()
    # 获取该摄影师的摄影作品个数
    count = int(js['counts'])
    print(count)
    # 定义集合存储数据
    all_data = []
    # 遍历每个作品
    item = js['post_list']
    for it in item:
        dk = it['images']
        for d in dk:
            imgUrl = d['source']['f']
            all_data.append(imgUrl)
            print(imgUrl)
    print(all_data)

    # 下载图片
    mkurl = mUrl+str(num)
    # 新建文件夹
    os.makedirs(mkurl, exist_ok=True)
    num = 1
    for lastUrl in all_data:
        re = requests.get(lastUrl)
        # 图片命名格式为1,2,3.。。。
        with open(mkurl+"/"+str(num)+".jpg",'wb') as f:
            f.write(re.content)
            f.close()
        num = num+1
    print("over..")
    return all_data

# 获取标签(由于标签巨多,因此仅提供部分标签)
def getTag():
    url = "https://tuchong.com/rest/tag-categories/subject"
    params = {
        "page": 1,
        "count": 20,
        "_signature": "_02B4Z6wo00f01DO - QrAAAIDDg0 - ue2aYXmwzukYAAGyFAJl3wjTEwob2 - moL4UzmzWyB3C6EGfchdImzF.gzWouNg1XUqkuEFPhgz69GwCICrtJKKA3kwOcpsn0BxCmZazixKOKz.SJL0gLK5b"
    }
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
    }
    resp = requests.get(url, headers=headers, params=params)
    js = resp.json()
    data = js['data']['tag_list']
    li = []
    for da in data:
        li.append(da['tag_name'])
    return li

# 根据自定义下载地址和标签获取资源图片并下载(因为每个标签内容巨多,因此仅提供标签下的部分图片)
def downlandByTag(dUrl,tag):
    url = "https://tuchong.com/rest/tags/"+tag+"/posts"
    params  = {
        "page": 1,
        "count": 20,
        "order": "weekly",
        "before_timestamp":''
    }
    resp = requests.get(url, headers=headers, params=params)
    js = resp.json()
    tt = js['postList']
    li = []
    for t in tt:
        tagUrl = t['cover_image_src']
        li.append(tagUrl)
    print(li)
    # 下载图片
    mkurl = dUrl+ tag
    os.makedirs(mkurl, exist_ok=True)
    num = 1
    for l in li:
        re = requests.get(l)
        with open(mkurl + "/" + str(num) + ".jpg", 'wb') as f:
            f.write(re.content)
            f.close()
        num = num + 1
    print("over..")
    return li

# 测试代码
if __name__ == '__main__':
    # 获取所有热门摄影师信息并打印
    data = getAuthor()
    for da in data:
        print(da)
    # 根据摄影师标签和自定义图片下载地址下载该摄影师的所有作品并返回作品链接
    all_data = downlandImg(15711995,r'D:/uiui/')
    for all in all_data:
        print(all)
    # 获取标签(仅部分)
    # 虽然仅提供部分图片,但通过修改代码可获得所有图片,这里不详细展开,毕竟是以学习为目的
    li = getTag()
    # 获取标签的图片(仅部分)
    li = downlandByTag(r'D:/uiui/',"树")

运行结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

这个案例其实不算难,基本都是比较普遍的爬虫技巧,只要多加练习,就可以做更多的拓展。但该网站声明图片都是有版权所属,因此,这个爬取结果这能用于学习所用,不可用于商业途径!!!

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执章学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值