我想要爬取豆瓣音乐music.douban.com上的 新碟榜 和 近期热门歌单 ,看源代码好像都是js生成的,请教大家有什么办法可以爬到这些数据?谢谢!
高洛峰2017-04-17 17:58:25
我用Jsoup寫爬蟲,通常遇到html回傳沒有的內容。但是瀏覽器顯示有的內容。都是分析頁面的http請求日誌。分析頁面JS程式碼來解決。
1、有些頁面元素被隱藏起來了->換selector解決
2、有些資料保存在js/json物件中->截取對應的串,分析解決
3、透過api介面呼叫->偽造請求取得資料
還有終極方法
4、使用phantomjs或是casperjs這種headless瀏覽器
黄舟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執行完畢後才開始解析頁面的內容,這時候可以使用官方提供的一個示例代碼,利用這個函數,可以等待這個頁面所有的請求都加載完畢之後再接著處理,那麼你就可以獲得完整載入的頁面了,之後該幹嘛幹嘛了。
高洛峰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
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":"林宥.................