近期三日的网络爬虫和API的小结

最近三天由于功能需求,在编写面向各大音乐网站的网络爬虫。起初以为工作量不是很大,只是简单的重复而已,后来发现事情没有那么简单。

首先是30日晚简单地试了一下各大音乐网站的功能,得出结论能使用的有酷我音乐,百度音乐,酷狗音乐(网易云很想用,但是不符合需求。虾米没来得及测试)。第二天开始进行爬虫测试。对酷狗音乐,照例先是GET主页,结果出乎意料,收到了一个循环重定向向主页的response。通过查询后来发现,可能是酷狗的保护措施。对于GET请求会返回一个带cookie的重定向response,这样在客户端第二次GET主页时可以成功拿到主页。然而,通过查看返回的报头来看,重定向response并没有cookie(不然就不会报错)。多次尝试无果,就先搁置了对酷狗的爬虫转而向酷我发展。

酷我音乐好像并没有那些套路,我没有测试。因为我找到了API,也因为找到了API却使用了错误方法而延误了一天。在对酷我API申请数据时将postdata与url通过urllib.request合并为一个request了。以至于一直收到‘参数错误’的回复。然后受到返回信息误导,一直在琢磨参数错在哪儿了。失败,就暂且放弃了。

百度音乐是最轻松的一个。直接爬虫网页(没有使用API),找歌曲节点,获取节点属性,结束。

由于网易云是自己使用的音乐app,所以一直想借用它的资源实现自己的功能。无奈网易云的外链虽好,可没有自动获取id的方法也是徒劳。不死心,开始爬网易云。主页GET到了,但当GET搜索资源时出现了404错误。后证实同酷我一样是使用了错误的方法。一次不抱希望的尝试意外GET到了网页,但没有这么简单。在分析网页时发现网易云对于搜索内容采用了iframe框架,导致爬虫对其中的内容抓不到。后来想采用网络上selenium来获取框架内的内容的,自己分析框架后放弃了。网易云对框架的搜索结果信息采用了从js加载的方法。真的是四处碰壁呀,对框架爬虫不成就获取不到id,就生成不了外链,好可惜。还是不死心,开始寻找API。找到的第一个API只能拿到不受版权要求可以生成外链的歌曲id,人心不足蛇吞象,觉得不够用就返回去继续攻克爬虫网页难题。打算试一下嵌套进iframe查看理想效果,不想问题才开始。将网易云单曲播放页面作为iframe子框架插入自己的页面时发现网易云使用if(window.location!=top.location)top.location=window.location来防止页面被iframe嵌套。采用网络上的双层iframe也是无用,现在想想双层嵌套在理论上就不行,只要网易页面不是top就会一直跳转。后来采用sandbox沙盒来阻止网页内script运行。成功,但页面都没加载全,因为网易主要是靠js加载。这样就又不符合需求了,发现sandbox是可以添加参数的。不断添加参数,直至网页跳转,发现是 allow-top-navigation 属性。将其他属性加上后页面不再跳转且页面正常加载完毕,事情发展到这里似乎有点完美,于是美乎乎睡了一觉。还是太年轻了。网易云没有设置自动播放功能,需要手动点击按钮才可以播放,这对人来说无所谓,对机器是真的太不友好了。开始虎头虎脑的想从父页面获取iframe内元素,然后模拟点击。当时就是这么想着睡着的,可是由于涉及到跨域操作,浏览器会拦截。查找网上各种奇淫巧技,没有成功的(或许有,仅仅是大神们不兴说而已)。浏览器的安全机制哪里是那么容易打破的。突然,又发现快捷键p同样是播放,又转而寻找模拟按键的代码。个人觉得比较可靠的是模拟p按键的事件。但是没有成功,任务搁置。今天终于找到了API,也找到了解决办法,感谢诸位网友的信息提供。

虾米自带API,但是其资源好像没有其他几个多(可能是错觉吧)。且API并不是很好用,就放弃了。去实现其他需求吧。

放弃网页爬虫!有API用API!将百度,酷我,网易云的API找到,拿到要的信息。其中涉及到了json数据的读取,字符的转码,多次API的使用等等。一步步将需要的信息分析出来。除了酷我的图片信息需要额外的爬一次网页以外,其他均交由API实现,比较可靠。酷我今天崩了,登不进网页,爬不到数据了,还以为代码有新问题了呢。。

寻找接口的重任终于结束啦啦啦啦啦啦啦!接下来就是最有趣的功能编写了!

你可能感兴趣的:(python,爬虫,python,音乐)