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(); });
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
我用Jsoup写爬虫,一般遇到html返回没有的内容。但是浏览器显示有的内容。都是分析页面的http请求日志。分析页面JS代码来解决。
1、有些页面元素被隐藏起来了->换selector解决
2、有些数据保存在js/json对象中->截取对应的串,分析解决
3、通过api接口调用->伪造请求获得数据
还有一个终极方法
4、使用phantomjs或者casperjs这种headless浏览器
回答中有童鞋说到了分析接口,直接爬接口,这是可行的,并且直接爬接口还不需要自己解析HTML了,因为大部分接口返回的都是json,想想都觉得开心呀~
不过还是有别的方法,例如使用Phantomjs,简单易用,Python并非全能,搭配其他工具会发挥更大的价值,我自己也有一些小项目是这样的组合。
这是官方的一个实例代码,稍加改造就可以达成目的了。
改造下
但其实很多情况下,都是需要等待Ajax执行完毕后才开始解析页面的内容,这时候可以使用官方提供的一个示例代码,利用这个函数,可以等待这个页面所有的请求都加载完毕之后再接着处理,那么你就可以获得完整加载的页面了,之后该干嘛干嘛了。
自己找数据接口咯
应该都是api接口生成的
使用selenium挖掘新碟榜例子:
结果:
今日營業中
周杰伦的床边故事
H.A.M.
3집 EX'ACT
野
Dangerous Woman
在一片黑暗之中
Last Year Was Complicated
chrome,按下F12,点击,查看request,很容易能找到URL和参数,自己构造就行,然后解析返回的内容。
index.html下又这行js引用。
打开这个js文件,就可以看到
打开chrome审查元素,在network里找js咯,一般名字比较特殊的那个js就可能是你要找的。比如这个,
最直接的就是用selenium