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

本文最后更新于:2020-09-12 22:50

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

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

项目的文件目录

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

爬虫代码

pixiv.py 的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# -*- 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 的获取方式 的步骤即可