首页 > 解决方案 > Apify 网络爬虫忽略 URL 片段

问题描述

我有一个我想抓取的 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
  };
}

它适用于可以通过域或路径区分的 URL。但是,如果唯一的区别在于片段,则只处理第一个 URL,因为第二个 URL 被认为是重复的,因此被跳过。

我试过在第二行添加这段代码pageFunction

await context.enqueueRequest({
  url: context.request.url,
  keepUrlFragment: true,
});

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

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

标签: javascriptapify

解决方案


不幸的是,您现在不能keepUrlFragment直接在 startUrls 中设置。所以我建议根本不使用它们。您可以将它们作为数组传递给customData. 然后你可以使用像这样的页面功能和一个虚拟的 startUrlhttp://example.com和标签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
  }

}

推荐阅读