Python爬取音乐网站遇到的困难及解决思路
背景
前几天写爬虫的时候,遇到一个网站(music.bbbbbb.me)通过ajax异步加载实现内容的呈现,当时我就懵了——以前从未遇到过,而一般的教程中没有这样的东西!
一些思考
网上大多的教程讲的都是基础性的,普遍性的,对于不同的场景其实都是需要做出稍微改进的。
比如说大多数的爬虫教程吧,可以分为这几类:
- 第一类,它会直接扔出源码,然后什么也不写。
- 第二类,它会直接扔出源码,但加一点注释。
这两类都是授人以鱼,而且具有很大局限性——针对特定的网站管用。
- 第三类,就是类似你看到的一步一步将库怎么用,一步一步构建实例带你的。
这些的话是授人以渔,会告诉你为什么这样用,这样用有什么效果,具有简单的逻辑。
但有一句话是这么说的:师父领进门修行在个人。这些不用花费很大“代价”的教程,最多是渔网,不会是鱼叉,比较凶猛的鱼就没啥办法了。这时候有两个办法:
- 花钱买鱼叉
- 自己造鱼叉
但是不同的鱼,你可能需要不同的鱼叉,甚至可能需要鱼雷,直接买肯定是没问题,但是如果你需要战略性武器——超级无敌厉害的捕鱼工具。就会有技术垄断,你花多少钱都买不到。所以我觉得,学会自己造鱼叉很重要。
针对性分析
造鱼叉,在这个问题上体现为如下几个步骤:
- 为什么这个网页源码里没下载地址?
- 通过观察源码,发现它调用了几个js文件,并且 发现这些js文件只有一个在本站,别的都是别的网站的。显然显示url的功能应该是交给这个在本站的js文件了。
- 观察js文件,果然发现了url的产生方法,这个时候就需要考虑了,怎么获取js中内容了。
- 百度“python爬虫如何获取js内容”,发现了参考文献0,知道了这是ajax技术实现的。
- 这下就好办了,按理说按照这个下去就行了,虽然这个网站不太好,图片加载不出,但是问题不大。通过阅览那篇不全的网站,我知道了这时会返回json文件,然后把json文件加载到网页中是通过ajax实现的(出于好奇我了解了下ajax,不过这不是关键),关键在于抓取返回的json文件。
- 按照参考文献0我先写出了一个框架,然后测试了一下,发现不太行,查了一下错误,这是因为获取的内容格式不对。
- 我打印了一下获取的内容,发现不是json文件,而是html文本。困惑。
- 百度“python爬虫如何获取网页中json”,找到了参考文献11.以及其他参考文献(这一步百度的东西有点多有点乱,部分整理在参考文献中了,11是比较好的经典的,给了我启示的),我发现问题可能是请求头出错了。
- 通过浏览器抓包,找到了返回json的包,发现了返回json的数据包,看到了这个数据包是以post的方式提交给music.bbbbbb.me,然后还有相应的请求头和post的内容,我就把get方法改成了post方法,并且添加上了请求头和请求内容。
- 提示json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0),好奇,这时候打印获取内容的结果已经是json文件了,这是啥意思,于是百度了一下这个错误,发现是对json格式理解不深刻,于是又学习测试修改了一下。
- 成功写出。
以上就是我造出鱼叉的大致过程,当然只是主要步骤。
具体实现
Python实现抓取并按照一定格式封装为json文件,以便发送给前段。