学习笔记_python和网易云音乐

环境:

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即可




未完待续……


你可能感兴趣的:(读书笔记)