爬虫基础文档讲解(不包含代码)之 “猫眼实时票房”网站的爬取
目标网站:https://xxxxxxx.mxxxxxxaoyan.com/dashboard
可使用的技术:Python、Java
目标资源的分析
- 第一步 我们要分析 我们要获取那些 资源,从下面的这个图片我们可以看出,这个网页分了三部分,左面是“电影票房”,右面分了两小部分,分别是上面的 “网络热度” 以及 下面的 “电视收视”。我们今天主要获取 右面的 “电影票房”获取到 1. “影片名称” 2. “综合实时票房” 3. 票房总比 4. 排片场次 这四大块
好。内容分析完成,我们按下F12 看一下源代码
发现本应该是数字的地方变成了 “乱码”,不过需要注意的是,这个地方不是乱码那么简单,那么这些字体是从哪里获取到 以及 要怎么显示呢?在想这些问题之前 我们可以先想一下,这个平台是怎么刷新数据的呢?我们打开 “网络”这一栏,看看有没有数据在加载
通过等待我们可以看出,这个网站大约每 2-4s会执行一下Ajax 请求,那么我们就可以从这里入手
对于网站ajax请求的分析
- 我们来看一下网站的请求
请求网址: https://piaofang.maoyan.com/dashboard-ajax?orderType=0&uuid=18393488e75c8-0ac6dfec66809d-26021c51-1fa400-18393488e75c8&timeStamp=1664626223628&User-Agent=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEwNS4wLjAuMCBTYWZhcmkvNTM3LjM2&index=986&channelId=40009&sVersion=2&signKey=e28dbebe457aa8c917c03d3cad4736d1
请求方法: GET
状态代码: 200 OK
远程地址: 127.0.0.1:7890
引荐来源网址政策: strict-origin-when-cross-origin
可以看到请求的格式以及请求的参数。发现需要的参数 我们把参数单领出来
# 这个是固定参数 应该是排序的
orderType=0
# 这个也是固定写死的
uuid=18393488e75c8-0ac6dfec66809d-26021c51-1fa400-18393488e75c8
# 这个毫无疑问是时间戳
timeStamp=1664626223628
# 这个是当前浏览器的标示 重点我们接下来看一下 这里简单的做一下了解
Use-Agent=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEwNS4wLjAuMCBTYWZhcmkvNTM3LjM2
# 这个暂且不清楚是干什么的
index=986
# 下面的三个 接下来做分析时再做讲解
channelId=40009
sVersion=2
signKey=e28dbebe457aa8c917c03d3cad4736d1
我们通过其中的一个入参找到这个请求是从哪里发送出的。并且打一个断点
运气不错、一次就命中了。这个时候 我们就要对上面我们不知道的参数进行一个个分析
Use-Agent:
发现是一个 网络请求标准请求头。但是 我们请求的参数 是
TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEwNS4wLjAuMCBTYWZhcmkvNTM3LjM2 这个呀。仔细看我们会发现,有一个 window.btoa 这个属性,这个属性是干嘛的? 这个属性是创建base64 字符的
那我们把
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
放在base64 加密一下就会得到
TW96aWxsYS81LjAlMjAlMjhXaW5kb3dzJTIwTlQlMjAxMC4wJTNCJTIwV2luNjQlM0IlMjB4NjQlMjklMjBBcHBsZVdlYktpdC81MzcuMzYlMjAlMjhLSFRNTCUyQyUyMGxpa2UlMjBHZWNrbyUyOSUyMENocm9tZS8xMDUuMC4wLjAlMjBTYWZhcmkvNTM3LjM2
结合网站得到的参数会发现一模一样。现在 Use-Agent 这个参数知道了就是 前端base64 转换 后端 解码接受, 我们接着分析
index:
可以看到没有什么特别深的含义 就是一个 3 位的随机数
channelId:
我们可以看出n(i) 里面包含的是 pc_browser 所对应的 s这个函数是
40009 那么我们这个参数也可以完全写死。
sVersion: 这个参数是版本号 也可以完全写死
signKey:
我们的重头戏来了,这个参数 我们接着流程往下走
可以看到 这个地方有一个加密的地方,参数呢就是我们上面的那些参数。把这个字符复制到 md5 加密哪里对比一下
看的出来和我们想的是一样的 sigleKey 都是 37d597b18553f2af29bb2f6adf3c8ad7 我们执行一下 看看是不是 我们的结果
可以看到和我们上面分析的是一模一样的
至此分析完成了
- 网站请求返回的参数
可以看到 返回的数据中有一个 movieList 集合中有一个 data 。里面存放的就是 要找到的数据。但是呢 很遗憾,有一个 boxSplitUnit 的集合中存放的是 实时的票房,但是可惜被做处理了,我们没有办法直接拿到想要的数据,但是我们看到 再 movieList 上面有一个 fontStyle 的文件。这个正好是上面出现的 字体文件。
看出来对于上面猜想我们是正确的。然后我们下载这个 woff 文件 并且用 http://blog.luckly-mjw.cn/tool-show/iconfont-preview/index.html 解析我们的字体文件
解析下来我们可以看到 这个网站生成的字符 里面只有这几个文字。我们 通过 boxSplitUnit 这个里面的 “乱码” 和 解析出来的文字一一对应 我们可以得到这个一串数字
 1  6  5  4  3  2  4
解读下来就是 16542.24万元
Ok 这就是获取到了 我们想要的目标数值
总结
这个一串数字
 1  6  5  4  3  2  4
解读下来就是 16542.24万元
Ok 这就是获取到了 我们想要的目标数值
总结
因为最近不想写任何的东西,代码就不写了,可以自己完善一下,总结一下思路