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.
产生重复的结果
那么我应该怎么做才能使它正常工作呢?除了调用 enqueueRequest
将 keepUrlFragment
设置为 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
}
}
我有一个要抓取的 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.
产生重复的结果那么我应该怎么做才能使它正常工作呢?除了调用 enqueueRequest
将 keepUrlFragment
设置为 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
}
}