验证网页抓取工具,忽略URL片段

时间:2019-07-07 22:26:43

标签: javascript apify

我有一个要抓取的网址列表,因此我将其放入startUrls

"startUrls": [
    {
      "url": "https://www.example.com/sample#000000",
      "method": "GET"
    },
    {
      "url": "https://www.example.com/sample#111111",
      "method": "GET"
    }
  ]

这是我的pageFunction代码的摘录。

async function pageFunction(context) {
  const { request } = context;
  var name;
  try {
     name = document.querySelector('h1').textContent;
  } catch (e) {
     name = "null";
  }
  return {
     link: request.url,
     name
  };
}

它可以与域或路径进行区分的URL很好地配合使用。但是,如果唯一的区别在于片段,则仅处理第一个URL,因为第二个URL被视为重复,因此被跳过。

我尝试将这段代码添加到pageFunction

的第二行
await context.enqueueRequest({
  url: context.request.url,
  keepUrlFragment: true,
});

但这会导致另一个问题,即每个URL产生重复的结果。

那我应该怎么做才能使它正常工作?除了调用enqueueRequestkeepUrlFragment设置为true之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

很遗憾,现在您不能直接在startUrls中设置keepUrlFragment。因此,我建议完全不使用它们。您可以改为将它们作为数组传递到customData中。然后,您可以将这样的页面功能与http://example.com之类的虚拟startUrl和标签START

一起使用
async function pageFunction(context) {
  const { request, customData } = context;
  if (request.userData.label === 'START') {
     for (const url of customData) {
        await context.enqueueRequest({
          url,
          keepUrlFragment: true,
        });  
     }
  } else {
     // Your main scraping logic here
  }

}