木偶登录到Instagram

时间:2018-10-24 20:02:55

标签: javascript node.js web-scraping puppeteer headless-browser

我正在尝试使用Puppeteer登录到Instagram,但由于某种原因我无法做到这一点。

你能帮我吗?

这是我正在使用的链接:

https://www.instagram.com/accounts/login/

我尝试了不同的东西。我尝试的最后一个代码是:

const puppeteer = require('puppeteer');

(async() => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.instagram.com/accounts/login/');
await page.evaluate();

await afterJS.type('#f29d14ae75303cc', 'username');

await afterJS.type('#f13459e80cdd114', 'password');

await page.pdf({path: 'page.pdf', format: 'A4'});

await browser.close();
})();

谢谢!

2 个答案:

答案 0 :(得分:2)

好的,您走在正确的轨道上,但只需要更改一些内容即可。

  • 首先,我不知道您的afterJS变量来自何处?无论哪种方式,您都不需要它。
  • 您要在usernamepassword输入字段中键入数据,但不要求puppeteer实际单击登录按钮来完成登录过程。
  • page.evaluate()用于在页面上下文内(即,在远程浏览器中加载的网页上)执行JavaScript代码。因此,您无需在这里使用它。

我会将您的代码重构为如下所示:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.instagram.com/accounts/login/');
  await page.waitForSelector('input[name="username"]');
  await page.type('input[name="username"]', 'username');
  await page.type('input[name="password"]', 'password');
  await page.click('button[type="submit"]');
  // Add a wait for some selector on the home page to load to ensure the next step works correctly
  await page.pdf({path: 'page.pdf', format: 'A4'});
  await browser.close();
})();

希望这为您设置了进入登录页面的正确路径!

更新1:
您曾经询问过要在Instagram上解析元素的文本...不幸的是,我本人没有帐户,因此无法真正为您提供确切的解决方案,但希望它仍然可以证明某些价值。

所以您要评估元素文本,对不对?您可以按照以下步骤进行操作:

const text = await page.$eval(cssSelector, (element) => {
  return element.textContent;
});

您要做的就是将cssSelector替换为您希望从中检索文本的元素的选择器。

更新2:
好的,最后,您已询问有关向下滚动到父元素内的元素的问题。我不会从别人那里窃取信用,所以这是答案:

How to scroll to an element inside a div?

您要做的基本上是按照那里的说明进行操作,使其类似于puppeteer,如下所示:

await page.evaluate(() => {
  const lastLink = document.querySelectorAll('h3 > a')[2];
  const topPos = lastLink.offsetTop;

  const parentDiv = document.querySelector('div[class*="eo2As"]');
  parentDiv.scrollTop = topPos;      
});

请记住,我尚未测试该代码-我只是直接按照提供的URL中的答案进行操作。应该可以!

答案 1 :(得分:0)

您可以使用以下示例代码登录Instagram:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page    = await browser.newPage();

  // Wait until page has loaded

  await page.goto('https://www.instagram.com/accounts/login/', {
    waitUntil: 'networkidle0'
  });

  // Wait for log in form

  await Promise.all([
    page.waitForSelector('[name="username"]'),
    page.waitForSelector('[name="password"]'),
    page.waitForSelector('[name="submit"]')
  ]);

  // Enter username and password

  await page.type('[name="username"]', 'username');
  await page.type('[name="password"]', 'password');

  // Submit log in credentials and wait for navigation

  await Promise.all([
    page.click('[type="submit"]'),
    page.waitForNavigation({
      waitUntil: 'networkidle0'
    })
  ]);

  // Download PDF

  await page.pdf({
    path: 'page.pdf',
    format: 'A4'
  });

  await browser.close();
})();