scraperjs, 一个完整的多功能的网页抓取器

分享于 

13分钟阅读

GitHub

  繁體 雙語
A complete and versatile web scraper.
  • 源代码名称:scraperjs
  • 源代码网址:http://www.github.com/ruipgil/scraperjs
  • scraperjs源代码文档
  • scraperjs源代码下载
  • Git URL:
    git://www.github.com/ruipgil/scraperjs.git
    Git Clone代码到本地:
    git clone http://www.github.com/ruipgil/scraperjs
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/ruipgil/scraperjs
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Scraperjs

    Build StatusDependency StatusCoverage StatusNPM versionInline docs

    Scraperjs是一个网络刮刀 MODULE,使抓取网络变得容易。

    安装

    
    npm install scraperjs
    
    
    
    

    如果你想测试( 这是可选的,需要使用 --save-dev 标记进行安装)

     
    grunt test
    
    
    
     

    如果你还没有安装 phantomjs插件,你将需要使用一些功能来安装。

    正在启动

    Scraperjs公开了两个不同的scraper

    • 这是一个收费为 ,但体积很小的StaticScraper,它不支持更复杂的场景,比如抓取动态内容。
    • 一个收费为 ,但允许你抓取动态内容,比如在浏览器控制台中。 这两种抓取器都公开了一个非常相似的类似的API,在抓取时有一些细微的差别。

    让我们 scrape 黑客新闻。

    试着找出不同之处。

    static-刮刀

    var scraperjs =require('scraperjs');scraperjs.StaticScraper.create('https://news.ycombinator.com/')
    . scrape(function($) {
     return$(".title a").map(function() {
     return$(this).text();
     }).get();
     })
    . then(function(news) {
     console.log(news);
     })

    scrape 承诺接收到一个将抓取页面并返回结果的函数,它只接受jQuery一个参数来抓取页面。 不过还是非常强大的它使用 cheerio 来完成场景背后的魔术。

    动态铲运机

    var scraperjs =require('scraperjs');scraperjs.DynamicScraper.create('https://news.ycombinator.com/')
    . scrape(function($) {
     return$(".title a").map(function() {
     return$(this).text();
     }).get();
     })
    . then(function(news) {
     console.log(news);
     })

    scrape 承诺接收到页面,只有在页面范围内使用动态刮板,抓取函数才是沙箱,scraping函数是沙箱,所以没有关闭功能 ! 这意味着,在你不能调用一个函数,这个函数没有在scraping函数inside定义。 此外,抓取函数的结果必须是 json序列化函数。 我们使用phantomjs插件来实现它,我们还向你注入 jQuery。

    然而,可以通过将json可以序列化数据传递给任何的scraper scraper。

    因此,抓取函数接收的变量,只对动态抓取器,硬编码,。

    给我看看 ! ( aka路线)

    为了更灵活的抓取和抓取网页有时我们需要浏览多个网站,我们不希望每一个可能的网址格式。 因为scraperjs提供了路由器类。

    示例

    var scraperjs =require('scraperjs'),
     router =newscraperjs.Router();
    router
    . otherwise(function(url) {
     console.log("Url '"+url+"' couldn't be routed.");
    });var path = {};router.on('https?://(www.)?youtube.com/watch/:id')
    . createStatic()
    . scrape(function($) {
     return$("a").map(function() {
     return$(this).attr("href");
     }).get();
     })
    . then(function(links, utils) {
     path[utils.params.id] = links
     })router.route("https://www.youtube.com/watch/YE7VzlLtp-4", function() {
     console.log("i'm done");
    });

    允许路径中参数的代码来自项目 Routes.js,关于格式化的路径的信息也在这里。

    API概述

    Scraperjs尽可能使用承诺。

    StaticScraper,DynamicScraper和 ScraperPromise

    因此,刮削器应该与ScraperPromise一起使用。 通过创建刮刀

    var scraperPromise =scraperjs.StaticScraper.create() // or DynamicScraper

    下面的承诺可以通过它,他们都返回一个刮板承诺,

    • onStatusCode(code:number, callback:function(utils:Object)) 当状态代码与代码相等时,执行回调,
    • onStatusCode(callback:function(code:number, utils:Object)) 在接收状态代码时执行回调。 回调接收当前状态代码,
    • delay(time:number, callback:function(last:?, utils:Object)) 通过时间( 以毫秒为单位) 延迟链的执行
    • timeout(time:number, callback:function(last:?, utils:Object)) 在( 以毫秒为单位) 之后执行回调函数,
    • then(lastResult:?, callback:function(last:?, utils:Object)) 在最后一个promise之后执行回调,
    • async(callback:function(last:?, done:function(result:?, err:?), utils)) 在调用 done 函数时,执行回调,停止承诺链,恢复它。 你可以提供传递给promise链的结果,或者是一个错误来触发捕获承诺,
    • catch(callback:function(error:Error, utils:Object)) 当出错时,执行回调,即使没有定义保证,错误阻止链的执行,
    • done(callback:function(last:?, utils:Object)) ,在,链的末尾执行回调,即使有错误,也始终执行这个回调,
    • get(url:string),向url发出一个简单的HTTP GET 请求。 每次刮板只能使用一次。
    • 在这里,使用 request(options:Object) 请求更复杂的HTTP请求,scraperjs使用请求,并且这个方法是一个简单的request.request() 封装。 每次刮板只能使用一次。
    • scrape(scrapeFn:function(...?), callback:function(result:?, utils:Object)=,.. .?) 将页面 scrapes,执行scrapeFn并将结果传递给回调。 使用StaticScraper时,scrapeFn接收一个用于抓取页面的jQuery函数。 使用DynamicScraper时,scrapeFn不会接收任何内容,只能返回一个类型的。 可以随意地将任意数量的参数传递给抓取函数。 可以省略回调,如果是的话,可以使用 then 保证或者 utils.lastReturn 在下一个保证中访问刮痕结果。

    所有回调函数都接收最后一个,参数,并且可以访问路由器的url参数。 链条也可以停止。

    DynamicScraper.create()
    . get("http://news.ycombinator.com")
    . then(function(_, utils) {
     utils.stop();
     // utils.params.paramName });

    promise链以声明了相同的顺序激发,但在收到有效响应和在接收到有效响应的情况下,除了在上面解释了 donecatch 之外,还将引发 fire。

    你还可以通过返回( 除了 promise timeout 之外,它将始终返回 undefined ) 之间的值在诺求之间获取值,并且可以通过 utils.lastReturn 访问。

    utils 对象

    你已经看到了传递给承诺的utils 对象,它为你的承诺提供了有用的信息和方法。 以下是你可以使用它的方法:

    • .lastResult,在最后一个promise中返回的值
    • .stop(),停止承诺链的功能,
    • .url,提供用于刮板的url,
    • .params,具有在路由器匹配 Pattern 中定义的参数的对象。
    一个更强大的DynamicScraper。

    当需要大量的DynamicScraper实例时,它的创建对资源非常重要,并且需要很多时间。 要使这个更轻松,你可以使用一个工厂插件,这将只创建一个实例,每个DynamicScraper都将请求一个页面来。 要使用它,你必须在创建任何DynamicSrcaper之前启动该工厂, scraperjs.DynamicScraper.startFactory() 然后在执行程序后关闭工厂 scraperjs.DynamicScraper.closeFactory() 要使抓取功能更加强大,你可以在页面中插入代码,

    var ds =scraperjs.DynamicScraper. create('http://news.ycombinator.com')
    . async(function(_, done, utils) {
     utils.scraper.inject(__dirname+'/path/to/code.js', function(err) {
     // in this case if there was an error won't fire catch promise.if(err) {
     done(err);
     } else {
     done();
     }
     });
     })
    . scrape(function() {
     returnfunctionInTheCodeInjected();
     })
    . then(function(result) {
     console.log(result);
     });
    路由器

    路由器应该像一个类一样被初始化

    var router =newscraperjs.Router(options);

    options对象是可选的,这些选项是:

    • 如果第一个路径匹配,则为布尔型,如果路由将停止,则默认为 false。

    可以通过它来完成以下承诺

    • on(path:string|RegExp|function(url:string)) 对 MATCH url或者正则表达式进行承诺,也可以使用函数接受或者不通过传递的url。 在保证之后,get 或者 requestcreateStatic 或者 createDynamic的承诺是必需的。
    • get(),使用一个简单的HTTP请求请求页面匹配,
    • 使用这里方法,页面匹配将请求更复杂的HTTP请求,scraperjs使用请求 MODULE,并且这里方法是 request.request()的简单包装,
    • 如果你想用一个rake抓取匹配页面,这将返回 ScraperPromise,所以从现在开始的任何承诺都将通过StaticScraper的一个ScraperPromise进行。 此外,刮板的done 承诺将不可用。
    • 如果你想将动态抓取器用于抓取匹配页面,则返回,因此从现在开始的任何承诺都将通过DynamicScraper的一个ScraperPromise进行。 此外,刮板的done 承诺将不可用。
    • route(url:string, callback:function(boolean)) 通过所有匹配路径路由 url,执行时调用回调,如果路由成功,则传递 true,否则返回 false。
    • use(scraperInstance:ScraperPromise) 使用已经实例化的ScraperPromise。
    • otherwise(callback:function(url:string)) 如果路由url没有 MATCH,则执行回调函数。
    • catch(callback:function(url:string, error:Error)) 当你在路由范围中发生错误时执行回调,而不是在任何刮板上执行,因为你应该使用scraper的catch 承诺。
    注释
    • 使用 fetches获取文档,然后使用DynamicScraper使用 phantom setContent() 来设置页面对象的主体。 这将导致与直接加载PhantomJS中的URL相比,对网页进行细微不同的处理。
    更多

    检查示例测试或者只是深入代码,它很有文档性,很容易理解。

    依赖项

    如上所述,scraperjs使用一些依赖性来完成重大工作,例如

    许可证

    这个项目是在 MIT的许可下。


    COM  WEB  Complete  Scrape  Scraper  
    相关文章