一个基于Scrapy框架的pixiv爬虫

 

 源码 https://github.com/vicety/Pixiv-Crawler,功能什么的都在这里介绍了

 

说几个重要的部分吧

登录部分

困扰我最久的部分,网上找的其他pixiv爬虫的登录方式大多已经不再适用或者根本就没打算登录……

 

首先,登录时显然要提交FormData,一开始我请求的是 https://accounts.pixiv.net/login?lang=zh 这个页面

这个postkey可以发现和网页代码中的这个部分(下图)中是一样的,但是用这个postKey是登录不上去的,结果见下图

 

登录可以成功(收到异常登录邮件),但无论你访问什么页面,它都会无限重定向回这个页面,一开始以为是header填得不完整,可是怎么改都不对

后来发现request请求 http://www.pixiv.net 得到的页面中也有一个postKey(不太明白上一个postKey的含义,难道是特意骗我们一下……)

 改用这个,成功登录,剩下应该不是什么问题了

 日榜部分

对于日榜的获取(虽然还没有写进去)也值得提一下,日榜的展现是下拉到底端自动获取下一页式的,分析网络请求,发现这一条的链接应该指向的就是下一页,并且去除后面的&tt=96a6bd8c731d3a46a9388f1e8cd90edf也是一样可以访问的

我们进入链接,发现是一个json文件,对于我们来说其实更加易于处理

另外说一下,这里推荐Chrome浏览器的JSONView插件,自动解析JSON成方便看的模式,火狐似乎自带这个功能

import json 

js = json.loads(response.text)

url = js["content"]["0"]["url”]

可以使用类似这样的代码方便地读取json文件

另外注意load和loads函数的区别,loads用于处理字符串而load用于处理文件,对于将文件或是字符串转为json则有dump和dumps函数,就像下面这个例子

import json
data = {
    'a': '123',
    'b': True,
    'c': None,
    'd': 456,
    }
with open("test.json", 'w') as f:
    json.dump(data, f)

# test.json 内容
# {"a": "123", "b": true, "c": null, "d": 456}

    

 

 

搜索部分

在完成按tag搜索的部分时发现,图片div的class都是这种奇怪的格式,尽管在我的电脑上搜索了其他几个tag这些class的名字都是一样的,但是看这种class的名字就有种莫名的不安啊……可能在换个环境class也是会动态变化的

 另外发现网页中的这个部分data-items的结构就是json,于是剩下的部分又变得方便很多了

 

图片获取

 在pipeline中获取图片时header中一定要记得带referer,否则会触发p站的防盗链机制,返回403

 

 

重要的部分差不多就这些,其他按scrapy的套路走就行

 

最后,本来想做个GUI的,尝试用pyqt5,发现分离GUI线程和爬虫线程好像挺难解决的,两个线程间用signal通信也很困难,毕竟临时学的qypt,解决不了也正常,于是放弃做GUI的打算……

渣代码,轻喷,欢迎交流指教

 

posted @ 2017-09-18 16:56  Invisible_full_moon  阅读(1915)  评论(0编辑  收藏  举报