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

Posted Jack·Kwok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不知羞耻!!我居然爬取了图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/',"树")

运行结果

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

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

总结

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

以上是关于不知羞耻!!我居然爬取了图X网站的图片的主要内容,如果未能解决你的问题,请参考以下文章

深夜,我用python爬取了整个斗图网站,不服来斗

我用Python爬取了五千张美女图壁纸,每天一张忘记初恋!

别人用钱,而我用python爬虫爬取了一年的4K高清壁纸

scrapy主动退出爬虫的代码片段(python3)

朋友很喜欢打篮球,我用Python爬取了1000张他喜欢的NBA球星图片送给他内附源码

朋友很喜欢打篮球,我用Python爬取了1000张他喜欢的NBA球星图片送给他内附源码