- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
pjscrape非常适合抓取,但是我很难弄清楚如何将参数传递给我的抓取器。
它采用配置文件的命令行参数,但我不确定我的配置函数/变量的范围是什么。
我希望每个域都有配置,包括基本 URL、选择器等,并构建一个能够从该配置中读取的有点通用的抓取器。
我该怎么做?
最佳答案
Pjscrape 将评估所有参数作为全局范围内的配置文件,您可以根据需要传入任意数量的配置文件。因此,在一个或多个文件中配置每个域的爬虫应该很简单。例如:
base_config.js
var myConfigs = [];
my_site.js
myConfigs.push({
title: 'My Site',
url: 'http://www.example.com',
scraper: 'div#my-site-info'
});
scraper.js
myConfigs.forEach(function(config) {
pjs.addSuite({
title: config.title,
url: config.url,
scraper: config.scraper
})
});
然后像这样调用:
~> phantomjs /path/to/pjscrape.js base_config.js my_site.js <...> scraper.js
这里棘手的部分是当你想使用 scraper 函数时,而不仅仅是选择器。 PhantomJS 在“沙盒”环境中运行抓取工具,该环境不能访问您的全局范围变量。所以这将不工作:
myConfigs.forEach(function(config) {
pjs.addSuite({
scraper: function() {
// will fail - config is undefined!
return $(config.selector).text();
}
})
});
这是一个微不足道的例子,但你明白了。 PhantomJS 现在原生支持将参数传递给 page.evaluate
,但这些还没有内置到 Pjscrape 中。基本上有两种方法可以解决这个问题:
始终处理不需要访问外部作用域的函数。因此每个站点配置文件都将指定完整的爬虫功能,而不仅仅是可插入变量。
使用 new Function("...")
创建您的爬虫,在您创建字符串时传入您的变量。这就是 Pjscrape 在幕后所做的,但公平的警告 - 除了最直接的情况外,它在所有情况下都会很快变得丑陋。我在这里使用的一种方法是使用 Function#toString
并传入参数。这可能看起来像这样:
function makeFunc(f, args) {
return new Function('return (' + f.toString() + ')' +
'.apply(null, ' + JSON.stringify(args) + ');');
}
myConfigs.forEach(function(config) {
pjs.addSuite({
scraper: makeFunc(function(selector) {
// works - config.selector is passed in as the "selector" arg
return $(selector).text();
}, [config.selector])
})
});
关于javascript - 如何将参数传递给 pjscrape?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871448/
我是一名优秀的程序员,十分优秀!