Python 爬取 返回图片的API

API 作者文档 随机图片 (lolicon.app)

1. Json数据

  • api
url = 'https://api.lolicon.app/setu/?r18=1'

?r18=1 为可选参数

别的参数请查看api作者文档

  • api访问后返回Json格式数据
{
    "code": 0,
    "msg": "",
    "count": 1,
    "data": [
        {
            "pid": 1234556,
            "p": 0,
            "uid": 123456,
            "title": "texttext",
            "author": "texttexttext",
            "r18": true,
            "width": 1200,
            "height": 1600,
            "tags": [
                "R-text",
                "杜野text世",
                "RinzetextMorino",
                "シャtextニマス",
                "ShintextyMas",
                "ボデtextィコン",
                "bodtextycon",
                "長手text袋",
                "长手text套",
                "アイドtextルマスターシャイニーカラーズ",
                "偶像大text师 闪耀色彩",
                "パンツ下ろし",
                "text"
            ],
            "url": "https://text.com"
        }
    ]
}

我们需要提取data中的url

2. 获取图片

def getImg(url, proxies):
    resp = requests.get(url, proxies=proxies).json()['data'][0]['url']   # 将获取到的json数据进行解析获取url
    jpgdata = requests.get(resp)     # 获取图片源码
    filename = str(resp).split("/")[-1]   # 获取url中的文件名用于文件命名和规定文件格式
    return jpgdata, filename

创建getImg函数 用request库中的get方法获取api并转换成json格式 提取url

将获取到的url 再次get到图片源码

filename用来给后面下载的文件命名

3. 下载图片

def download_img(jpgdata, filename):
    if not os.path.exists("img"):   # 判断根目录是否有img文件夹 没有则创建
        os.mkdir("img")
        print("文件夹创建成功")
    file = f'img\\{filename}'
    with open(file, 'wb') as file:    # 在img文件夹中下载图片
        file.write(jpgdata.content)    # 写入获取的jpgdata的二进制
        print(f"{filename}图片下载成功")

if判断当前目录是否有img文件夹 没有则创建

用wb模式写入文件 文件写入jpgdata.content 写入jpgdata 的二进制数据

4. 线程池

  • 单线程 运行速度太慢
from concurrent.futures import ThreadPoolExecutor

def thread_pool(url, proxies):
    jpgdata, filename = getImg(url, proxies)
    download_img(jpgdata, filename)

导入线程池的库

创建个函数调用上面两个函数 用于待会线程池

5. 要运行了qwq

if __name__ == '__main__':
    with ThreadPoolExecutor(10) as t:
        for i in range(20):
            t.submit(thread_pool, url, proxies)

创建线程池 开10个线程

  • 开太多会被封ip

range()里写你要爬多少张图片

.submit提交任务

如果请求太多被封ip

那么该怎么办呢 .. ...当然是没有办法啦

proxies = {
    "socks5": "socks5://127.0.0.1:7890"
}

设置代理就好了

我的代理设置的是本地的clash 端口7890

clash需要开启allow lan

真的是非常的爽啊

非常的好用

速度是非常的快

附件下载:
api_img.py