環境:
python--version(Python 3.6.5)
pip--version(pip 9.0.3)(需要升級到最新10.0.1:python -m pip install --upgrade pip)
安裝scrapy:pip install scrapy(報錯的話,裝一個VS就什麼都有了)
裝好後,scrapy –version(Scrapy 1.5.0)
然後按照教程來,遇到錯誤ModuleNotFoundError: No module named 'win32api',需要到https://github.com/mhammond/pywin32/releases下載對應版本的pywin32,安裝好之後再在項目根目錄下運行scrapy crawl dmoz就能看到爬蟲執行完成後的Spider closed (finished)了。的,dmoz爲scrapy.Spider的name。也可以在項目根目錄下(與scrapy.cfg同級)下新建main.py中寫入:
from scrapy import cmdline cmdline.execute("scrapy crawl dmoz".split())
然後在pycharm中直接run這個main.py就可以了。
使用selenium:
到https://npm.taobao.org/mirrors/chromedriver下載win32版本的chromedriver.exe,放到python安裝目錄的scripts下。
安裝selenium:pipinstall selenium(我安裝時是3.12.0)。查看是pip show selenium。
學習:
網易雲使用AES加密,因此要安裝加密模塊:Pip install Crypto(Crypto-1.4.1 Naked-0.1.31certifi-2018.4.16 chardet-3.0.4 pyyaml-3.12 requests-2.18.4 shellescape-3.4.1)。
報錯的話裝這個吧:pip3 install pycryptodome然後到python安裝目錄的lib/site-packages的crypto改成Crypto這樣便能使用fromCrypto.Cipher import AES了。
安裝requests第三方庫:pipinstall requests()
(pip install binascii用來字符轉換的)
PyCharm使用:
同目錄下import報錯:在PyCharm中右鍵項目根目錄,Make Directory as->Sources Boot
網易雲請求分析:
用chrome打開網易雲,F12打開開發工具,network中(可F5一下)會看到core.js,以及相關請求如粉絲列表https://music.163.com/api/user/getfollows/278688809請求,切換到sources在s3.music.126.net下會看到core.js這是加密相關的主體內容,點開,然後左下角有一個{}可以美化js,然後打斷點觀察請求的加密過程,主要是請求參數params和encSecKey是怎麼得到的。
粉絲請求分析:(getfollows爲關注的人,getfolloweds爲粉絲)
接口url:https://music.163.com/api/user/getfollows/278688809
原始參數:
Cookie: true
Data:"uid=278688809&offset=0&total=true&limit=20"
Method: "GET"
Noescape: undefined
Onerror()
Onload()
Query: "uid=278688809&offset=0&total=true&limit=20"
Type: "json"
中間過程:
Query或者data轉化成對象然後添加csrf_token參數值爲“”,
接口變成https://music.163.com/webapi/user/getfollows/278688809
Method值變爲post,
進入加密函數:四個參數
d爲:
"{"uid":"278688809","offset":"0","total":"true","limit":"20","csrf_token":""}"
e爲(不變):010001
f爲(不變):
00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
G爲(不變):0CoJUm6Qyw8W8jud
產生隨機數i:EtMAM7C53RFGRtGL
經過函數b加密後encText值爲(向量爲0102030405060708):
"Pq/3pP0pT+N/VFi9fioTKyVyrNJzbxIE6+rCf+5bR96h2/GprwVmpPB2Sggfp4aKONdWZzmvMiCAgv1sDn7hW6CkaqHO0T7FklaDWyCgq0Q="
再用隨機數i加密一次後excText值爲(向量爲0102030405060708):
"JfVfU1s4vqGfOASeuj0NUiNUjVK47kQlkFjUey15pwOgJc2jyLHA8qMfrECS6ew0BGRymcAFbPVUI4h2UEyJ1BASbX6VZSS9PEvdT7VstITN/FpD+qitRIBmF9JRq61Vs0JJPfTkqeHjWIVLFFJKgQ=="
RSA加密後encSecKey值爲(使用c(i,e,f)產生的,i如果不是隨機產生的那麼這個值就是固定的):
"0bad02661abf04b656fe95c1334b615bf9b4fb64b1a9bbf49e8cf2105ca7a915feb03bbc44435c5d5fa375d4cf025c82124ea59e08391ab89ed175d025d5149e8a800299aec26bb5aabfb1b66746f333eb12ce23cb63ae52fac6d78cc92db1b98d149bd9b35211dbcf17501dea4b4698446fb156fd5e9bea1d7a0ec58dd3c02a"
最終得到的參數中query被刪除了,data爲:
"params=JfVfU1s4vqGfOASeuj0NUiNUjVK47kQlkFjUey15pwOgJc2jyLHA8qMfrECS6ew0BGRymcAFbPVUI4h2UEyJ1BASbX6VZSS9PEvdT7VstITN%2FFpD%2BqitRIBmF9JRq61Vs0JJPfTkqeHjWIVLFFJKgQ%3D%3D&encSecKey=0bad02661abf04b656fe95c1334b615bf9b4fb64b1a9bbf49e8cf2105ca7a915feb03bbc44435c5d5fa375d4cf025c82124ea59e08391ab89ed175d025d5149e8a800299aec26bb5aabfb1b66746f333eb12ce23cb63ae52fac6d78cc92db1b98d149bd9b35211dbcf17501dea4b4698446fb156fd5e9bea1d7a0ec58dd3c02a"
使用PyMongo:
安裝:pip install pymongo(3.6.1)
使用:
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId
client = pymongo.MongoClient("127.0.0.1", 27017)
db = client["music"]
fansTable = db["fans"]
fansTable.count({'userId': item['userId']})或者insert即可
未完待續……