源碼 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的打算……
渣代碼,輕噴,歡迎交流指教