利用 Python 爬虫爬取 Pixiv 上的小姐姐

利用 Python 爬虫爬取 Pixiv 上的小姐姐

发布于
更新于
阅读时间
约 2 分钟
利用 Python 爬虫爬取 Pixiv 上的小姐姐

Pixiv 上的小姐姐那么多,手动保存到手断了也保存不完,为什么不利用 Python 爬虫自动帮我们下载呢?

使用本教程前先确定你的本地网络是否能访问 Pixiv

项目的文件目录

.                       # 项目根目录
|-- Folder1             # 文件夹名字可以自定义 一般为画师的名字
    |-- 6957790.txt     # 文件名为画师的主页 ID
|-- Folder2             # 文件夹名字可以自定义 一般为画师的名字
    |-- 1480420.txt     # 文件名为画师的主页 ID
|-- Folder3             # 文件夹名字可以自定义 一般为画师的名字
    |-- 28440744.txt    # 文件名为画师的主页 ID
|-- Pixiv.py            # Python 爬虫脚本

爬虫代码

pixiv.py 的内容如下

# -*- coding:utf-8*-


'''
请先安装好相应的 Python 模块
pip install requests bs4 lxml
'''


import requests
from bs4 import BeautifulSoup
import lxml
import re
from glob import glob
import os


headers = {
    'cookie': '', # 这里的Cookie改为你的Cookie
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
}


def get_pic_list(num):
    url = 'https://www.pixiv.net/ajax/user/%s/profile/all?lang=zh' % num
    r = requests.get(url, headers = headers)
    pic_list = re.findall('"(\d+?)":null', r.text)
    return pic_list


def get_file_list():
    temp = glob('*')
    for item in temp:
        if '.txt' in item:
            temp.remove(item)
    file_list = [name.split('.')[0] for name in temp]
    return file_list


def download(num):
    pic_list = get_pic_list(num)
    file_list = get_file_list()
    for pic in pic_list:
        if pic not in file_list:
            url = 'https://www.pixiv.net/artworks/%s' % pic
            r = requests.get(url, headers = headers)
            result = re.search('"original":"(.+?)"', r.text)
            if result:
                download_url = result.group(1)
                suffix = download_url.rsplit('/', 1)[-1].rsplit('.', 1)[-1]
                h = {
                    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
                    'accept-encoding': 'gzip, deflate, br',
                    'accept-language': 'zh-CN,zh;q=0.9',
                    'cache-control': 'max-age=0',
                    'dnt': '1',
                    'if-modified-since': 'Mon, 09 Sep 2019 23:00:01 GMT',
                    'referer': 'https://www.pixiv.net/artworks/76712185',
                    'sec-fetch-dest': 'document',
                    'sec-fetch-mode': 'navigate',
                    'sec-fetch-site': 'none',
                    'sec-fetch-user': '?1',
                    'upgrade-insecure-requests': '1',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
                }
                s = requests.get(download_url, headers = h)
                with open(pic + '.' + suffix, 'wb') as f:
                    #print(s.text)
                    f.write(s.content)
                    print(pic)


def main():
    filenames = os.listdir()
    filenames.remove('pixiv.py')
    cwd = os.getcwd()
    for filename in filenames:
        print('切换到%s' % filename)
        os.chdir(cwd + '\\' + filename)
        num = glob("*.txt")[0]
        num = re.sub('.txt', '', num)
        download(num)


if __name__ == '__main__':
    main()

打开 Chrome 浏览器,按 F12,打开 DevTools,切换到 Network 选项卡

在地址栏中输入 Pixiv 的网址打开并登录,待加载完成后,如下图在 DevTools 中找到 www.pixiv.net并点击

切换到 Headers 选项卡

Request Headers 栏中找到 cookie 项,把 : 后的内容填入上面脚本的空引号中即可

设定要爬取的画师

上面项目结构的 Folder1Folder2Folder3 的名字都可以自行修改,可以继续平行添加其他目录,也可以删除目录

假如我们想爬取 火加減よしお 的所有作品,那么在 Pixiv 里搜索 火加減よしお,进入 ta 的主页,网址是 https://www.pixiv.net/users/29925927,那么他的 ID 就是 29925927

我们将 Folder1 重命名为:火加減よしお,在删除该目录下的所有以 txt 为后缀名的文件,新建一个文本文件,重命名为 29925927.txt即可

如果还想添加其他画师,重复上面的步骤即可

爬取图片

当设定完要爬取的画师后,运行 pixiv.py 即可自动下载对应画师的作品到相应的文件夹

获取画师的新图片

本脚本已经带有获取画师新图片的功能,重复运行脚本,即可查看本地的图片库,把没有的照片自动爬取下来

注意:Cookie 只能维持一段时间,过段时间运行代码前,重复 Cookie 的获取方式 的步骤即可

评论