【问题标题】:HTML element not selecting in Puppeteer在 Puppeteer 中没有选择的 HTML 元素
【发布时间】:2021-07-30 05:37:33
【问题描述】:

所以我有一个网页的 HTML 摘录如下:

<li class="PaEvOc tv5olb wbTnP gws-horizon-textlists__li-ed">
  //random div/element stuff inside here
</li>
<li class ="PaEvOc tv5olb gws-horizon-textlists__li-ed">
  //random div/element stuff inside here as well
</li>

不确定如何正确复制 HTML,但如果您在 Google Chrome 上查看“location 附近的事件”,我正在查看这些并尝试从其中抓取数据:

https://i.stack.imgur.com/fv4a4.png

首先,我只是想弄清楚如何在 Puppeteer 中正确选择这些元素:

(async () => {
  const browser = await puppeteer.launch({ args: [
  '--no-sandbox'
  ]});
  const page = await browser.newPage();
  page.once('load', () => console.log('Page loaded!'));
  await page.goto('https://www.google.com/search?q=events+near+poughkeepsie+today&client=safari&rls=en&uact=5&ibp=htl;events&rciv=evn&sa=X&fpstate=tldetail');
  console.log('Hit wait for selector')
  const test = await page.waitForSelector(".PaEvOc");
  console.log('finished waiting for selector');
  const seeMoreEventsButton = await page.$(".PaEvOc");

  console.log('seeMoreEventsButton is ' + seeMoreEventsButton);
  console.log('test is ' + test);
})();

这里到底有什么问题?非常感谢任何和所有帮助,谢谢!

【问题讨论】:

  • 用 headless: false 运行它,这样你就可以看到发生了什么。
  • @pguardiario 在不支持无头的 Heroku 上运行它:false
  • 所以你不是先在本地测试吗?
  • 哦,我应该这样做,谢谢!

标签: javascript html node.js web-scraping puppeteer


【解决方案1】:

我建议阅读:https://intoli.com/blog/not-possible-to-block-chrome-headless/

基本上,网站会检测到您正在抓取,但您可以解决它。

这是我为使您的控制台日志打印有用的东西所做的工作

const puppeteer = require('puppeteer');

(async () => {                                                    
  const preparePageForTests = async (page) => {
    const userAgent = 'Mozilla/5.0 (X11; Linux x86_64)' +           
      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36';
    await page.setUserAgent(userAgent);
  }   

  const browser = await puppeteer.launch({ args: [                
  '--no-sandbox'                                                  
  ]});
  const page = await browser.newPage();
  await preparePageForTests(page);
      
  page.once('load', () => console.log('Page loaded!'));           
  await page.goto('https://www.google.com/search?q=events+near+poughkeepsie+today&client=safari&rls=en&uact=5&ibp=htl;events&rciv=evn&sa=X&fpstate=tldetail');                                        
  
  console.log('Hit wait for selector')
  const test = await page.waitForSelector(".PaEvOc");
    
  console.log('finished waiting for selector');                   
  const seeMoreEventsButton = await page.$(".PaEvOc");            
    
  console.log('seeMoreEventsButton is ' + seeMoreEventsButton);   
  console.log('test is ' + test);                                 
})();

【讨论】:

  • 非常有帮助的文章——那么我应该实现所有的测试“通过”吗?通行证将来会过时吗(例如,将来我是否必须将 userAgent 更改为其他内容?您有什么建议?
  • 我会尽量做到这一点。不同的站点将执行不同的检查,您对它们更改的担忧是有道理的。 IMO 你能做的最好的事情就是监控它,这样如果它开始失败,你可以通过采用该页面上列出的其他一些策略来快速做出反应以修复。
  • 那些测试是不同站点运行的唯一测试吗?还是那些是主要的?有没有办法知道具体是哪个测试导致拒绝?
  • 我觉得这有点像猫捉老鼠的游戏。我做了这个 userAgent 技巧让 puppeteer 与 costco.com 交谈,此后没有任何问题。老实说,我在这方面没有太多经验,这就是我很高兴找到这篇文章的原因。
  • 很公平,感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2019-07-24
  • 2020-05-24
  • 1970-01-01
  • 2023-02-25
  • 2013-02-04
  • 2011-07-31
相关资源
最近更新 更多