抓取页面 - 一个部分未使用 cheerio 加载
Scraping a page - one section isn't loaded using cheerio
我正在用欢呼和流星刮一个社交网络。我可以登录,搜索一些信息并在页面上抓取我想要的信息。我正在提出请求并将 html 传递给欢呼,例如 刮流星.js.
问题是,页面的某些部分仅在我通过Web浏览器加载页面时才显示:
在浏览器中:
<div A>
<div B>
<ul (...)>
<li (...)>...</li>
...
<li (...)>...</li>
</ul>
</div> <-- end B -->
<script id="NAME_1" type="fs/embed+m"></script>
<script type="text/javascript">fs.dupeXHR("NAME_1","NAME_2",{"renderControl":"custom","templateId":"NAME_1"});</script>
</div> <-- end A -->
In console.log(cherio.load(html)):
<div A>
<script id="NAME_1" type="fs/embed+m"></script>
<script type="text/javascript">fs.dupeXHR("NAME_1","NAME_2",{"renderControl":"custom","templateId":"NAME_1"});</script>
</div> <-- end A -->
我假设 html 是由 cheerio 加载的,而无需执行脚本。我说的对吗?如果是这样,有没有办法让 cheerio 执行脚本,以便我可以在放置内容后抓取页面?
我使用以下选项发出 http 请求来模拟浏览器请求,所以我认为这不是请求本身的问题(无头浏览器不会让它变得更好)。
Options = function (cookie) {
this.headers = {
"Accept": "*/*",
"Connection": "keep-alive",
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36"
};
this.params = {};
if (cookie) {
this.headers.Cookie = cookie.get();
}
};
在抓取时需要考虑一些事情。
现代网站正在使用较新的框架,如Angular,EmberJS,这些网站HTML使用Javascript渲染(右键单击浏览器窗口,然后单击View Page source
,你会看到没有任何HTML的裸html)
Meteor应用程序也是如此。
因此,对于这些类型,您需要使用PhantomJS或ZombieJS等无头浏览器来获取HTML内容并将其用于抓取
希望这有帮助
好吧,做了一些逆向工程,发现可以通过使用相同的标题选项等向另一个页面发出请求来检索卸载的部分。虽然流星.js使用节点.js幕后,也许答案是正确的,这不能按照我认为的方式完成。谁知道 (:
你是对的,你的方法只获取 HTML,而不模拟 JavaScript。要实现您想要的,请考虑使用 CasperJS 或 PhantomJS 等包。以下是一些如何执行此操作的示例:
var phantomjs = Npm.require('phantomjs');
var spawn = Npm.require('child_process').spawn;
Meteor.methods({
runTest: function(options){
command = spawn(phantomjs.path, ['assets/app/phantomDriver.js']);
command.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
command.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
command.on('exit', function (code) {
console.log('child process exited with code ' + code);
});
}
});
var page = require('webpage').create();
page.open('http://github.com/', function() {
console.log('Page Loaded');
page.render('github.png');
phantom.exit();
});
引用:
http://www.meteorpedia.com/read/PhantomJS
https://atmospherejs.com/gadicohen/phantomjs
- $rootScope未使用forEach进行更新
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- 无法在现有状态转换期间更新-未使用任何非法的setState()
- 角度控制器未使用OcLazyLoad和ngRoute加载
- 绑定到 x 可编辑的成功函数未使用正确的参数执行
- 使用jQuery将单击绑定到页面中未使用的部分
- 未使用Javascript在IE中设置Cookie
- Ionic:AngularJS变量未使用$scope更新DOM
- 元素未使用当前玩家操作进行更新
- 将方法从控制器注入到未使用右变量调用的指令
- 是否可以在尚未附加到DOM的元素中创建一个sparkline(使用jquery.sparkline插件)
- getDataAsJSON()在PHP中是一个未定义的函数,但许多解释如何使用JSONP的网站都说要使用它
- 使用jQuery'在数组中循环;s中的每一个都会在生成字符串时在开头产生一个未定义的值
- 如果定义了值,为什么会得到一个未定义的值?使用 eval()
- 如果我在 Filter() 函数中使用索引,我会得到一个未定义的引用错误吗?
- addEventListener 使用 for 循环给了我一个未定义的结果
- 抓取页面 - 一个部分未使用 cheerio 加载
- add()生成两个选项卡,其中一个处于奇数位置,为空且未使用
- 最后一个未使用async调用的回调
- JsHint,我可以在函数定义中针对所有未使用的参数,而不仅仅是最后一个