我想使用 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) 我刚刚开始学习 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">
<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) 我想让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)
但我收到这个错误:
Run Code Online (Sandbox Code Playgroud)await page.click(`.postab-container li:nth-of-type(${ index + 1 }) a`) ^^^^ SyntaxError: Unexpected identifier
看来这个forEach声明是混乱的page。
这样做的正确方法是什么?
我正在开始使用 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})();\nRun Code Online (Sandbox Code Playgroud)\n\n这主要是有效的。该脚本似乎执行到:
\n\nconst data = await page.evaluate(() => document.querySelectorAll(TABLE_ROW_SELECTOR));\nRun Code Online (Sandbox Code Playgroud)\n\n它在标题中给出了错误。上面的屏幕截图没有显示屏幕截图位置下方的表格。当我进入
\n\ndocument.querySelectorAll(TABLE_ROW_SELECTOR));\nRun Code Online (Sandbox Code Playgroud)\n\n进入 devtools 控制台,我得到了预期的 html。我究竟做错了什么?
\n\n编辑:
\n\n在我的控制台中,我看到一个对象列表,但据我所知,没有任何值。这是第一个对象
\n\n0:Object {}\n__proto__:Object {constructor: , __defineGetter__: , …Run Code Online (Sandbox Code Playgroud) 我需要让我的 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. 我应该将数组分成两半然后对每个数组使用评估函数吗?
我正在使用 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) 我试图单击此按钮,但我一直失败,因为还有另一个具有相同类名但不同的类名的按钮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,并且能够获取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) 我正在尝试使用 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) 最近,我从 .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”功能但是如何呢?