前言
开发 Pixiv 爬虫的过程中,我深入研究了 Pixiv 的各种 API 接口。本文将基于实际的爬虫实现,详细介绍 Pixiv 的主要 API 接口、请求格式以及返回数据结构,希望能为其他开发者提供参考。
前阵子开发了一个serverless的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]);}错误处理
常见错误类型
- 404 错误:插画不存在或已被删除
- 403 错误:权限不足或需要登录
- 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 接口。这些接口涵盖了:
- 插画信息获取:基础信息、页面信息、推荐列表
- 用户相关:用户推荐、作者信息
- 排行榜数据:日榜、周榜、月榜
- 首页推荐:个性化推荐内容
在使用这些接口时,请注意:
- 遵守网站的使用条款
- 控制请求频率,避免对服务器造成压力
- 正确处理各种错误情况
- 使用合适的请求头和认证信息
希望这份文档能够帮助到需要了解 Pixiv API 的开发者们!
注:本文仅供学习交流使用,请遵守相关法律法规和网站使用条款。

发现错误或想要改进这篇文章?
在 GitHub 上编辑此页