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

我想要爬取豆瓣音乐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 Complicated

阿神

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

Ty80

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

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

黄舟

最直接的就是用selenium

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板