为什么我的 Selenium 抓取工具为不同的查询返回相同的图像源?

Why is my Selenium scraper returning the same image source for different queries?

提问人:Jeff_V 提问时间:8/8/2023 最后编辑:Jeff_V 更新时间:8/9/2023 访问量:37

问:

我在 Express 服务器上设置了以下 Google 图片抓取工具。它接受一个查询数组,并应该返回每个查询的第一个图像结果值的数组,即每个查询的单独 Google 图片搜索。src

let queryArr = ['cat', 'dog', 'cheeta', 'boy', 'girl', 'lion']

let driver = undefined;
const startSelenium = async () => {
  const options = new Options();
  options.addArguments('--headless')
  options.addArguments('--no-sandbox')
  options.addArguments('--incognito')
  driver = await new Builder().forBrowser('chrome').setChromeOptions(options).build();
}

const Scrape = async (queryArr) => {

  if (!driver) {
    await startSelenium();
  }

  try {
    let imgSources = [];
    for (const query of queryArr) {
      const url = `https://www.google.com/search?site=&tbm=isch&source=hp&biw=1873&bih=990&q=${query}`;
      await driver.get(url);
      const img = await driver.findElement(By.className('Q4LuWd'));
      const imgSrc = await img.getAttribute('src');
      imgSources.push(imgSrc);
    }
    return imgSources;
  } catch (e) {
    console.log(`Scrape() error: \n${e}`);
  }
};

此基本逻辑适用于单个搜索,但是当传递这样的查询数组时,它会返回第一个查询的六次。我尝试了几种不同的方法,包括、等,但我没有运气。我该如何解决这个问题?srcsleep()until

另外,有没有办法同时执行此操作以加快速度?我已经在客户端进行了设置,但如上所述,返回的数组是错误的,所以我想我会尝试在后端进行设置。Promise.all()

node.js Express selenium-webdriver 网页抓取

评论

1赞 Andrew Ryan 8/8/2023
我相信问题出在 stackoverflow.com/questions/67927085/......await
0赞 Jeff_V 8/9/2023
@AndrewRyan 不是总是哈哈吗??事实证明,这是一个异步问题。感谢您的退款。imgSources.push(imgSrc)

答:

0赞 Jeff_V 8/9/2023 #1

始终是一个异步问题。我也通过异步推送到数组来让它工作。

...
let imgSources = [];
for (const query of queryArr) {
    const url = `https://www.google.com/search?site=&tbm=isch&source=hp&biw=1873&bih=990&q=${query}`;
    await driver.get(url);
    const img = await driver.findElement(By.className('Q4LuWd'));
    const imgSrc = await img.getAttribute('src');
    (async () => imgSources.push(imgSrc))();
}
...