【问题标题】:Puppeteer Ubereats.com form input doesn't workPuppeteer Ubereats.com 表单输入不起作用
【发布时间】:2020-07-10 21:55:59
【问题描述】:

我正在尝试使用 puppeteer 和 Google Cloud Functions 在 UberEats 上自动订购食物。但是填写表单位置并单击下一步将不起作用。我目前正在使用 Node.js 8 和 puppeteer 版本 2.1.1。

exports.main = (req, res) => {

const puppeteer = require('puppeteer');

let selector = 'button[class="c1 cg ch ci bb bc bd cj ch az ao aq bu aj c1 ck cl cm cn co"]';

async function run () {
    try {
        const browser = await puppeteer.launch({args: ['--no-sandbox']});
        const page = await browser.newPage();
        await page.goto("https://ubereats.com/nl");
        await page.waitFor('input[id="location-typeahead-home-input"]');
        await page.evaluate(() => {
            document.querySelector('input[id="location-typeahead-home-input"]').value = "Leuven";
            document.querySelector('selector').click();
        });
        await page.waitForSelector('div[class="f5 bc bd be ew bf b1 he"]');
        let element = await page.evaluate(() => {
            return document.querySelector('h2').innerText;
        })
        browser.close();
        return element;
    } catch (e) {
        return e;
    }
}

run()
.then(el => {
  res.set('Content-Type', 'text/html');
  res.status(200).send(el);
})
.catch(err => {
    console.error(err);
    res.status(500).send("An Error occured" + err);  
  })

};

网页抓取网页工作正常。运行此代码不会返回任何错误,只会返回一个空对象。

【问题讨论】:

  • 你试过用他们的api吗?

标签: node.js forms web-scraping google-cloud-functions puppeteer


【解决方案1】:

我已经想出了一个方法,虽然很老套,但如何做到这一点。我想这与 React 迟缓有关。无论如何,这是代码:

import { launch } from 'puppeteer';

main();

async function main() {
  try {
    const browser = await launch({
      headless: false,
    });
    const [page] = await browser.pages();
    await page.setUserAgent(
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
    );
    await page.goto('https://www.ubereats.com/nl');

    const inputSelector = '#location-typeahead-home-input';

    await page.waitForSelector(inputSelector);

    await page.waitFor(3000);

    await page.type(inputSelector, 'Leuven');

    await page.waitFor(3000);

    await page.click('button.c1');

    // rest of the code
  } catch (err) {
    // error handling
  }
}

【讨论】:

  • 这是解决方案,但不适用于谷歌云功能。但我认为 GCF 将无法执行此功能,因为它不会设置 UserAgent。我看到您将 headless 设置为 false,这可能意味着 UberEats 网站“可能正在寻找添加到 UA 字符串中的 Headless 并阻止它。或者他们可能正在使用一些技术来检测自动访问并阻止它。”不过还是谢谢你!
【解决方案2】:

我遇到了同样的问题,我想出了一个解决方案。至于为什么没有按下按钮,我不知道。但是,输入地址然后单击第一个地址建议是有效的。

这是我的代码:

const puppeteer = require('puppeteer');
async function start(){
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto("https://www.ubereats.com/ca")
    await page.type("#location-typeahead-home-input", "Address")
    await page.waitForSelector('#location-typeahead-home-item-0');
    await page.click("#location-typeahead-home-item-0")
    await page.waitForNavigation()

    console.log(page.url())
    await browser.close()
}

start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2018-02-13
    • 2021-11-23
    • 2012-06-19
    • 2023-04-02
    相关资源
    最近更新 更多