Apify 网络抓取工具忽略 URL 片段

Apify web scraper ignoring URL Fragment

我有一个要抓取的 URL 列表,所以我把它放到 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
  };
}

它与 URLs 一起工作正常,可以用域或路径来区分。但如果唯一的区别在于片段,则只有第一个 URL 被处理,因为第二个 URL 被认为是重复的,因此被跳过。

我试过在 pageFunction

的第二行添加这段代码
await context.enqueueRequest({
  url: context.request.url,
  keepUrlFragment: true,
});

但这会导致另一个问题,即它会为每个 URL.

产生重复的结果

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

很遗憾,您现在无法直接在 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
  }

}