Cookies Apify:在RequestQueue中保留头

Cookies Apify:在RequestQueue中保留头,cookies,puppeteer,apify,Cookies,Puppeteer,Apify,我正试着和木偶师一起爬我们当地的合流装置。我的策略是首先登录,然后提取会话cookie并在开始url的头中使用它们。代码如下: 首先,我“用脚”登录以提取相关凭证: const Apify = require("apify"); const browser = await Apify.launchPuppeteer({sloMo: 500}); const page = await browser.newPage(); await page.goto('https://mycompany/co

我正试着和木偶师一起爬我们当地的合流装置。我的策略是首先登录,然后提取会话cookie并在开始url的头中使用它们。代码如下:

首先,我“用脚”登录以提取相关凭证:

const Apify = require("apify");

const browser = await Apify.launchPuppeteer({sloMo: 500});
const page = await browser.newPage();
await page.goto('https://mycompany/confluence/login.action');

await page.focus('input#os_username');
await page.keyboard.type('myusername');
await page.focus('input#os_password');
await page.keyboard.type('mypasswd');
await page.keyboard.press('Enter');
await page.waitForNavigation();

// Get cookies and close the login session
const cookies = await page.cookies();
browser.close();
const cookie_jsession = cookies.filter( cookie => {
    return cookie.name === "JSESSIONID"
})[0];
const cookie_crowdtoken = cookies.filter( cookie => {
    return cookie.name === "crowd.token_key"
})[0];

然后,我用准备好的请求头构建爬虫结构:

const startURL = {
    url: 'https://mycompany/confluence/index.action',
    method: 'GET',
    headers:
    {
        Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
        Cookie: `${cookie_jsession.name}=${cookie_jsession.value}; ${cookie_crowdtoken.name}=${cookie_crowdtoken.value}`,
    }
}

const requestQueue = await Apify.openRequestQueue();
await requestQueue.addRequest(new Apify.Request(startURL));
const pseudoUrls = [ new Apify.PseudoUrl('https://mycompany/confluence/[.*]')];

const crawler = new Apify.PuppeteerCrawler({
    launchPuppeteerOptions: {headless: false, sloMo: 500 },
    requestQueue,
    handlePageFunction: async ({ request, page }) => {

        const title = await page.title();

        console.log(`Title of ${request.url}: ${title}`);
        console.log(page.content());

        await Apify.utils.enqueueLinks({
            page,
            selector: 'a:not(.like-button)',
            pseudoUrls,
            requestQueue
        });

    },
    maxRequestsPerCrawl: 3,
    maxConcurrency: 10,
});

await crawler.run();

徒步登录和cookie提取似乎还可以(curlified请求工作得很好),但Confluence不接受通过Puppeter/headless chromium登录。看起来页眉不知怎么弄丢了


我做错了什么?

如果不先详细说明标题不起作用的原因,我建议在
puppetercrawler
选项中定义自定义
gotoFunction
,例如:

{
    // ...
    gotoFunction: async ({ request, page }) => {
        await page.setCookie(...cookies); // From page.cookies() earlier.
        return page.goto(request.url, { timeout: 60000 })
    }
}
这样,您就不需要进行解析,在每次加载页面之前,cookies将自动注入浏览器

需要注意的是,在使用无头浏览器时修改默认请求头不是一个好的做法,因为这可能会导致在某些站点上阻止将收到的头与已知浏览器指纹列表进行匹配

更新: 下面的部分不再相关,因为您现在可以使用
Request
类按预期覆盖标题


标题问题是一个涉及木偶演员的复杂问题。在ApifySDK中。不幸的是,通过
请求
对象重写头的方法目前在
PuppeterCrawler
中不起作用,所以这就是您失败的原因。

工作得很好,非常感谢!:)也为坏的做法暗示。