1307
7 分钟
Pixiv爬虫常用API的文档汇总
开发 Pixiv 爬虫的过程中,我深入研究了 Pixiv 的各种 API 接口。本文将基于实际的爬虫实现,详细介绍 Pixiv 的主要 API 接口、请求格式以及返回数据结构,希望能为其他开发者提供参考。
2025-10-08
统计加载中...

前言#

开发 Pixiv 爬虫的过程中,我深入研究了 Pixiv 的各种 API 接口。本文将基于实际的爬虫实现,详细介绍 Pixiv 的主要 API 接口、请求格式以及返回数据结构,希望能为其他开发者提供参考。

前阵子开发了一个serverless的pixiv爬虫:

Pixiv爬虫/下载/代理,无需服务器即可一键部署!

使用示例项目地址:

https://github.com/evepupil/serverless_pixiv_crawlergithub.com/evepupil/serverless_pixiv_crawler

基础配置#

请求头设置#

所有 API 请求都需要正确的请求头,特别是 Cookie 和 User-Agent:

interface PixivHeaders {
'User-Agent': string;
cookie: string;
Referer: string;
'Accept-Language': string;
}

通用响应格式#

Pixiv API 的响应通常遵循以下格式:

{
"error": false,
"body": {
// 具体数据
}
}

核心 API 接口详解#

1. 获取插画详细信息#

接口地址: https://www.pixiv.net/ajax/illust/{pid}

请求方式: GET

参数说明:

  • pid: 插画ID(必需)

返回数据结构:

interface PixivIllustInfo {
body: {
userId: string; // 作者用户ID
title: string; // 插画标题
userName: string; // 作者用户名
tags: {
tags: Array<{
tag: string; // 标签名
translation?: {
en: string; // 英文翻译
};
}>;
};
likeCount: number; // 点赞数
bookmarkCount: number; // 收藏数
viewCount: number; // 浏览数
illusts?: Array<{ id: string }>; // 相关插画
recommendUsers?: Array<{
userId: string;
illustIds: string[];
}>;
};
error: boolean;
}

使用示例:

const response = await axios.get(
`https://www.pixiv.net/ajax/illust/123456789`,
{ headers: pixivHeaders }
);
const illustInfo: PixivIllustInfo = response.data;

2. 获取插画页面信息(图片链接)#

接口地址: https://www.pixiv.net/ajax/illust/{pid}/pages?lang=zh

请求方式: GET

参数说明:

  • pid: 插画ID(必需)
  • lang: 语言设置,默认为 zh

返回数据结构:

interface PixivIllustPagesResponse {
body: Array<{
urls: {
original: string; // 原图链接
regular: string; // 常规尺寸
small: string; // 小尺寸
thumb_mini: string; // 缩略图
};
}>;
error: boolean;
}

使用示例:

const response = await axios.get(
`https://www.pixiv.net/ajax/illust/123456789/pages?lang=zh`,
{ headers: pixivHeaders }
);
const pagesInfo: PixivIllustPagesResponse = response.data;

3. 获取插画推荐列表#

接口地址: https://www.pixiv.net/ajax/illust/{pid}/recommend/init?limit=30&lang=zh

请求方式: GET

参数说明:

  • pid: 插画ID(必需)
  • limit: 返回数量限制,默认30
  • lang: 语言设置,默认为 zh

返回数据结构:

interface PixivRecommendResponse {
body: {
illusts: Array<{ id: string }>; // 推荐插画ID列表
};
error: boolean;
}

使用示例:

const response = await axios.get(
`https://www.pixiv.net/ajax/illust/123456789/recommend/init?limit=30&lang=zh`,
{ headers: pixivHeaders }
);
const recommendInfo: PixivRecommendResponse = response.data;

4. 获取用户推荐#

接口地址: https://www.pixiv.net/ajax/user/{userId}/recommends?userNum=30&workNum=5&isR18=false&lang=zh

请求方式: GET

参数说明:

  • userId: 用户ID(必需)
  • userNum: 推荐用户数量,默认30
  • workNum: 每个用户的作品数量,默认5
  • isR18: 是否包含R18内容,默认false
  • lang: 语言设置,默认为 zh

