xx-Pixiv Spider
import requests
from lxml import etree
import json
import os
# 缺陷 1:下载的是图片合集,会下载其他角色的图片
# 缺陷 2:不能存 gif,因为P站的 gif 图片用的是我还不懂的方式
#================================================
#设置一个 Session 保持会话
se = requests.session()# E:\\0-Picture\\3-明日方舟\\鞭刃\\
# E:\\0-Picture\\4-原神\\诺艾尔
# ウィスラッシュ 鞭刃
# ノエル Genshin 诺艾尔,原神
# 1000class Pixiv():def __init__(self):# 登录界面的 URLself.base_url = 'https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index'# 登录时 post 的对象self.login_url = 'https://accounts.pixiv.net/api/login?lang=zh'# P站首页self.main_url = 'http://www.pixiv.net'# 请求头self.headers = {'Referer': 'https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0","Accept": "*/*","Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3","Accept-Encoding": "","Connection": "keep-alive",}self.pixiv_id = "xxxxxxxxxxxxxxxxxxxxxxx"self.password = "xxxxxxxxxxxxxxxxxxxxxx"def input_basic(self):raw = []# 输入 tagtag = input("请输入您想搜索的tag,若输入多个tag,请使用空格分割开:\n")tag = tag.replace(" ", "%20")raw.append(tag)# 输入 收藏数collect = input("请输入一个数,代码会筛选出收藏超过这个数值的图片:\n")collect = str(collect)raw.append(collect)if int(collect) < 0 or int(collect) > 10000:os.system('cls')print("Out of Range,ERROR")self.input_basic()# 创建目录path = input("请输入地址,若地址不存在,代码会在地址处创建一个文件夹\n")if (os.path.exists(path)) == False:os.mkdir(path)raw.append(path)return raw# if (os.path.exists("D:\\099_Picture\\明日方舟\\"+tag)) == False:# os.mkdir("D:\\099_Picture\\明日方舟\\"+tag)#================================================# 这部分是用来登陆的def login(self):# 请求登录页面post_key_html = se.get(self.base_url, headers=self.headers).content.decode("utf-8")# 根据登录页面取得 post_key 里的 idpost_key_parse = etree.HTML(post_key_html)post_key_value = post_key_parse.xpath("//input[@name='post_key']/@value")[0]print(post_key_value)# 登录用的 需要 post 的链接(先在浏览器登录一次,中间调转的时候能看到)login_url = 'https://accounts.pixiv.net/api/login?lang=zh'# post 所用的 datadata = {'pixiv_id': self.pixiv_id,'password': self.password,'return_to': 'http://www.pixiv.net/','post_key': post_key_value}# 使用 Session post后保持登录se.post(login_url, data=data, headers=self.headers)#=============================================================# 从网页数据的json字典文件里,提取图片网址列表和相关数据def get_pic_url_list(self, noelle_html_dic):noelle_ids = []# 读取字典里的 datanoelle_data_list = noelle_html_dic['body']['illustManga']['data']for noelle_data in noelle_data_list:# 判断是否为gif图片# 如果是gif,则跳过if noelle_data['illustType'] ==2:continueelse:noelle_id = []# 获取作品链接ID,放在 【noelle_id[0]】pic_id = noelle_data['id']noelle_id.append("https://www.pixiv.net/artworks/" + pic_id)# 获取作品图片链接,放在 【noelle_id[1]】pic_url = noelle_data['url']pic_url1 = pic_url.split("img/")[-1]pic_url2 = pic_url1.split("_p0")[0]pic_url = "https://i.pximg.net/img-original/img/"+pic_url2noelle_id.append(pic_url)# 获取作品图片数量,放在 【noelle_id[2]】pic_pageCount = noelle_data['pageCount']noelle_id.append(pic_pageCount)# 作品id,放在 【noelle_id[3]】noelle_id.append(pic_id)# 加入整体noelle_ids.append(noelle_id)print("已获得列表")return noelle_ids#=============================================================# 添加cookie后获取 t_p2 链接里的网页,结合cookie,获取网页里的字典def get_page(self, t_p2, cookie):p_headers = self.headersp_headers["cookie"] = cookienoelle_html = se.get(t_p2, headers=p_headers).content.decode("utf-8")print(noelle_html)noelle_html_dic = json.loads(noelle_html)noelle_ids = self.get_pic_url_list(noelle_html_dic)return noelle_ids#=============================================================# 网页url,循环1~50页def get_page_url(self, tag, collect):# 在获取的网页,输出方便检测t_p = "https://www.pixiv.net/ajax/search/artworks/" + tag + "?word=" + tag + "&order=date&mode=all&blt=" + collect + "&p=" + "1" + "&s_mode=s_tag&type=all&lang=zh"print(t_p)# cookie,没有cookie,网页获取就会出错cookie = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"# 这个列表是储存了全部所需数据page_url_list = []# 循环,读取50页for i in range(1, 50):x = str(i)# t_p1 = "https://www.pixiv.net/tags/xxxxxxxxxxxxx/artworks?order=date&blt=100&p="+x+"&s_mode=s_tag"t_p2 = "https://www.pixiv.net/ajax/search/artworks/"+tag+"?word="+tag+"&order=date&mode=all&blt="+collect+"&p="+x+"&s_mode=s_tag&type=all&lang=zh"page_url = self.get_page(t_p2, cookie)# 如果为空,说明没有更多网页了结束了if page_url == []:print("第"+x+"页完成")break# 否则继续获取下一页else:print("第"+x+"页完成")page_url_list= page_url_list + page_urlreturn page_url_list#=============================================================# 图片下载函数def download(self, path, page_url_list):# 下载出错的图片列表Wrong = []# headers 需要做一定修改,下方有解释d_headers = self.headers# 从列表里循环读取for page_url in page_url_list:# 没有图片所在网页的网址做 Referer 的话,图片会403d_headers['Referer'] = page_url[0]# page_url[2] :这网页上有多少张图片,和P站图片命名方式油关 xxxxx_p0.jpgfor i in range(page_url[2]):# 组合出没有图片格式的图片网址url = page_url[1]+"_p" + str(i)# print(url)try:# 组合出jpg格式的图片网址,图片有两种格式:jpg、png,这里穷举了两种格式,跳过了读取图片网页的过程original = url+".jpg"# 组合出图片名pic_name = page_url[3]+"_p"+str(i)# 获取 jpg 格式的图片r = se.get(original, headers=self.headers, stream=True, timeout=5)# 如果状态码为 200,说明 jpg 格式下载成功if r.status_code == 200:open(path + "\\" + pic_name + ".jpg", 'wb').write(r.content) # 将内容写入图片print(pic_name+" done")# 如果状态码不是200,说明网页链接出错了,换成 png 格式试试else:original = url + ".png"r = se.get(original, headers=self.headers, stream=True, timeout=5)# 如果状态码是 200,那说明图片是 png 格式,存他if r.status_code == 200:open(path + "\\" + pic_name + ".jpg", 'wb').write(r.content) # 将内容写入图片print(pic_name+" done")# 如果既不是 jpg,又不是 pngelse:Wrong.append(url)print("图片:" + url + " 下载出错")del rexcept:print("图片:" + url + " 下载出错")Wrong.append(url[0])return Wrong# =============================================================# 汇总def work(self):# 1、登录X = self.input_basic()tag = X[0]collect = X[1]path = X[2]self.login()# 2、获取文件列表p = self.get_page_url(tag, collect)print(p)print("一共"+str(len(p))+"个网页")a = input("是否开始下载?(Y/N)\n")if a == "Y" or a == "y" :# 下载self.download(path,p)print("over")else:print("over")# 运行
pixiv=Pixiv()
a = pixiv.work()
print(a)
input("输入任意按键结束")
xx-Pixiv Spider相关推荐
- 渗透技巧之403绕过_指纹识别
403绕过清单 FFUF 路径模糊测试 ffuf -w 403_url_payloads.txt -u http://example.com/auth_pathFUZZ -fc 403,401,400 ...
- Web Spider NEX XX国际货币经纪 - PDF下载 提取关键词(二)
Web Spider NEX XX国际货币经纪 - PDF下载 & 解析 首先声明: 此次案例只为学习交流使用,切勿用于其他非法用途 文章目录 Web Spider NEX XX国际货币经纪 ...
- Spider数据集arxiv1809.08887论文研读
1. Introduction 过去一些优秀的模型例如seq2seq架构已经能够实现80%以上的匹配精确度在SQL查询上,但是这些工作实际上是在做语义匹配而非语义解析.现有的语义解析数据集存在两个问题 ...
- python爬虫:爬取pixiv图片
自从接触python以后就想着爬pixiv,之前因为梯子有点问题就一直搁置,最近换了个梯子就迫不及待试了下. 爬虫无非request获取html页面然后用正则表达式或者beautifulsoup之类现 ...
- 问财同花顺spider(爬虫)2接上篇没有实现的页面滚动问题
问财同花顺spider(爬虫)2接上篇没有实现的页面滚动问题 上一篇的文章 看过我之前文章的可以知道无法实现鼠标滚动问题 这里滚动页面运用到查找元素拖动到元素位置,由于更新数据按照30个更新,使用设置 ...
- Python:Spider
Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及分析某个网页( ...
- logcat --pid xx 查看某个进程的信息
logcat --pid xx 这里的pid 自己理解为process id 就是进程的id 例如我们查看进程500的信息 就可以使用logcat --pid 500
- error: Can not locate config makefile for product “xx“.
这个问题不一定属于是你的问题, 说下我发生问题的原因,lunch xx 的时候出现的问题, 就是好奇了为啥呢,xx为项目的编号这个是同事发给我的,最后又问题其他的同事, xx 选错了,我选的那一个配置 ...
- NameError: name xx is not defined
这个问题有很多类型的,这里说下我遇到的这个类型 首先我是获取input 值之后提示NameError: name xx is not defined 最后发现是python 2x 与 python 3 ...
- java.lang.IllegalArgumentException: No view found for id 0x7f07005f (xx) for for fragment xxFragment
问题的原因的是自己修改id 的时候弄错了修改下id 就好了 我的是用activity 加载fragment 使用的地方如下 ,确定下面的id 是否在布局中 transaction.add(R.id.c ...
最新文章
- 【Dual-Path-RNN-Pytorch源码分析】Dual_RNN_Block
- WiFi密码分享有妙招 不必口头相传
- Linux命令 iperf - 网络性能测试工具
- pytorch 之 torch.eye()函数
- 机器学习 | EM 算法原理
- 基于Matlab的跨孔电磁波\跨孔雷达的直射线追踪(一)
- sql删除快还是update快_下班回家,是骑自行车减肥快还是走路减肥快?
- .vue文件 转换成html,在vue中把含有html标签转为html渲染页面的实例
- Android系统信息获取 之十:移动网络相关信息获取
- ACM PKU 1251 Jungle Roads http://poj.org/problem?id=1251
- 如何理解二次型?(转)
- onfigure: error: cannot find install-sh, install.sh, or shtool in
- 文件服务器 共享 端口,共享文件服务端口设置
- 布谷鸟算法的程序(个人注释)
- ubuntu 安装永中office 2009
- 分布式系统的时间问题
- 毕业之后才知道的——知网查重原理以及降重举例
- 汉字编码 拼音输入法
- 求负片灰度扩展幂律变换
- MP4视频文件过大如何压缩?压缩视频的方法是什么?