少女祈祷中...

Python爬虫-pixiv关注画师作品[1]


本篇概述:大概有几篇是关于pixiv关注画师的作品抓取的思路和代码,后面大概还会有p站个人收藏的爬虫(这个比较简单)

1、pixiv介绍

  • Pixiv
  • 这是一个墙外的网站,需要正确的扶梯姿势和科学上网
  • 当然也可以参考我的方法(nginx + 修改 hosts 文件)
  • 地址:点击前往 密码:3235 (建议 hosts 文件取自己需要的那部分)
  • 为什么选 pixiv 呢?其实在12月份的时候我刚开始学 python,这个 pixiv 的小项目是我自己突发奇想要做的,那时候是新年前一周左右,对于那时候的我来说,pixiv 反爬难度一般般,但比较难的数据接口分析、构造url、文件操作、代理、图片合成等(自己一个人盯了这个网站几天,最后完成超级兴奋!)

Pixiv登录绕过——2020.7.22更新

使用Selenium获取在Chrome浏览器上登录的Pixiv账号的cookie,从而绕过Google V3人机验证

链接:http://00102400.xyz/blog/2019/08/29/pixiv-new-login/

nginx+ 改host上P站教程——2019.5.24更新

已失效——2020.7.22

  1. 下载上面链接中的压缩包,解压
  1. 复制hosts文件中的代码,追加到当前电脑的hosts文件中

    当前电脑的hosts文件在C:\Windows\System32\drivers\etc目录下,如果没找到的话可以搜索一下或者用everything软件(强烈建议!)进行搜索.

  1. 打开调试工具(这个功能全).bat

选择对应的数字序号

  1. Tip
  1. 如果正常启动不行的话,可以尝试以下代码
1
2
3
netstat -aon | findstr ":443"
# 找到占用了443端口的程序的PID
# 可能是本机虚拟机占用了这个端口
  1. 或者手动修改nginx的端口,具体修改流程百度

2、Target

  • 登录账号关注的画师的作品
  • 思路:
    • 首先是模拟登录(PC 用过 pixiv 的同学都知道在未登录的时候 pixiv 会对用户做一些限制,所以我们要先模拟登录)
    • 其次保持会话连接(可以考虑 cookie 保存,这里采用的是 requests 的 session 会话连接)
    • (基于图片网站,可能是动态加载,那么需要分析接口或者是 selenium 模拟)
    • 最后才进行网页内容分析,然后抓取保存下来

3、登录模拟实现流程

一、查找登录接口

  • 第一次找关于登录接口的时候,一个login都没看到,只看到一个 www.pixiv.net ,可惜是get请求的页面。
  • 在拜读了 Chrome使用技巧Chrome开发者工具使用小技巧 后,算是对 chrome 的调试工具有个大概了解的印象,知道了 preserve log 勾选后,可以保留网络日志,于是发现了真正的登录请求

分析参数

password:个人密码

pixiv_id:个人id

post_key:不明字符串

source:pc即电脑端(截图没截全,把return_to漏掉了。。。)

return_to:是登录成功后跳转的页面,这个可以自己填,貌似默认是 https://www.pixiv.net/

那么接下来就是找post_key了

  • 首先pixiv非常友好,所以应该不是js加密,而是在页面中随机生成的。
1
2
3
4
5
# 其次在点击登录的时候就跳转 url1 ↓
# url1 = https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index
# 但是登录请求的 url 是 url2 ↓
# url2 = https://accounts.pixiv.net/api/login?lang=zh
# 所以猜想 post_key 应该是在前者中生成的。

F12 打开,在 Elements 中 Ctrl + F 查看 post_key

接下来用 BeautifulSoup 匹配

1
2
self.post_key = post_key_soup.find('input') ['value']	
# 因为是第一个input标签,而find返回的是第一个符合要求的结果

接着向 url2 发去 post 请求

1
2
3
4
5
6
7
8
data = {
'pixiv_id': self.pixiv_id,
'password': self.password,
'return_to': self.return_to,
'post_key': self.post_key}
rep = se.post(self.login_url, data=data, headers=self.headers,verify=False)
# login_url是上面的 url2
# 我这里 return_to 写的是个人关注画师的那个页面的 url

登录代码

0702更新代码,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
from bs4 import BeautifulSoup
se = requests.session()
def login():
base_url = 'https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index'
login_url = 'https://accounts.pixiv.net/api/login?lang=zh'
headers = {
'referer': 'https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',
'origin': 'https://accounts.pixiv.net',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}

post_key_html = se.get(base_url)
post_key_soup = BeautifulSoup(post_key_html.text, 'lxml')
post_key = post_key_soup.find('input')['value']
print(post_key) #捕获postkey
data = {
'pixiv_id': 'xxxx',
'password': 'xxxx',
'return_to': 'https://www.pixiv.net/bookmark.php?type=user&rest=show&p=',
'post_key': post_key
}
rep = se.post(login_url, data=data, headers=headers,verify=False)
print(rep.text)

顺便吐槽下 HTTPS 的证书报警问题

1
2
from requests.packages.urllib3.exceptions import InsecureRequestWarning     #强制取消警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

4、最后

先到这吧,后面继续写解析关注画师页面(页数),寻找数据接口,单图动图多图下载估计写不到了

へ( ̄  ̄;へ)

-------------本文结束感谢您的阅读-------------

本文标题:Python爬虫-pixiv关注画师作品[1]

文章作者:Coder-Sakura

发布时间:2019年03月27日 - 21:14:36

最后更新:2020年07月22日 - 13:14:43

原始链接:https://coder-sakura.github.io/blog/2019/03/27/pixiv-one/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。