python如何爬取js生成的数据?

sexyPanda
  • 41

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

回复
阅读 15.7k
10 个回答

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

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

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

使用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

回答中有童鞋说到了分析接口,直接爬接口,这是可行的,并且直接爬接口还不需要自己解析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接口生成的

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

index.html下又这行js引用。

<script type="text/javascript" src="https://img3.doubanio.com/misc/mixed_static/37fa28b9fa94889c.js"></script><script type="text/javascript">

打开这个js文件,就可以看到

  React.render(React.createElement(component, {"moreUrl":"\/chart","sections":[{"albums":[{"name":"今日營業中","performers":"林宥.................

打开chrome审查元素,在network里找js咯,一般名字比较特殊的那个js就可能是你要找的。比如这个,
图片描述

howel52
  • 3
新手上路,请多包涵

最直接的就是用selenium

你知道吗?

宣传栏