使用Express给Python提供API
Express 初步认识
Express是一个简洁而灵活的 Node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。
Express 官方文档
教程参考:Node.js Express 框架
安装Express
在项目目录中使用指令:npm install express --save
来安装(--save
和-S
等效)
DEMO
|
启动
|
在浏览器中访问localhost:8001
会看到喜闻乐见的Hello World
Express在爬虫中的应用
当我们遇到一些JS加密函数时候,我们可以不用去尝试完全用Python改写,而是可以直接利用它,因为我们仅仅需要加密后的结果,因此如何让JS源码运行然后得到结果给Python才是我们关心的,除了使用Python的第三方库,我们还可以使用Express这个基于Node.js环境下的服务器去跑JS函数然后提供API给Python调用
简易的Python调用API示例
|
此时便可以用Python获取
|
输出结果:
|
参数传递
继续之前例子,新增以下函数:
|
尝试访问:localhost:8001/params?name=EXAMPLE
响应结果:
|
表单传递
注意,表单传递需要安装body-parser
才能使用.body()
npm install body-parser -S
完整代码如下:
|
而对于Python这边,如果需要传递JSON数据,则需要在请求头加入content-type
一般为application/json
,并且需要使用json.dumps()
处理字典然后传递表单。完整Python代码如下:
|
响应结果:
|
例子:七麦数据榜单
七麦数据榜单API有一个JS生成的加密参数analysis
,参考此篇文章:七麦数据榜单API加密参数逆向
Express 提供加密参数生成 API
在逆向文章中,收尾部分提到了名为params
的信息很关键:
|
它直接反应了请求的榜单关键信息,因此我会要求Python脚本提供这些参数,而对于其它基本不会变动的信息则由express
中脚本负责(拼接、传递),所以JS代码会是如下:
负责生成参数的js文件中追加:
|
EXPRESS脚本:
|
脚本会监听localhost:8081
,向localhost:8081/getIt
发送类似于以下表单:
|
响应结果:
|
Python请求API
Python简单DEMO:
|
结果:
|
至于params
上面Python传递的params
:
|
brand
对应的是 免费榜单 类型,device
对应的是获取的是iOS商店的榜单,country
对应的是商店分区,genre
暂时不明,写死即可,is_rank_index
同理,这些参数基本不用变化,或者在爬取前根据需求手动改写以下即可,而对于date
、page
、snapshot
这三个需要在爬取时动态更新的参数,下面给出解决办法:
首先可以直接获取https://api.qimai.cn/rank/index
,请求参数如下(JSON格式展示,下同):
|
只根据四个参数尝试生成analysis
(利用上面EXPRESS脚本API):
|
生成结果:
|
可以看到,生成结果一致
请求响应结果:
|
其中rankInfo
是返回的榜单数据(即第一页数据),此处省略。
该返回数据包含了两个较为有用的信息。首先是snapshot
的值,对应的是网页上14:54~至今
,而maxPage
则是指明该分区下最大的数据页。
如果需要获取其它时间分区下的数据,如上图的01:31
,可以请求以下https://api.qimai.cn/rank/indexSnapshot
,参数如下:
|
这里省略生成analysis
测试,参考上面
响应结果:
|
可以看到已经获取到其对应值了:
|
即01:31:03
,将其加入params
即可
现在三个参数获取途径均已知晓,通过代码获取拼接即可。