标签: puppeteer

puppeteer - page.type() 不起作用,但 element.setAttribute() 起作用?

我想使用 Puppeteer 在输入字段中输入一个值。根据文档,这似乎很简单(文档中的示例):

await page.type('#mytextarea', 'Hello'); // Types instantly
await page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
Run Code Online (Sandbox Code Playgroud)

所以我创建了以下测试脚本:

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch({headless: false}); // devtools: true
  const page = await browser.newPage();
  await page.goto('https://mycoolsite/index.html');

  page.on('console', msg => console.log(new Date().toISOString() + ' ' + msg._text));

  const selector = '#barcode';
  await page.waitForSelector(selector);
  await page.type(selector, "1234");

})();
Run Code Online (Sandbox Code Playgroud)

它一直工作到 page.type() 行。意思是,它启动一个 Chromium 实例,转到正确的 URL,在日志中显示控制台的预期输出。但不在字段中键入值。我在节点输出或浏览器控制台输出中没有看到任何错误。

为了排除静默失败,我将选择器名称更改为不存在的名称(例如“#qwertyuiop”),并按预期失败。

await page.type(selector, "1234");如果我用以下内容替换该行,我找到了解决方法:

  const element …
Run Code Online (Sandbox Code Playgroud)

puppeteer

2
推荐指数
1
解决办法
9848
查看次数

如何在 NODE 服务器上使用 Puppeteer 并在前端 HTML 页面上获取结果?

我刚刚开始学习 Node 和 Puppeteer,所以提前原谅我是个菜鸟。

我的 index.html 页面上有一个简单的表单,我希望它从运行 Puppeteer 的 NODE 服务器上的函数返回 Instagram 个人资料的图像。在下面的代码中有一个 Index.HTML 文件和一个 Index.JS 文件,在 Index.HTML 文件中,单击按钮时,我只想使用传入用户名并运行该函数的 AJAX 请求来调用服务器在服务器上,将结果返回到 HTML 文件并将响应文本放入 .images div (我可以稍后分割结果并渲染 img 标签)

我有几个问题:

1:我正在 VSC 中使用 liveserver 插件运行 server.js,并且它正在运行该文件,http://127.0.0.1:5500/12_Puppeteer/12-scraping-instagram/index.js现在是端点吗?那么如何将用户名传递给服务器函数。在标头或网址中?能给我看看么?

2:在 Index.HTML 文件中的 AJAX 请求中,需要什么请求才能将用户名传递到服务器scrapeImages(username)函数并获取返回的内容?

这是我在 index.html 文件中尝试过的:

       <body>
            <form>
                Username: <input type="text" id="username">&nbsp;&nbsp;
                <button id="clickMe" type="button" value="clickme" onclick="scrape(username.value);">
                Scrape Account Images</button>
            </form>

            <div class="images">
            </div>
        </body>

        <script>
            function scrape() {
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function() { …
Run Code Online (Sandbox Code Playgroud)

javascript ajax puppeteer

2
推荐指数
1
解决办法
4418
查看次数

如何在 forEach 循环中使用 Puppeteer 的 page.click ?

我想让Puppeteer根据名为 的数组中的项目数单击一些选项卡tabs

;(async () => {
  const browser = await puppeteer.launch({
    headless: true
  })   

  const page = await browser.newPage()
  await page.goto(`https://www.example.com`)

  const tabs = ['tab1', 'tab2', 'tab3']

  tabs.forEach((tab, index) => {
    await page.click(`.postab-container li:nth-of-type(${ index + 1 }) a`)
  })
})()
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

await page.click(`.postab-container li:nth-of-type(${ index + 1 }) a`)
      ^^^^

SyntaxError: Unexpected identifier
Run Code Online (Sandbox Code Playgroud)

看来这个forEach声明是混乱的page

这样做的正确方法是什么?

javascript node.js puppeteer

2
推荐指数
1
解决办法
3794
查看次数

Pupeteer - 错误:评估失败:ReferenceError:TABLE_ROW_SELECTOR 未定义

在此输入图像描述

\n\n

我正在开始使用 pupeteer 和 node 并使用 vscode。我正在尝试登录网站并抓取表格。到目前为止我有:

\n\n
(async () => {\n\nconst browser = await puppeteer.launch({\n  headless: false,\n});\nvar page = await browser.newPage();\nawait page.goto(\'thesite.com/login/\');\n\nawait page.click(USERNAME_SELECTOR);\n\nawait page.keyboard.type(CREDS.username);\n\nawait page.click(PASSWORD_SELECTOR);\nawait page.keyboard.type(CREDS.password);\n\nawait page.click(BUTTON_SELECTOR);\nawait page.waitForNavigation();\n\nconst TABLE_ROW_SELECTOR = \'.gv-container.gv-container-133 > table > tbody\';\nawait page.waitForSelector(TABLE_ROW_SELECTOR);\n\nawait page.waitForSelector(TABLE_ROW_SELECTOR);\n\n\nawait page.screenshot({ path: \'example.png\' });  \nconst data = await page.evaluate(() => document.querySelectorAll(TABLE_ROW_SELECTOR));\n\n\n\n\nawait browser.close();\n})();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这主要是有效的。该脚本似乎执行到:

\n\n
const data = await page.evaluate(() => document.querySelectorAll(TABLE_ROW_SELECTOR));\n
Run Code Online (Sandbox Code Playgroud)\n\n

它在标题中给出了错误。上面的屏幕截图没有显示屏幕截图位置下方的表格。当我进入

\n\n
document.querySelectorAll(TABLE_ROW_SELECTOR));\n
Run Code Online (Sandbox Code Playgroud)\n\n

进入 devtools 控制台,我得到了预期的 html。我究竟做错了什么?

\n\n

编辑:

\n\n

在我的控制台中,我看到一个对象列表,但据我所知,没有任何值。这是第一个对象

\n\n
0:Object {}\n__proto__:Object {constructor: , __defineGetter__: , …
Run Code Online (Sandbox Code Playgroud)

javascript node.js visual-studio-code puppeteer

2
推荐指数
1
解决办法
2904
查看次数

让 Puppeteer 同时访问不同的链接

我需要让我的 api 能够更快地抓取 URL 列表。现在,我一次转到每一页并将数据添加到数组中。我需要一次打开多个链接并将从中获取的数据添加到同一个数组中。

这是我的代码:

var videos = [];
        for(var i = 0; i < profile.videoLinks.length; i++){
            await page.goto(profile.videoLinks[i].video, {
                // waitUntil: 'load'
            });
            await page.waitForSelector('.music-info')
            var vidInfo = await page.evaluate(() => {
                const vidTitle = document.querySelector('.video-meta-title').innerText;
                const musicInfo = document.querySelector('.music-info').innerText;
                const musicLink = document.querySelector('.music-info a').href;
                const likes = document.querySelector('.like-text').innerText;
                const comments = document.querySelector('.comment-text').innerText;

                return {
                    vidTitle,
                    musicInfo,
                    musicLink,
                    likes,
                    comments
                }
            })
            videos.push(vidInfo);
Run Code Online (Sandbox Code Playgroud)

现在,我的链接数组位于profile.videoLinks[ ].video. 我应该将数组分成两半然后对每个数组使用评估函数吗?

javascript node.js web-scraping puppeteer

2
推荐指数
1
解决办法
1081
查看次数

使用 Puppeteer 和 Node 从 DOM 中选择元素

我正在使用 Node 和 Puppeteer 从网页中抓取一些信息,但在选择正确的元素时遇到问题。

这描述了确切的情况。我只想选择始终位于第一个子项中的“Hello”文本。唯一的区别是,大约有 50 个与此完全相同的 DOM,我想选择其中每个的“Hello”。

<span class='first'>
<span class='second'>
    <span class='third'>
        <span>
            <a class='forth'>Hello</a>
        </span>
    </span>
</span>

<span class='second'>
    <span class='third'>
        <span>
            <a class='forth'>Some text</a>
        </span>
    </span>
</span>

<span class='second'>
    <span class='third'>
        <span>
            <a class='forth'>Different text</a>
        </span>
    </span>
</span>
Run Code Online (Sandbox Code Playgroud)

javascript node.js selectors-api puppeteer

2
推荐指数
1
解决办法
3791
查看次数

如何在 puppeteer js 中选择具有多个类名和特定 aria-label 的按钮?

我试图单击此按钮,但我一直失败,因为还有另一个具有相同类名但不同的类名的按钮aria-name,或者我只是错误地单击了它。

<button aria-label="upvote" aria-pressed="false" class="voteButton _2m5vzALl8kQdr9kwIFUo5t" data-click-id="upvote"><span class="_3wVayy5JvIMI67DheMYra2 _3SUsITjKNQ7Tp0Wi2jGxIM _22nWXKAY6OzAfK5GcUqWV2 qW0l8Af61EP35WIG6vnGk _3edNsMs0PNfyQYofMNVhsG"><i class="icon icon-upvote _2Jxk822qXs4DaXwsN7yyHA _39UOLMgvssWenwbRxz_iEn"></i></span></button>
Run Code Online (Sandbox Code Playgroud)

我的代码现在看起来像这样:

  await page.waitForSelector('.voteButton._2m5vzALl8kQdr9kwIFUo5t');
  await page.click('.voteButton._2m5vzALl8kQdr9kwIFUo5t');
Run Code Online (Sandbox Code Playgroud)

如何单击专门用于aria-labelor的元素data-click-id

puppeteer

2
推荐指数
1
解决办法
3860
查看次数

Puppeteer - 如何删除脚本标签

我一直在研究 Puppeteer,并且能够获取innerHTML,但是,这也可能包含<script>我想要删除的内容。

我该如何实现这一目标?

const browser = await puppeteer.launch();

const page = await browser.newPage();
await page.goto('https://www.example.com');

console.log(await page.evaluate(() => document.body.innerHTML));
Run Code Online (Sandbox Code Playgroud)

javascript node.js puppeteer

2
推荐指数
1
解决办法
1729
查看次数

Node.js:傀儡焦点()函数

我正在尝试使用 puppeteer 登录该网站,然后在登录后使用其他一些东西。连接到网站成功,但我在功能 focus() 方面遇到问题。它需要一个选择器作为参数,但插入一个后,它显示一个错误(选择器很好,因为我在站点的控制台中运行了 document.querySelector("input.login-field") 并返回了这个:) <input class="login-field" type="text" inputmode="email" autocapitalize="none" name="m" placeholder="Email or username" value="">。有什么问题?

这是我的代码:

const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({headless: false, slowMo: 25});

const page = await browser.newPage();
await page.goto("site");
await page.focus("input.login-field");
await page.keyboard.type("information");
await browser.close();

})();
Run Code Online (Sandbox Code Playgroud)

javascript node.js web puppeteer

2
推荐指数
1
解决办法
1万
查看次数

Puppeteer 随机用户代理参数

最近,我从 .json 文件中询问了这个随机用户代理,但问题是,在我添加了 puppeteer 的“捕获屏幕”后,它一直显示无头镶边,所以我将上一个主题答案复制到了错误的位置。

现在真正的useragent js页面来自这个页面:

const browser = await puppeteer.launch({
headless: false,
args: ['--headless', '--disable-infobars', '--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', '--no-sandbox', `--proxy-server=socks5://127.0.0.1:${port}`] : ['--no-sandbox'],
Run Code Online (Sandbox Code Playgroud)

});

那么如何在参数中创建 rnadom 列表呢?我之前的帮助对我不起作用,因为随机用户代理代码不在正确的位置:Puppeteer browser useragent list

但是在其中添加该代码是行不通的。

那么之后--user-agent=我想添加“ random”功能但是如何呢?

random user-agent puppeteer

2
推荐指数
1
解决办法
7008
查看次数