搜尋

首頁  >  問答  >  主體

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

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

高洛峰高洛峰2887 天前478

全部回覆(9)我來回復

  • 高洛峰

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

    我用Jsoup寫爬蟲,通常遇到html回傳沒有的內容。但是瀏覽器顯示有的內容。都是分析頁面的http請求日誌。分析頁面JS程式碼來解決。

    1、有些頁面元素被隱藏起來了->換selector解決
    2、有些資料保存在js/json物件中->截取對應的串,分析解決
    3、透過api介面呼叫->偽造請求取得資料

    還有終極方法
    4、使用phantomjs或是casperjs這種headless瀏覽器

    回覆
    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執行完畢後才開始解析頁面的內容,這時候可以使用官方提供的一個示例代碼,利用這個函數,可以等待這個頁面所有的請求都加載完畢之後再接著處理,那麼你就可以獲得完整載入的頁面了,之後該幹嘛幹嘛了。

    回覆
    0
  • PHP中文网

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

    自己找資料介面咯

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:58:25

    應該都是api介面產生的

    回覆
    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 Complicated

    回覆
    0
  • 阿神

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

    chrome,按下F12,點選,查看request,很容易能找到URL和參數,自己建構就行,然後解析回傳的內容。

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

    回覆
    0
  • PHP中文网

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

    打開chrome審查元素,在network裡找js咯,一般名字比較特殊的那個js就可能是你要找的。例如這個,

    回覆
    0
  • 黄舟

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

    最直接的就是用selenium

    回覆
    0
  • 取消回覆