Blog Title

Pixiv Crawler

import request from "request";
import fs from "fs";

const pixiv =
  "https://www.pixiv.net/ajax/search/illustrations/初音ミク 30000users入り";

const cookie = "...";

interface Illust {
  illustId: string;
  illustTitle: string;
  userId: string;
  userName: string;
  url: string;
}

function crawler(page: number) {
  request({ url: encodeURI(pixiv + `?p=${page}`) }, (_e, _r, body) => {
    let json = JSON.parse(body);
    let illusts: Illust[] = json.body.illust.data.filter((x: Illust) => x.url);
    illusts.forEach((illust) => {
      let url = illust.url
        .replace(
          /\/c\/250x250_80_a2\/img-master(.*?)_square1200/,
          "/img-original$1"
        );
      const req = request({
        url: url,
        headers: {
          cookie: cookie,
          referer: "https://www.pixiv.net/artworks/" + illust.illustId,
        },
      }).on("response", function (res) {
        if (res.statusCode === 200) {
          console.log(url);
          req.pipe(fs.createWriteStream("pixiv/" + url.split("/")[11]));
        } else {
          console.log(url, res.statusMessage);
        }
      });
    });
  });
}

request({ url: encodeURI(pixiv) }, (_e, _r, body) => {
  let total = JSON.parse(body).body.illust.total;
  console.log(total);
  for (let i = 1; i < total / 60; i++) {
    crawler(i);
  }
});