javascript - 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
设置keepUrlFragment
to之外,还有其他方法true
吗?
解决方案
不幸的是,您现在不能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
}
}
推荐阅读
- jestjs - 使用 Jest 进行测试时使用 Spectron 来“模拟”Electron
- php - 在 PHP 中生成 Paseto V2 公钥/令牌,在 Node.js 中验证
- python - 在 Flask-wtforms 中修剪空白
- html - 404 错误:为 GitHub 页面提供 index.html 文件
- php - php 类定位器或类路由
- alloy - 使用所有已定义关系的子集
- javascript - ReactJS - UseRef,而不是 useState,来替换 props
- php - 警告:mysqli_fetch_assoc() 期望参数 1 是 mysqli_result 而查询工作
- struct - MQL4 结构包含指向其他结构的地址
- c# - 如何停止 Selenium 以允许手动验证码解析?