首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从买方网站上刮起支持者的名字

从买方网站上刮起支持者的名字
EN

Stack Overflow用户
提问于 2021-09-08 10:31:17
回答 2查看 78关注 0票数 0

我正试图从这个https://www.buymeacoffee.com/singtaousa网站上刮起支持者的名字。

目前,我能够获得使用axioscheerio模块的支持者总数。问题是我不知道如何得到支持者的名字。

我还试着用span搜索,一个支持者的名字都没有出来。不确定我的代码是错的还是名字不可能被检索。

这是我的代码:

代码语言:javascript
运行
复制
import cheerio from 'cheerio'
import axios from 'axios'

export default async function handler(req, res) {
  const { data } = await axios.get('https://www.buymeacoffee.com/singtaousa') // example
  const $ = cheerio.load(data)

  const count = $('.text-fs-16.av-medium.clr-grey.xs-text-fs-14.mg-t-8').text()
  const supporters = []

  // to be change
  $('span').each((i, element) => {
    const name = $(element).text()
    supporters.push(name)
  })

  res.status(200).json({ count, supporters })
}
EN

回答 2

Stack Overflow用户

发布于 2021-09-10 16:41:56

您需要从控制台或手动加载此方法的所有支持者,因为您没有将它们全部加载一次:

代码语言:javascript
运行
复制
await document.getElementById("load-more-recent").click();

加载支持程序的请求可以通过开发工具的网络选项卡进行跟踪。加载完所有内容后,您可以从下面的代码输出中复制一个名称列表。您可以更改输出的连接,或者忽略空值,但基本上是这样的:

代码语言:javascript
运行
复制
var supporters = $("div.supp-wrapper");
var list = [];
for(var i = 0; i < supporters.length; i++){ 
   list.push(supporters[i].querySelectorAll("span.av-heavy")[0].textContent.trim(" "));
}
console.log(list);

此脚本将产生以下结果:

(10) ['Amy', 'Wong', 'Someone', 'Someone', 'Someone', 'Emily', 'KWONG Wai Oi Anna', 'Simon wong', 'Elaine Liu', 'Someone']

要获得所有支持者的名字,您需要用上面的点击脚本加载所有的内容。否则,您可以签出网络选项卡来使用API请求。

票数 1
EN

Stack Overflow用户

发布于 2021-09-13 17:25:40

这些名称是由JavaScript添加的,因此您需要类似于木偶师或任何其他无头浏览器运行程序来获得完全基于脚本的页面内容。下面是使用puppeteer的案例示例

代码语言:javascript
运行
复制
import puppeteer from 'puppeteer';

const browser = await puppeteer.launch();

try {
  const [page] = await browser.pages();

  await page.goto('https://www.buymeacoffee.com/singtaousa');

  const namesMinimum = 20;
  const nameSelector = 'div.supp-wrapper span.av-heavy';
  const moreSelector = 'button#load-more-recent';

  await page.waitForSelector(moreSelector);

  while (await page.$$eval(nameSelector, names => names.length) < namesMinimum) {
    await Promise.all([
      page.click(moreSelector),
      page.waitForResponse(
        response => response.url().includes('www.buymeacoffee.com')
      ),
    ]);
  }

  const data = await page.evaluate(() => {
    const names = Array.from(
      document.querySelectorAll('div.supp-wrapper span.av-heavy'),
      span => span.innerText,
    );
    return names;
  });
  console.log(data);
} catch (err) { console.error(err); } finally { await browser.close(); }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69101422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档