网页爬虫 - python如何爬取js生成的数据?
高洛峰
高洛峰 2017-04-17 17:56:25
0
9
370

我想要爬取豆瓣音乐music.douban.com上的 新碟榜 和 近期热门歌单 ,看源代码好像都是js生成的,请教大家有什么办法可以爬到这些数据?谢谢!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复 (9)
小葫芦

我用Jsoup写爬虫,一般遇到html返回没有的内容。但是浏览器显示有的内容。都是分析页面的http请求日志。分析页面JS代码来解决。

1、有些页面元素被隐藏起来了->换selector解决
2、有些数据保存在js/json对象中->截取对应的串,分析解决
3、通过api接口调用->伪造请求获得数据

还有一个终极方法
4、使用phantomjs或者casperjs这种headless浏览器

    黄舟

    回答中有童鞋说到了分析接口,直接爬接口,这是可行的,并且直接爬接口还不需要自己解析HTML了,因为大部分接口返回的都是json,想想都觉得开心呀~

    不过还是有别的方法,例如使用Phantomjs,简单易用,Python并非全能,搭配其他工具会发挥更大的价值,我自己也有一些小项目是这样的组合。

    这是官方的一个实例代码,稍加改造就可以达成目的了。

    console.log('Loading a web page'); var page = require('webpage').create(); var url = 'http://phantomjs.org/'; page.open(url, function (status) { //Page is loaded! phantom.exit(); });

    改造下

    var page = require('webpage').create(); var url = 'http://phantomjs.org/'; page.open(url, function (status) { page.evaluate(function() { // 页面被执行完之后,一般js生成的内容也可以获得了,但是Ajax生成的内容则不一定 document.getElementById('xxx'); // 可以操作DOM,这里你就可以尝试获取你想要的内容了 // ... }) phantom.exit(); });

    但其实很多情况下,都是需要等待Ajax执行完毕后才开始解析页面的内容,这时候可以使用官方提供的一个示例代码,利用这个函数,可以等待这个页面所有的请求都加载完毕之后再接着处理,那么你就可以获得完整加载的页面了,之后该干嘛干嘛了。

      洪涛

      自己找数据接口咯

        左手右手慢动作

        应该都是api接口生成的

          小葫芦

          使用selenium挖掘新碟榜例子:

          from selenium import webdriver dirver = webdriver.Chrome() dirver.get('https://music.douban.com/') for i in dirver.find_elements_by_css_selector('.new-albums .album-title'): print i.text

          结果:
          今日營業中
          周杰伦的床边故事
          H.A.M.
          3집 EX'ACT

          Dangerous Woman
          在一片黑暗之中
          Last Year Was Complicated

            阿神

            chrome,按下F12,点击,查看request,很容易能找到URL和参数,自己构造就行,然后解析返回的内容。

              Ty80

              index.html下又这行js引用。