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