gpt4 book ai didi

javascript - 如何将参数传递给 pjscrape?

转载 作者:行者123 更新时间:2023-11-29 18:25:32 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com