返回数据结构:

interface PixivUserRecommendResponse {
body: {
recommendUsers: Array<{
userId: string; // 推荐用户ID
illustIds: string[]; // 该用户的插画ID列表
}>;
};
error: boolean;
}

使用示例:

const response = await axios.get(
`https://www.pixiv.net/ajax/user/123456/recommends?userNum=30&workNum=5&isR18=false&lang=zh`,
{ headers: pixivHeaders }
);
const userRecommendInfo: PixivUserRecommendResponse = response.data;

排行榜接口#

获取排行榜数据#

接口地址: https://www.pixiv.net/ranking.php?mode={mode}&content=illust

请求方式: GET

参数说明:

  • mode: 排行榜类型
  • daily: 日榜
  • weekly: 周榜
  • monthly: 月榜
  • content: 内容类型,固定为 illust

注意: 这个接口返回的是 HTML 页面,需要通过正则表达式解析获取插画ID。

解析示例:

// 提取插画ID的正则表达式
const pidRegex = /<a\s+[^>]*href=["']\/artworks\/(\d+)["'][^>]*>/g;
const pids: string[] = [];
let match: RegExpExecArray | null;
while ((match = pidRegex.exec(html)) !== null) {
pids.push(match[1]);
}

首页推荐接口#

获取首页推荐内容#

接口地址: https://www.pixiv.net/

请求方式: GET

说明: 首页推荐也是通过解析 HTML 页面获取,需要查找包含 data-gtm-work-id 属性的元素。

解析示例:

// 提取推荐插画ID的正则表达式
const pidRegex = /data-gtm-work-id=["'](\d+)["']/gi;
const pids: string[] = [];
let match: RegExpExecArray | null;
while ((match = pidRegex.exec(html)) !== null) {
pids.push(match[1]);
}

错误处理#

常见错误类型#

  1. 404 错误:插画不存在或已被删除
  2. 403 错误:权限不足或需要登录
  3. 429 错误:请求过于频繁,需要限流

错误处理示例#

try {
const response = await axios.get(apiUrl, { headers });
return response.data;
} catch (error) {
if (error.response?.status === 404) {
console.log('插画不存在');
return { error: true, status: 404, message: 'Image not found' };
}
throw error;
}

最佳实践#

1. 请求频率控制#

// 添加随机延迟避免被封
const delay = Math.random() * 2000 + 1000; // 1-3秒随机延迟
await new Promise(resolve => setTimeout(resolve, delay));

2. 请求头轮换#

// 使用多个不同的请求头轮换使用
const headersList: PixivHeaders[] = [
{ /* 请求头1 */ },
{ /* 请求头2 */ },
{ /* 请求头3 */ }
];
let headerIndex = 0;
const currentHeaders = headersList[headerIndex % headersList.length];
headerIndex++;

3. 重试机制#

async function requestWithRetry(url: string, maxRetries: number = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await axios.get(url, { headers });
return response.data;
} catch (error) {
if (i === maxRetries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
}
}
}

总结#

本文基于实际的爬虫项目,详细介绍了 Pixiv 的主要 API 接口。这些接口涵盖了:

  1. 插画信息获取:基础信息、页面信息、推荐列表
  2. 用户相关:用户推荐、作者信息
  3. 排行榜数据:日榜、周榜、月榜
  4. 首页推荐:个性化推荐内容

在使用这些接口时,请注意:

  • 遵守网站的使用条款
  • 控制请求频率,避免对服务器造成压力
  • 正确处理各种错误情况
  • 使用合适的请求头和认证信息

希望这份文档能够帮助到需要了解 Pixiv API 的开发者们!


注:本文仅供学习交流使用,请遵守相关法律法规和网站使用条款。

v2-3052331952cbe0c11d5404c6d4b7ff26_r.jpg

这篇文章是否对你有帮助?

发现错误或想要改进这篇文章?

在 GitHub 上编辑此页
Pixiv爬虫常用API的文档汇总
https://blog.chaosyn.com/posts/pixiv爬虫常用api的文档汇总/
作者
叶桐
发布于
2025-10-08
许可协议
CC BY-NC-SA 4.0