node 爬虫微博热搜
2022-01-14 本文已影响0人
webmrxu
这个是写的第二个版本,第一个版本爬虫已经不能使用了。第一个版本直接使用的是axios get请求获取页面字符串,使用 cheerio 对字符串进行解析,获取热搜数据。考虑使用axios 是他轻量级,在云服务中占用的内存最少(渣渣性能服务器,不得不考虑内存问题)。
代码如下,最新的微博热搜有进行改版,需要使用cookie 才能爬微博热搜数据,所以选择使用爬虫最终武器,pupetter。
const weiboHotUrl = "https://s.weibo.com/top/summary?cate=realtimehot";
const puppeteer = require("puppeteer");
const spider = () => {
return new Promise(async (resolve, reject) => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.setExtraHTTPHeaders({
// ':authority':'s.weibo.com',
// ':method':' GET',
// ':path':'/top/summary?cate=realtimehot',
// ':scheme':' https',
// 'accept':' text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
// 'accept-encoding':' gzip, deflate, br',
// 'accept-language':' zh-CN,zh;q=0.9',
// 'cookie':' SUB=_2AkMWvFaxf8NxqwJRmP4RzG7gZY91wgzEieKg4KdqJRMxHRl-yT8XqhxdtRB6PTx4UAWr2-kBQwZ1HYArN4YAW2cMS6CL; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9Whkm-rFSm0yR_CvgvzlZe42; _s_tentry=passport.weibo.com; Apache=5375211003204.768.1642125632605; SINAGLOBAL=5375211003204.768.1642125632605; ULV=1642125632625:1:1:1:5375211003204.768.1642125632605:',
// 'sec-ch-ua':' " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
// 'sec-ch-ua-mobile':' ?0',
// 'sec-ch-ua-platform':' "macOS"',
// 'sec-fetch-dest':' document',
// 'sec-fetch-mode':' navigate',
// 'sec-fetch-site':' none',
// 'sec-fetch-user':' ?1',
// 'upgrade-insecure-requests':' 1',
'user-agent':' Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
});
await page.goto(weiboHotUrl);
page.on('load', async() => {
let list = [];
const elements = await page.$$('#pl_top_realtimehot tbody>tr');
elements.forEach(async ele => {
const item = await ele.$eval('.td-02>a', node => {
return {
title: node.innerText,
url: "https://s.weibo.com" + node.getAttribute('href')
}
});
list.push(item);
if (list.length === elements.length) {
console.log(list);
resolve(list);
}
})
});
})
}
// spider();
module.exports = spider;