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相关推荐

  1. 渗透技巧之403绕过_指纹识别

    403绕过清单 FFUF 路径模糊测试 ffuf -w 403_url_payloads.txt -u http://example.com/auth_pathFUZZ -fc 403,401,400 ...

  2. Web Spider NEX XX国际货币经纪 - PDF下载 提取关键词(二)

    Web Spider NEX XX国际货币经纪 - PDF下载 & 解析 首先声明: 此次案例只为学习交流使用,切勿用于其他非法用途 文章目录 Web Spider NEX XX国际货币经纪 ...

  3. Spider数据集arxiv1809.08887论文研读

    1. Introduction 过去一些优秀的模型例如seq2seq架构已经能够实现80%以上的匹配精确度在SQL查询上,但是这些工作实际上是在做语义匹配而非语义解析.现有的语义解析数据集存在两个问题 ...

  4. python爬虫:爬取pixiv图片

    自从接触python以后就想着爬pixiv,之前因为梯子有点问题就一直搁置,最近换了个梯子就迫不及待试了下. 爬虫无非request获取html页面然后用正则表达式或者beautifulsoup之类现 ...

  5. 问财同花顺spider(爬虫)2接上篇没有实现的页面滚动问题

    问财同花顺spider(爬虫)2接上篇没有实现的页面滚动问题 上一篇的文章 看过我之前文章的可以知道无法实现鼠标滚动问题 这里滚动页面运用到查找元素拖动到元素位置,由于更新数据按照30个更新,使用设置 ...

  6. Python:Spider

    Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及分析某个网页( ...

  7. logcat --pid xx 查看某个进程的信息

    logcat --pid xx 这里的pid 自己理解为process id 就是进程的id 例如我们查看进程500的信息 就可以使用logcat --pid 500

  8. error: Can not locate config makefile for product “xx“.

    这个问题不一定属于是你的问题, 说下我发生问题的原因,lunch xx 的时候出现的问题, 就是好奇了为啥呢,xx为项目的编号这个是同事发给我的,最后又问题其他的同事, xx 选错了,我选的那一个配置 ...

  9. NameError: name xx is not defined

    这个问题有很多类型的,这里说下我遇到的这个类型 首先我是获取input 值之后提示NameError: name xx is not defined 最后发现是python 2x 与 python 3 ...

  10. java.lang.IllegalArgumentException: No view found for id 0x7f07005f (xx) for for fragment xxFragment

    问题的原因的是自己修改id 的时候弄错了修改下id 就好了 我的是用activity 加载fragment 使用的地方如下 ,确定下面的id 是否在布局中 transaction.add(R.id.c ...

最新文章

  1. 【Dual-Path-RNN-Pytorch源码分析】Dual_RNN_Block
  2. WiFi密码分享有妙招 不必口头相传
  3. Linux命令 iperf - 网络性能测试工具
  4. pytorch 之 torch.eye()函数
  5. 机器学习 | EM 算法原理
  6. 基于Matlab的跨孔电磁波\跨孔雷达的直射线追踪(一)
  7. sql删除快还是update快_下班回家,是骑自行车减肥快还是走路减肥快?
  8. .vue文件 转换成html,在vue中把含有html标签转为html渲染页面的实例
  9. Android系统信息获取 之十:移动网络相关信息获取
  10. ACM PKU 1251 Jungle Roads http://poj.org/problem?id=1251
  11. 如何理解二次型?(转)
  12. onfigure: error: cannot find install-sh, install.sh, or shtool in
  13. 文件服务器 共享 端口,共享文件服务端口设置
  14. 布谷鸟算法的程序(个人注释)
  15. ubuntu 安装永中office 2009
  16. 分布式系统的时间问题
  17. 毕业之后才知道的——知网查重原理以及降重举例
  18. 汉字编码 拼音输入法
  19. 求负片灰度扩展幂律变换
  20. MP4视频文件过大如何压缩?压缩视频的方法是什么?

热门文章

  1. 一款功能超级强大的AI驱动自动一键抠图软件,可一键扣人物商品衣服动物婚纱图章签名logo
  2. 【NLP】Python NLTK获取文本语料和词汇资源
  3. Linux搭建samba服务及使用案例
  4. 5.NDK Android jni开发 异常处理 native奔溃解决(相机图片美化)
  5. 2022年终结——人生中最美好的一站
  6. JS 事件代理和事件委托
  7. C++ 检索 IP地址
  8. 使用Termux把Android手机变成SSH服务器
  9. 《RHCE考试必看》
  10. UITT私有化自动跟单系统