【发布时间】:2022-01-02 20:21:56
【问题描述】:
使用Apify,我正在尝试从需要登录的网站上抓取搜索结果:
- 获取登录页面以获取登录令牌(它是登录表单中的隐藏表单字段)
- 发出模拟登录的请求
- 在网站上运行搜索以了解搜索结果的页数
- 抓取搜索结果的每一页
我无法弄清楚如何在步骤 1-4 之间共享相同的 cookie(也称为会话)。我更喜欢在我的代码中进行清晰的分离,如下所示:
Apify.main(async () => {
await clearApifyCache();
// what should this code be to enable sharing sessions
// between each crawl step?
const context = ?????
const loginToken = await getLoginToken(context); // Step 1
await login(context, loginToken); // Step 2
const pageCount = await getPageCount(context); // Step 3
const results = await getJobList(context, pageCount); // Step 4
await Promise.all([writeCsv(results), writeHtml(results)]);
});
我可以将它构建得更像一个状态机,其中有一个 Apify.CheerioCrawler 实例,每个请求都会将下一个请求添加到 RequestQueue。我什至可以通过让handlePageFunction 遍历generator function 来模拟我想要的代码流。这可能是我接下来要尝试的。
但是有没有一种更简单的方法可以让我使用常规的async/await 来维护一个更简单的程序流程?好吧,如果不是,我只是想知道我是否错过了一种明显的方法来在同一爬虫的不同运行或不同爬虫实例之间共享会话状态。 FWIW,我只爬了大约 20 页,所以性能没什么大不了的。
【问题讨论】:
标签: web-scraping screen-scraping cheerio apify