Python爬取音乐网站遇到的困难及解决思路

Python爬取音乐网站遇到的困难及解决思路

背景

前几天写爬虫的时候,遇到一个网站(music.bbbbbb.me)通过ajax异步加载实现内容的呈现,当时我就懵了——以前从未遇到过,而一般的教程中没有这样的东西!

一些思考

网上大多的教程讲的都是基础性的,普遍性的,对于不同的场景其实都是需要做出稍微改进的。
比如说大多数的爬虫教程吧,可以分为这几类:

  • 第一类,它会直接扔出源码,然后什么也不写。
  • 第二类,它会直接扔出源码,但加一点注释。

这两类都是授人以鱼,而且具有很大局限性——针对特定的网站管用。

  • 第三类,就是类似你看到的一步一步将库怎么用,一步一步构建实例带你的。

这些的话是授人以渔,会告诉你为什么这样用,这样用有什么效果,具有简单的逻辑。
但有一句话是这么说的:师父领进门修行在个人。这些不用花费很大“代价”的教程,最多是渔网,不会是鱼叉,比较凶猛的鱼就没啥办法了。这时候有两个办法:

  1. 花钱买鱼叉
  2. 自己造鱼叉

但是不同的鱼,你可能需要不同的鱼叉,甚至可能需要鱼雷,直接买肯定是没问题,但是如果你需要战略性武器——超级无敌厉害的捕鱼工具。就会有技术垄断,你花多少钱都买不到。所以我觉得,学会自己造鱼叉很重要。

针对性分析

造鱼叉,在这个问题上体现为如下几个步骤:

  1. 为什么这个网页源码里没下载地址?
  2. 通过观察源码,发现它调用了几个js文件,并且 发现这些js文件只有一个在本站,别的都是别的网站的。显然显示url的功能应该是交给这个在本站的js文件了。
  3. 观察js文件,果然发现了url的产生方法,这个时候就需要考虑了,怎么获取js中内容了。
  4. 百度“python爬虫如何获取js内容”,发现了参考文献0,知道了这是ajax技术实现的。
  5. 这下就好办了,按理说按照这个下去就行了,虽然这个网站不太好,图片加载不出,但是问题不大。通过阅览那篇不全的网站,我知道了这时会返回json文件,然后把json文件加载到网页中是通过ajax实现的(出于好奇我了解了下ajax,不过这不是关键),关键在于抓取返回的json文件。
  6. 按照参考文献0我先写出了一个框架,然后测试了一下,发现不太行,查了一下错误,这是因为获取的内容格式不对。
  7. 我打印了一下获取的内容,发现不是json文件,而是html文本。困惑。
  8. 百度“python爬虫如何获取网页中json”,找到了参考文献11.以及其他参考文献(这一步百度的东西有点多有点乱,部分整理在参考文献中了,11是比较好的经典的,给了我启示的),我发现问题可能是请求头出错了。
  9. 通过浏览器抓包,找到了返回json的包,发现了返回json的数据包,看到了这个数据包是以post的方式提交给music.bbbbbb.me,然后还有相应的请求头和post的内容,我就把get方法改成了post方法,并且添加上了请求头和请求内容。
  10. 提示json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0),好奇,这时候打印获取内容的结果已经是json文件了,这是啥意思,于是百度了一下这个错误,发现是对json格式理解不深刻,于是又学习测试修改了一下。
  11. 成功写出。

以上就是我造出鱼叉的大致过程,当然只是主要步骤。

具体实现

Python实现抓取并按照一定格式封装为json文件,以便发送给前段。

# coding:utf-8
import requests
import json

headers={
     'Host':'music.bbbbbb.me',
'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding':'gzip, deflate',
'Referer':'http://music.bbbbbb.me/',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With':'XMLHttpRequest',
'Content-Length':'47',
'Connection':'keep-alive',
'Pragma':'no-cache',
'Cache-Control':'no-cache'}
data={
     'input':mname,'filter':'name','type':'netease','page':'1'}
url = 'http://music.bbbbbb.me/'

mname=input("music name:")
wbdata = requests.post(url,headers=headers,data=data).text
#print(wbdata)
data = json.loads(wbdata)

for n in data['data']: 
    author = n['author']    
    url = n['url']    
    print("歌手:",author,"下载地址:",url)

总结

总结一下,解决这个问题我大概经历了以下几个步骤:发现问题(怎么没有下载地址)——依靠已有知识初步剖析(应该在js文件里)]-——搜索资源(如何获取)——整理资源——尝试解决——遇到bug1(没有正确获取到json)——探索bug1——解决bug1(成功获取到json)——继续解决问题(获取json中的作者和url项)——遇到bug2(提示错误)——探索bug2——解决bug2(成功输出)

更多文章欢迎访问我的博客www.chen517.xyz

参考文献

0.Python爬虫实战入门五:获取JS动态内容—爬取今日头条
https://blog.csdn.net/yaoyaoyao2/article/details/79215658

1.python读取json文件:
https://www.cnblogs.com/laoniubile/p/6036919.html

2.python爬取ajax请求,返回的json数据格式化报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0):
https://blog.csdn.net/beta_safe/article/details/80456438

3.解决json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)问题:
https://blog.csdn.net/zaishijizhidian/article/details/81273222

4.在线json格式化效验工具
http://www.bejson.com/

5.Python爬虫之json:
https://blog.csdn.net/qq_41396296/article/details/80767528

6.python 爬取网页json数据处理:
https://blog.csdn.net/weixin_41972401/article/details/79892588

7.如何使用 Python 得到网页返回正确的 Json 数据:
https://zhidao.baidu.com/question/204694165549922445.html

8.json中json.loads()和json.dumps()的区别:
https://blog.csdn.net/qq_42807295/article/details/81274118

9.python错误:TypeError: string indices must be integers:
https://blog.csdn.net/wangpeng2011314/article/details/79388543

10.ajax异步加载:
https://www.cnblogs.com/wt627939556/p/6287242.html

11.【2】Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1):
https://blog.csdn.net/qq_36779888/article/details/79210713

12.如何使用 Python 得到网页返回正确的 Json 数据:
https://zhidao.baidu.com/question/204694165549922445.html

13.python爬取ajax请求,返回的json数据格式化报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) - beta_safe的博客 - CSDN博客:
https://blog.csdn.net/beta_safe/article/details/80456438

你可能感兴趣的:(Python,心得,爬虫,Python爬虫,心得)