更新
我遇到的问题可以在 Chrome 中重现,无需使用 puppeteer。我可以在浏览器中看到文本,但无法通过 JavaScript 控制台访问数据。
原创
Facebook 隐私设置页面有从浏览器可见的选项,我可以检查它们。问题是 document.querySelector 的值为 null。
这是网址: https://www.facebook.com/settings
这是代码
const el = await page.$x(
'/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div/ul/li[1]/div/div/ul/li[1]/a/span[3]/div/div[2]'
);
const v = await page.evaluate((div) => div.textContent, el[0]);
我也尝试过使用 JS Path
const v = await page.evaluate(
() =>
(<HTMLElement>(
document.querySelector(
'#u_fetchstream_2_4 > li:nth-child(1) > div > div > ul > li:nth-child(1) > a > span.fbSettingsListItemContent.fcg > div > div._nlm.fwb'
)
)).innerText
);
总是出现以下错误:
Error: Evaluation failed: TypeError: Cannot read property 'innerText' of null
我已经确认该属性为空,直到我右键单击检查页面上的任何值 - 机器人检测仍然显示该页面?!
还尝试在 Chrome 的控制台中使用 xpath:
$x('//*[text()="Who can see your future posts?"]')
返回[]
最佳答案
您很有可能尝试在不同的视口(viewport)尺寸中打开 URL。此类问题发生在响应式网站中,其中选择器与您在浏览器中选择它们的方式非常不同。
最简单的方法是禁用默认的 800x600 分辨率并打开 headful 模式,这样您就可以看到发生了什么以及可能失败的原因。
const browser = await puppeteer.launch({defaultViewport: null, headless: false});
至于解封,facebook等大公司确实不希望你去扒。因此,您需要结合使用良好的代理、用户代理并保持在雷达之下。
您可以尝试隐身插件,它将尝试一些解锁技术。
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
免责声明:强烈建议使用 Facebook 虚拟帐户以避免被禁止。他们真的不喜欢他们平台上的机器人。
关于facebook - Puppeteer 在 Facebook 设置页面上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62762232/