【问题标题】:How do I click on an HTML tab item/filter using puppeteer?如何使用 puppeteer 单击 HTML 选项卡项/过滤器?
【发布时间】:2019-07-01 22:05:47
【问题描述】:

我正在为一个网站创建一个网络抓取应用程序,该应用程序使用选项卡标题来过滤表格中显示的信息。在从表中提取数据之前,我需要选择一个特定的过滤器,但是我没有任何运气点击选项卡项目,而我可以点击一个按钮。

我在这个应用程序中使用 puppeteer 和 Cheerio,我已经成功导航到相关页面并在提取数据之前单击了一个按钮,但选项卡标题似乎没有以同样的方式做出反应,尽管它也需要人工用户单击以选择它。

这是我的代码的 sn-p:

const page = await browser.newPage();
await page.goto('https://na.op.gg/summoner/champions/userName=' + 'TheJackal666');

const html = await page.content();
const $ = cheerio.load(html);

//This is the troublesome line
await page.click('#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-champions > div > div > div.Content.tabItems > div.tabItem.season-13 > div > div.stats-filter > div > div:nth-child(2)');
//The scraping function follows

我希望在执行我的其余抓取功能时,获得与“排名独奏”选项卡标题处于活动状态时显示的信息一致的结果。相反,它当前无法激活该选择器,并在默认的“Total”选项卡标题处于活动状态时抓取显示的数据。

非常感谢您提出的所有建议

【问题讨论】:

    标签: javascript web-scraping puppeteer headless-browser


    【解决方案1】:

    目前无法激活该选择器

    目标站点似乎很重,所以给它一些时间来加载和执行脚本:

    await page.goto('https://na.op.gg/summoner/champions/userName=TheJackal666', { waitUntil : "domcontentloaded" });
    
    const selector = "#SummonerLayoutContent > div.tabItem.Content.SummonerLayoutContent.summonerLayout-champions > div > div > div.Content.tabItems > div.tabItem.season-13 > div > div.stats-filter > div > div:nth-child(2)";
    
    // Wait fo the tab selector to be present
    await page.waitFor(selector);
    
    await page.click(selector);
    

    也不是您使用用户名,就好像它是一个变量,而不是一个字符串:

    await page.goto('https://na.op.gg/summoner/champions/userName=' + TheJackal666);
    

    如果在此之前没有定义它会导致错误。

    最后,在开发此类脚本时,首先考虑使用 headful 模式(使用可见的 Chromium 浏览器):

    const browser = await puppeteer.launch({ headless: false});
    

    这将使您首先更好地了解抓取期间发生的情况。

    【讨论】:

    • 感谢您关注字符串问题。我实际上通常在那里使用一个变量,但我只是使用了一个硬编码的名称来使问题更简单。关于你的“头条”建议,这对我有什么用?我不熟悉那个命令。感谢您的帮助!
    • headful 我的意思是设置 {headless : false} 显示由 puppeteer 驱动的 Chromium 浏览器。 / 答案有用吗?你能抓取数据吗?我也希望您在 单击选项卡选择器后获得 page.content()。
    • 不幸的是,我似乎仍然无法抓取数据,但问题在于没有单击过滤器。在那之后抓取数据似乎是一个问题(点击后我确实有page.content())。无论如何,谢谢你的帮助!我用 {headless:false} 看到标签被成功点击了。
    • 您可能还应该page.waitFor 来获取点击后显示数据的表格(它是通过 ajax 加载的,所以它不会是即时的)。另一种方法:注意.season-13--soloranked div 中的data-tab-data-url 属性;如果您打开该网址,您将在盘子上获取您的数据:)
    • 我使用了 ajax url,它成功了!非常感谢你的建议!
    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多