Puppeteer拦截器在数据抓取中的使用

Puppeteer拦截器在数据抓取中的使用

Puppeteer提供的拦截器功能可以用来拦截请求,当访问页面时可以拦截无用请求,加快请求速度。

拦截器使用示例

下面是Puppeteer Api文档中关于拦截器的一个例子,下面针对这个例子说明相关问题及使用注意点。

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.setRequestInterception(true);
  page.on('request', interceptedRequest => {
    if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
      interceptedRequest.abort();
    else
      interceptedRequest.continue();
  });
  await page.goto('https://example.com');
  await browser.close();
});

拦截功能的使用需要在无头模式下才会生效,因此需要在启动的时候设置。

puppeteer.launch({
    headless: true,
    options: ['--proxy-server=' + proxy]
});

启动后设置启用拦截,随后对request事件监听。由于在请求发出前,就已经添加了要拦截的url,因此为了变更拦截参数,可以考虑拦截参数从配置中心读取或每次从请求参数中读取要拦截的请求。

page.setRequestInterception(true);
page.on('request', interceptedRequest => {
......
}

若对请求拦截调用

interceptedRequest.abort();

若放行请求则调用

 interceptedRequest.continue();

拦截过程中两个重要的方法

interceptedRequest.continue([overrides]);
interceptedRequest.respond(response);

这个两个方法很有意思,先看continue方法API定义。

continue方法定义

request.continue([overrides])
overrides Optional request overwrites, which can be one of the following:
url If set, the request url will be changed
method If set changes the request method (e.g. GET or POST)
postData If set changes the post data of request
headers If set changes the request HTTP headers

通过定义,我们能够对请求进行篡改,然后将篡改的请求发向目标。

interceptedRequest.continue({
postData: postData.replace("keyword=", "keyword=" + keyword) + "&currPage=" + p
});

respond方法定义

request.respond(response)
response Response that will fulfill this request
status Response status code, defaults to 200.
headers Optional response headers
contentType If set, equals to setting Content-Type response header
body <Buffer|string> Optional response body
returns:

有时整个请求结果必须用到某个子请求的响应,这时候我们可以使用request.respond(response)方法,可以实现快速返回的效果。例如请求某个链接,响应时间过长,我们可以利用这个方法快速返回一个兜底数据。加快整体请求过程。

await page.setRequestInterception(true);
page.on('request', request => {
  request.respond({
    status: 404,
    contentType: 'text/plain',
    body: 'Not Found!'
  });
});

小结

通过拦截器的功能及相关方法,可以加快请求、篡改数据、返回兜底结果,最终加快数据抓取或自动化测试的过程

参考

[1] puppeteer api doc,
https://github.com/GoogleChrome/puppeteer/blob/v1.8.0/docs/api.md#requestrespondresponse

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值