环境:
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即可
未完待续……