suchen

Heim  >  Fragen und Antworten  >  Hauptteil

网页爬虫 - python如何爬取js生成的数据?

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

高洛峰高洛峰2887 Tage vor471

Antworte allen(9)Ich werde antworten

  • 高洛峰

    高洛峰2017-04-17 17:58:25

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

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

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

    Antwort
    0
  • 黄舟

    黄舟2017-04-17 17:58:25

    回答中有童鞋说到了分析接口,直接爬接口,这是可行的,并且直接爬接口还不需要自己解析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执行完毕后才开始解析页面的内容,这时候可以使用官方提供的一个示例代码,利用这个函数,可以等待这个页面所有的请求都加载完毕之后再接着处理,那么你就可以获得完整加载的页面了,之后该干嘛干嘛了。

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:25

    自己找数据接口咯

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-17 17:58:25

    应该都是api接口生成的

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-17 17:58:25

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

    Antwort
    0
  • 阿神

    阿神2017-04-17 17:58:25

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

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:25

    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":"林宥.................

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-17 17:58:25

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

    Antwort
    0
  • 黄舟

    黄舟2017-04-17 17:58:25

    最直接的就是用selenium

    Antwort
    0
  • StornierenAntwort