Javascript 如何使用cheerio或Puppeter刮除所有HREF?

Javascript 如何使用cheerio或Puppeter刮除所有HREF?,javascript,node.js,web-scraping,puppeteer,cheerio,Javascript,Node.js,Web Scraping,Puppeteer,Cheerio,我有一个场景,我需要从一个网站获取所有社交媒体链接。如果我认为所有的社交链接都在主页上,那么每个社交网站都会收到社交媒体链接。以下是代码示例: 使用cheeriojs const cheerio = require('cheerio') const axios = require('axios') const https = require('https'); const agent = new https.Agent({ rejectUnauthorized: false }); /

我有一个场景,我需要从一个网站获取所有社交媒体链接。如果我认为所有的社交链接都在主页上,那么每个社交网站都会收到社交媒体链接。以下是代码示例:

使用cheeriojs

const cheerio = require('cheerio')
const axios = require('axios')
const https = require('https');

const agent = new https.Agent({
    rejectUnauthorized: false
});
// process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

const getLinks = async (url) => {

    try {
        let body = await axios.get(url, { httpsAgent: agent })
        let hrefs = []
        let $ = cheerio.load(body.data)
        let links = $('a')

        links.each((i, link) => {
            hrefs.push($(link).attr('href'))
        })
        return hrefs
    } catch (error) {
        return error
    }

}

const getSocialLinks = async (socialLinks, url) => {
    try {
        let hrefs = await getLinks(url)

        let handles = []
        hrefs.filter(href => {
            if (href) {
                for (const link of socialLinks) {
                    if (href.includes(link)) {
                        handles.push({ platform: link, handle: href })
                        break
                    }
                }
            }
        })

        console.log(handles);
    } catch (error) {
        console.log(error)
    }
}

getSocialLinks(['facebook', 'twitter', 'instagram', 'youtube', 'linkedin'], 'https://synavos.com')
如果所有的社交媒体链接都在主页上,它就可以正常工作,但是 我不知道如果社交媒体链接打开了怎么办 给定网站的其他页面

下面是使用木偶演员的相同代码示例:

const puppeteer = require('puppeteer')

const getHrefsAttributes = async (website) => {
    try {
        const browser = await puppeteer.launch({
            headless: true,
            ignoreHTTPSErrors: true
        });
        const [page] = await browser.pages();

        await page.goto(website, { waitUntil: 'networkidle2', timeout: 3000000 });

        const hrefs = await page.evaluate(() => Array.from(document.querySelectorAll('a[href]'), a => a.getAttribute('href')));

        await browser.close();
        return hrefs
    } catch (err) {
        console.error(err);
    }
}

const getSocialLinks = async (url, socialLinks) => {
    let hrefs = await getHrefsAttributes(url)
    // add array for social links which you want to fetch
    let handles = []
    hrefs.filter(href => {
        for (const link of socialLinks) {
            if (href.includes(link)) {
                handles.push({ platform: link, handle: href })
                break
            }
        }
    })

    console.log(handles);
}

getSocialLinks('https://synavos.com/', ['facebook', 'twitter', 'instagram', 'youtube', 'linkedin'])

例如,此url在主页上没有其社交媒体链接

然后你需要深入,访问孩子们的主页,然后是孩子们的孩子们等等。这是一种广度优先的搜索方法,而且很耗时,所以这取决于你愿意深入到多深。然后你需要深入,访问主页的子页面,然后访问子页面的子页面,等等。这是一种广度优先的搜索方法,而且非常耗时,所以这取决于你愿意深入到什么程度。