npm (Node Package Manager) 是一个非常方便的 Node.js 包管理器,允许开发者通过简单的命令行界面来安装和管理个人或开源的代码包。其中一个常用的包就是 x-ray。x-ray 是一个基于 Node.js 的爬虫框架,使得开发者能够轻松地从网页中获取数据。然而,如果你经常使用 x-ray,你会发现有些网站返回的数据变化不居,毫无规则可言,这时候 x-ray 就显得有些无力。因此,这时候我们可以考虑使用 x-ray-http-cache 包,帮助我们缓存爬取结果,优化我们的爬取方案。
本篇文章将介绍如何安装和使用 x-ray-http-cache,同时分享更多的诀窍和技巧帮助你更好地使用 x-ray-http-cache 来构建自定义爬虫。
安装
首先,我们需要先安装 Node.js 和 npm,这个部分请自行查看相关资料。安装完毕后,我们在终端运行以下命令安装 x-ray 和 x-ray-http-cache:
npm install x-ray --save npm install x-ray-http-cache --save
使用
下面是一个简单的 x-ray 爬虫:
const Xray = require('x-ray'); const x = Xray(); x('https://google.com', 'title')(function(err, title) { console.log(title); });
这个爬虫可以在控制台输出 Google 的标题。现在,我们来修改代码,使用 x-ray-http-cache 缓存输出结果。x-ray-http-cache 通过类似于 Promise 的 resolve,省略了传统 x-ray callback 回调函数的使用。代码如下:
const Xray = require('x-ray'); const x = Xray().driver(require('x-ray-http-cache')({ ttl: 60 * 60 * 24 * 30 // 30 days })); x('https://google.com', 'title') .then(title => console.log(title)) .catch(err => console.log(err));
我们看到 Xray()
函数加上了 driver(require('x-ray-http-cache')({...}))
的调用,这个调用返回了一个新的 x-ray 实例。参数 { ttl: 60 * 60 * 24 * 30 }
表示输出结果将被缓存 30 天。我们可以通过传递一个可选的第二个参数来保存多个请求的缓存,并为它们设置不同的过期时间。
API
下面是 x-ray-http-cache 的 API:
xrayHttpCache(options)
返回一个 request
对象工厂函数,用于创建 http 请求 response
缓存器。选项需要包含 path
属性与 ttl
属性,定义缓存文件读取路径以及设置过期时间,如下所示:
const cache = require('x-ray-http-cache')(options); const xray = require('x-ray'); xray.driver(cache().driver());
注意:该模块通过文件读取与写入实现 http 请求 response
数据的缓存,这会导致我们无法支持 http2
协议的 request 对象。
cache.defaults(options)
使用默认选项创建实例。
cache(options)
返回包含单个的方法 driver
,该方法涵盖了所有 x-ray API,如下所示:
cache({ ttl: 86400 }) .driver({ ttl: 86400, refresh: false, methods: { url: 'get' } })
优化
减少缓存时间
你不应该设置一个过长的缓存时间,原因是该缓存数据迟早会过期无用,如果采用自动处理机制(时间和空间复杂度都很高),系统会不断地占用更多的空间,并在需要时花费更多的 CPU 时间来回收旧缓存。
因此,最好的缓存时间长度应该符合网站自身的数据总量与数据变化。过长或过短的时间长度都不合适,例如在 Google 的网站中缓存一年的数据没有任何意义,而缓存秒杀商品则需要非常短的时间,以保证及时更新。
使用多个请求缓存
在有些情况下,我们需要为不同的请求设置不同的缓存时间,这时候用默认的 ttl 并不能满足要求。你可以通过在定义 options.path
的时候使用一个通用缓存目录来实现这个目的。
手动清除缓存
当你在生产环境运行应用时,你可能会遇到网站更新的情况,如果缓存数据过期但没有及时过期,就会导致软件出现极大的偏差甚至错误。因此,我们需要手工清除缓存数据。
x-ray-http-cache 提供了方法可以手动清理您的缓存。他们分别是:
clear()
以默认的路径清除所有缓存。clearCacheForPath(path)
清除特定路径下的缓存。
自定义缓存路径
默认情况下,缓存数据会被写入 x-ray-http-cache 包目录下。但在多个应用程序之间使用该包时,你应该选择一个全局可写的配置文件中的缓存子目录,并将其作为 options.path
的一部分传递给 x-ray-http-cache。
const path = require('path'); const cache = require('x-ray-http-cache')({ path: '/run/cache/my-app' }); // xray configuration example xray('').driver(cache.driver({ path: path.join(opts.cacheDirectory, 'one-small-http-cache.bin') }));
示例代码
下面是一个复杂的示例代码,在这个示例中,我们将引入多个包,构建更加完整的爬虫。你可以根据自己的需要,选择适合自己的包,构建更加细致的爬虫。
-- -------------------- ---- ------- ----- ---- - ----------------- ----- ------- - ------------------- ----- ---- - ---------------- ----- -- - -------------------- ----- ----- - -------------------------- ----- ------ - ------------------ ----- - - ---------------------- ----- -- - -------------- ----- -------- - ---------------------- ----- ---------- - ------------------------- ----- ------ - ------------------------------ - ---------- ---------------------------------- ------------ ----- -------- - ------------ -- ---- -- - --------------- ------ -------------- ------ ------------------------------------------------------------- -------- -- ----------------------------------------- --------------------- ------------------- ------------------------------------------------- ---------------- -- ---------------------- --------------------------------------- ---------- -- ---------- -- -------------- --- -- - - ---- - ---------------- -------------------------------- --------------------------------- ------------ -- ------- --- ------- ---- ---- -------- -------- ------------ -- ----------------- - ---- -- ----- ------ - - ---------- -------------- -------------------- --------------- ----------------------- -------- -------------- ---------- --- -- ------------------------------------ ---- ---------- --- -- ---------------- ---------- ---- -- - ----------- -------- ----- ------ - -------------------------- - -- ------------------- --- ------- ------ ------------------------------ -- - -- -- --- ------------ - ------ --------- - ------ ----------------------------------- -- ------------ -- ---------------------------------------------------- ------------ -- --------------- ------------------------------ ----------- ---- -- ---------------------- ----- ------- -- ------------- --- -- ------------------------------------------------------- -- --------------------------------------- ---------------------- ------------ -- ---------- -- - ------------- ----- ------ ------------- ------------ ------ ----------------------------------- -------------- -- ------------ ---------------- ----------- ---- ------------------------ ---- -- ---------------- --- -- - --------------- ---------- ------ ----------- - ------ ------------- -- ------------ ------------- ------------- - ---------- - ----- ---- ----- - ---------- ----- -- ----------------- ------- -- - --------------- ----------- ----- --- - ---------------------------------------- ------- - ------------------------ ------- - ----------- ------ ------ ------------------------------------------- ---------------- -- - ------- - ----------------- ----------------------- ------------------ ----------- ------ ---------------------------------------------------- -- ------------ -- -------------------- ----------- -- - - ----- ---------------------- ---------------- ----- ----------------------- ----- -- -- - ----- ---------------------- ---------------- ----- --------------------------- -- - ----- ---------------------- ------------- ----- ------------------------------------------------ -- ------------------ - -- ------------- -- --- ---------------------- -- --------------------------- ----- ------------ ------------------------------------------------------ -- -- --------------------------------- ----- ------------ ----------- ---------- --- -- - -- ----- - ---------------------- - ---- - ----------------------- ------------------------------------ ----- ------------ ------------ - --------------- ------- -- --------- - -- ----- ---- - ------------------------- - ---- -------------------- ----- ---------------------- -- - ---- --------------------------- ----- ----------------------------- -- - ---- ---------------------- ----- ------------------------ -- - ---- ----------------------------- ----- ------------------------------- - -- -------------- -- ---------------------------------------------- -- - -- ------------------------------------- -------------------------- ----------- -- -- --- ----- -- --------------------- -- -- - -------------------- --------------- --- -------- --------------- - ------------- --- --- ------ -- ------ --- ------ -- -
结论
本篇文章介绍了 npm 包 x-ray-http-cache 的使用方法、优化技巧以及示例代码。希望这篇文章能帮助读者更好地认识和使用 x-ray-http-cache,提高爬虫的质量和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6006711b8dd3466f61ffe86b