querylist采集微信公眾號文章(puppeteer實(shí)戰:爬取搜狗微信搜索的公眾號文章并寫(xiě)入Excel )
優(yōu)采云 發(fā)布時(shí)間: 2021-09-11 08:12querylist采集微信公眾號文章(puppeteer實(shí)戰:爬取搜狗微信搜索的公眾號文章并寫(xiě)入Excel
)
在上一本書(shū)中提到,使用puppeteer庫進(jìn)行截圖操作只是簡(jiǎn)單的展示了puppeteer的特性和基本用法。這次我們來(lái)談?wù)勈褂胮uppeteer抓取頁(yè)面數據并寫(xiě)入Excel。
Puppeteer實(shí)戰:抓取搜狗微信搜索到的公眾號文章,寫(xiě)入Excel
背景一:搜狗搜索現在有了根據關(guān)鍵詞查詢(xún)微信公眾號文章的功能,而我們要做的就是爬下指定關(guān)鍵詞的文章,因為這個(gè)需求來(lái)自我 來(lái)自公司業(yè)務(wù)部,所以為了方便同學(xué)們操作查看,還需要把爬取的數據放到Excel中。
用過(guò)之后,感覺(jué)這個(gè)東西并不復雜,只要懂API就行。我認為復雜的是需要考慮各種基本情況。
首先一般網(wǎng)站已經(jīng)進(jìn)行了防爬處理。我們需要以合理的方式繞過(guò)它。比如搜狗搜索就是。一開(kāi)始,我打算讀取a標簽的href屬性,然后直接在瀏覽器中打開(kāi)鏈接。但是在嘗試之后,我發(fā)現我能夠做到這一點(diǎn)。估計搜狗做了一些反爬行動(dòng)。這樣做將報告 IP 異常。所以我放棄了,使用puppeteer的page.click方法來(lái)解決這個(gè)問(wèn)題,因為puppeteer本質(zhì)上是通過(guò)模擬真實(shí)用戶(hù)的點(diǎn)擊操作來(lái)實(shí)現的,所以不會(huì )受到反爬機制的影響。
另外一個(gè)是因為爬蟲(chóng)是微信文章,我們還需要考慮微信文章本身的一些情況,比如文章被發(fā)布者刪除或移動(dòng),文章被舉報,或者這個(gè)文章時(shí)分享另一篇文章文章Wait...
總之,我覺(jué)得用puppeteer寫(xiě)的爬蟲(chóng)腳本跟業(yè)務(wù)是強耦合的,所以我個(gè)人覺(jué)得代碼本身沒(méi)有參考意義。不過(guò)還是可以看看自己在寫(xiě)過(guò)程中遇到的各種奇怪的問(wèn)題,或許可以為大家解決遇到的問(wèn)題提供一些思路。
完整代碼如下:
exportExcel 導出 Excel:
const fs = require("fs");
const xlsx = require("node-xlsx");
module.exports = {
async exportExcel(fileName, data) {
let dataArr = [];
let title = ["文章標題", "文章URL", "作者名(公眾號)", "發(fā)布日期", "內容"];
dataArr.push(title);
data.forEach(curr => {
dataArr.push([
curr.title,
curr.url,
curr.account,
curr.publishTime,
curr.content
]);
});
const options = {
"!cols": [
{ wch: 70 },
{ wch: 100 },
{ wch: 30 },
{ wch: 30 },
{ wch: 200 }
]
};
// 寫(xiě)xlsx
var buffer = await xlsx.build(
[
{
name: "sheet1",
data: dataArr
}
],
options
);
await fs.writeFile(`./dist/data1【${fileName}】.xlsx`, buffer, function(
err
) {
if (err) throw err;
console.log("寫(xiě)入成功!");
});
}
};