【发布时间】:2020-05-29 23:34:37
【问题描述】:
我有一个场景,我需要从网站获取所有社交媒体链接。如果我认为所有社交链接都在主页上,那么每个社交媒体链接都是获取每个社交媒体链接。以下是代码示例:
使用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')
如果所有社交媒体链接都在主页上,它就可以正常工作,但是 我无法弄清楚如果社交媒体链接打开了怎么办 给定网站的其他页面。
以下是使用 puppeteer 的相同代码示例:
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'])
例如这个网址https://netsoltech.com/,主页上没有它的社交媒体链接。
【问题讨论】:
-
那么你需要深入,访问主页的孩子,然后访问孩子的孩子等等。这是一种广度优先的搜索方法,而且很耗时,所以这取决于你愿意走多远。
标签: javascript node.js web-scraping puppeteer cheerio