- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 ebay 抓取产品并在 amazon 上打开它们。
到目前为止,我已经在亚马逊上搜索了它们,但我正在努力从搜索结果中选择产品。
目前它输出一个空白数组,我不确定为什么。在没有 grabTitles 和 for 循环的单独脚本中进行了测试。所以我猜这里面有什么东西导致了问题。
我在这里遗漏了什么阻止数据返回 prodResults 的东西吗?
const puppeteer = require('puppeteer');
const URL = "https://www.amazon.co.uk/";
const selectors = {
searchBox: '#twotabsearchtextbox',
productLinks: 'span.a-size-base-plus.a-color-base.a-text-normal',
productTitle: '#productTitle'
};
(async() => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto('https://www.ebay.co.uk/sch/jmp_supplies/m.html?_trkparms=folent%3Ajmp_supplies%7Cfolenttp%3A1&rt=nc&_trksid=p2046732.m1684');
//Get product titles from ebay
const grabTitles = await page.evaluate(() => {
const itemTitles = document.querySelectorAll('#e1-11 > #ResultSetItems > #ListViewInner > li > .lvtitle > .vip');
var items = []
itemTitles.forEach((tag) => {
items.push(tag.innerText)
})
return items
})
//Search for the products on amazon in a new tab for each product
for (i = 0; i < grabTitles.length; i++) {
const page = await browser.newPage();
await page.goto(URL)
await page.type(selectors.searchBox, grabTitles[i++])
await page.keyboard.press('Enter');
//get product titles from amazon search results
const prodResults = await page.evaluate(() => {
const prodTitles = document.querySelectorAll('span.a-size-medium.a-color-base.a-text-normal');
let results = []
prodTitles.forEach((tag) => {
results.push(tag.innerText)
})
return results
})
console.log(prodResults)
}
})()
最佳答案
脚本有一些潜在的问题:
await page.keyboard.press('Enter');
触发导航,但您的代码从不等待导航完成后再尝试选择结果元素。使用 waitForNavigation
、waitForSelector
或 waitForFunction
(不是 waitForTimeout
)。
如果您确实等待导航,则需要使用 Promise.all
的特殊模式来避免竞争条件,如 docs 所示。 .
此外,您可以通过自己构建字符串直接转到搜索 URL,从而跳过页面加载。这应该会提供显着的加速。
您的代码为每个需要处理的项目生成一个新页面,但这些页面永远不会关闭。我看到 grabTitles.length
为 60。因此您将打开 60 个选项卡。这浪费了很多资源。在我的机器上,它可能会挂起所有东西。我建议制作一个页面并反复浏览它,或者在完成后关闭每一页。如果您想要并行性,请考虑任务队列或同时运行几个页面。
grabTitles[i++]
-- 为什么要在这里递增 i
?它已经通过循环递增,因此这似乎跳过了元素,除非您的选择器有重复项或者您有其他原因要这样做。
span.a-size-medium
对我不起作用,这可能是特定于地区的。我看到 a span.a-size-base-plus.a-color-base.a-text-normal
,但您可能需要调整它以适应口味。
这是一个最小的例子。我将只处理 eBay 数组中的前 2 个项目,因为它通过得很好。
const puppeteer = require("puppeteer"); // ^13.5.1
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
await page.setExtraHTTPHeaders({"Accept-Language": "en-US,en;q=0.9"});
await page.setUserAgent(ua);
const titles = [
"Chloraethyl | Dr. Henning | Spray 175 ml",
"Elmex Decays Prevention Toothpaste 2 x 75ml",
];
for (const title of titles) {
await page.goto("https://www.amazon.co.uk/");
await page.type("#twotabsearchtextbox", title);
await Promise.all([
page.keyboard.press("Enter"),
page.waitForNavigation(),
]);
const titleSel = "a span.a-size-base-plus.a-color-base.a-text-normal";
await page.waitForSelector(titleSel);
const results = await page.$$eval(titleSel, els =>
els.map(el => el.textContent)
);
console.log(title, results.slice(0, 5));
}
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
输出:
Chloraethyl | Dr. Henning | Spray 175 ml [
'Chloraethyl | Dr. Henning | Spray 175 ml',
'Wild Fire (Shetland)',
'A Dark Sin: A chilling British detective crime thriller (The Hidden Norfolk Murder Mystery Series Book 8)',
'A POLICE DOCTOR INVESTIGATES: the Sussex murder mysteries (books 1-3)',
'Rites of Spring: Sunday Times Crime Book of the Month (Seasons Quartet)'
]
Elmex Decays Prevention Toothpaste 2 x 75ml [
'Janina Ultra White Whitening Toothpaste (75ml) – Diamond Formula. Extra Strength. Clinically Proven. Low Abrasion. For Everyday Use. Excellent for Stain Removal',
'Elmex Decays Prevention Toothpaste 2 x 75ml',
'Elmex Decays Prevention Toothpaste 2 x 75ml by Elmex',
'Elmex Junior Toothpaste 2 x 75ml',
'Elmex Sensitive Professional 2 x 75ml'
]
请注意,我添加了用户代理和 header 以便能够使用 headless: true
但这只是上面主要解决方案的附带结果。您可以返回到 headless: false
或查看规范线程,如 How to avoid being detected as bot on Puppeteer and Phantomjs?和 Why does headless need to be false for Puppeteer to work?如果您还有其他检测问题。
关于javascript - Puppeteer ,带回空白数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71711794/
我正在寻找 css 属性以隐藏带或不带 css 类的段落,如果它包含空格 ( ) 或空白,但我想至少保留一个带或不带的段落,如果有更多的话。 隐藏段落,如果它是空白的或包含 white-space(
在 ruby 中对空白有不同的敏感度/设置吗? 我有一个 RoR 项目,其中一个事件记录调用有很多组件: max_stuff = FooSummary.select("max(stuff)
如何在脚注中的数字后留空? 一般来说,对于所有脚注! 例子: 好 : 1 Hello World 坏:1Hello World 最佳答案 正确答案是不要重新定义\thefootnote ,因为这会在脚
我有这段代码,每次第一个 for 循环再次开始时,我希望它将数组重置为空白,因为它正在使用新用户,但我得到的输出包含一个数组中的所有值。 var items = []; for (var i
我试图在CakePHP中生成一个动态xml文档,以输出到浏览器。 这是我的 Controller 代码: Configure::write ('debug', 0); $this->layout =
当我尝试在 nxos 设备上运行某些命令时,输出末尾有一个空格。我必须将输出与现有变量列表进行比较。末尾的空格导致比较错误。如何在字符串列表中使用 .strip() 函数? - name: Curre
我对 Elasticsearch 相当陌生,我一直在尝试对我的数据进行搜索,并且总是让点击部分为空。即使在数据上传和索引之后也会发生这种情况。我的映射如下: { "mappings":{
我想将about:blank页面更改为firefox插件首页页面的url。 如何更改默认的新标签页网址或可以为新标签页提供默认网址? 我正在使用Firefox附加SDK。 最佳答案 您可以结合使用Ta
我正在使用 R 并具有以下数据框示例,其中所有变量都是因子: first second third social birth control high
如何清空显示对话框的页面。下面是我的代码HTML: .ui-dialog, .ui-dialog-content { border:1px solid #cde68c; border-botto
更新“他的问题是要求我只运行一次 str ,他们已经告诉我该函数只需要一个参数)” 我试图返回第一个不重复的字符,例如:“blazqnqbla”->第一个不重复的字符是“z”,因此函数需要返回z。现在
我的登录验证有问题。问题是当我尝试使用管理员登录时,页面停止在 checklogin.php 上并且不会告诉它是否成功。这是我的代码。 索引.html Aplik
我的查询是这样的 SELECT Distinct tm.teamid,tm.Team_Name,CONCAT_WS(' ',tu.FirstName+' '+tu.LastName) as Leade
我正在创建指向页面的超链接 url 由用户输入决定,因此由查询字符串决定 ; 问题是变量状态由两个或多个单词组成。因此,当我尝试单击证明表单中输入的超链接时,仅获取状态变量的第一个单词。浏览器将另一个
该问题在每个浏览器中的表现都不同,例如在 Firefox 中大约一个空格如果您再次滚动到顶部,则会出现具有相同高度的滚动框。在 chrome 中,滚动时框会变得狭窄等等...... 使用的调用是:
我对菜单栏文字之间的 CSS 空白有疑问。我尝试了很多方法,但仍然无法解决。有人可以帮我吗? 菜单问题图片如下: http://imageshack.us/photo/my-images/201/44
我对 有疑问.其中的插入符根据是否为空具有不同的垂直位置: 我的代码: textarea { padding: 0 5px; border: none; outline: n
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Ignore whitespace in HTML 我想在网页上将图片并排放置。这是我的 HTML:
每当我尝试检查元素时,什么都没有出现。我在使用 Chrome。我明白了 Elements | Network | Sources | Timeline | Profiles | Resources |
我在使用 Chrome、Firefox 和 IE 时遇到了一个奇怪的问题。我正在为我的投资组合网站/博客构建一个 WordPress 主题,一切都很好,直到今天,当我在 chrome 中查看该网站时,
我是一名优秀的程序员,十分优秀!