在前端开发过程中,我们经常需要和爬虫打交道,而有些网站为了防止爬虫的攻击,会设置验证码或者需要有一些特殊的 cookie 才能够访问,这就给爬虫带来了一定的难度。
而在使用 Node.js 进行爬虫开发时,可以使用 npm 包 cfscrape 来解决这种问题。cfscrape 可以让你在模拟浏览器获取网页内容时绕过 Cloudflare 等 CDN 保护。
本文将介绍如何使用 cfscrape 进行爬虫开发,并通过一些实例来加深对 cfscrape 的理解。
安装
使用 npm 安装:
npm i cfscrape --save
怎么用
使用 cfscrape 爬取网页的代码很简单,以下是一个简易的例子,由于技术文档库的 API 已禁止内容的爬取,此处仅作为示例:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------- - --------------------------- ----- ------- - ------------------- ----- -------- --------- - ----- ------- - ----- ------------------ ----- ------- - - ---- ------------------- -------- - ------------- ------------ -------- -- ----- ------ ---- ------------------ ------- ---- ------ -------------------- --------------- -- --------------- - ------ ------------------- -- ----- ----- ---------- ------ ------------------- ----- ------------------------ ----- ------ -------- -- ----- -------- - ----- ----------------- ----- - - -------------- -- ---- --- --- - ----------
代码中,我们引入了 cfscrape、request-promise 和 cheerio 三个模块,其中 cfscrape.create() 生成一个绕过 Cloudflare 等 CDN 保护的请求头,request-promise 用于发起 HTTP 请求,cheerio 用于解析 HTML DOM。
在 getPage 函数中,首先我们使用 await 等待 scraper 的生成并将其作为 agent 传入 options 请求头中。我们同时也定义了一些请求头信息,这些信息应该清楚地传递请求的来源,避免被屏蔽。在 options 的 transform 中,使用 cheerio 转化 HTML DOM,处理的是反馈数据的内容(response.body)。根据需要,我们可以进一步使用 $ 选择器来操作页面 DOM。
Q&A
cfscrape 能绕过哪些保护?
cfscrape 主要是针对 Cloudflare 这样的 CDN 保护设计的,包括 Cloudflare's "I'm Under Attack Mode"。
有哪些可选配置?
以下是在 options 中可以配置的一些选项:
- uri: 要请求的网址
- headers: 请求头信息
- transform: 用于处理响应的函数
- gzip: 网址提供 gzip 表压缩时,是否自动解压
- strictSSL: 是否严格检查证书
- followAllRedirects: 是否跟踪重定向。
- resolveWithFullResponse: 是否包含完整 HTTP 响应
- agent: 自定义请求 agent
怎样解决读取数据出现的问题?
有时候,在 requests.get() 中设置 keep_cookies 为 True 也无法让你读取数据,这时候可以使用 tornado.httpclient.HTTPClient.context 进行尝试。
对于大量数据,怎样进行分页读取?
对于大量数据,需要进行分页读取,可以通过给链接设置参数(如 offset、page 等),从而使链接逐渐递增以读取数据。如果分页较多,可以使用 async 完成分页读取,同时也可以使用 async 控制请求的流速,防止被网站识别成机器人。
结论
通过本文的介绍和示例,我们可以看出,cfscrape 是一个非常好用的 npm 包,可以让我们方便地绕过 CDN 等保护,实现数据爬取和分析。当然,我们也应该注意使用 cfscrape 的方法和技巧,以避免被网站识别为机器人。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600671d430d0927023822a03