摘要:寫(xiě)爬蟲(chóng)抓取頁(yè)面是不是還需要等待頁(yè)面有數(shù)據(jù)了才能抓取,那么頁(yè)面渲染的這段時(shí)間雖然不長(zhǎng)但架不住多啊是不是可以省去呢時(shí)間要好好的利用起來(lái)基礎(chǔ)不太了解的可以參考我這篇簡(jiǎn)單使用的文章使用抓取接口攔截?cái)?shù)據(jù)這里有小伙伴就要說(shuō)了我都知道接口了直接去請(qǐng)求不就
寫(xiě)爬蟲(chóng)抓取頁(yè)面是不是還需要等待頁(yè)面有數(shù)據(jù)了才能抓取,那么頁(yè)面渲染的這段時(shí)間(雖然不長(zhǎng)但架不住多啊)是不是可以省去呢 時(shí)間要好好的利用起來(lái) 基礎(chǔ)不太了解的可以參考我這篇簡(jiǎn)單使用的文章
使用puppeteer抓取接口攔截ajax數(shù)據(jù) 這里有小伙伴就要說(shuō)了我都知道接口了直接去請(qǐng)求不就完了嗎,python,node,axios,原生的ajax那個(gè)不行啊 哈哈,那要是接口參數(shù)中有隨機(jī)數(shù)呢,有隨機(jī)時(shí)間點(diǎn)呢,有隨機(jī)時(shí)間戳和uuid再混起來(lái)呢 分分鐘懷疑人生來(lái)看小說(shuō)站的接口參數(shù) 咱們準(zhǔn)備抓取的信息
接口數(shù)據(jù) 懷疑人生的時(shí)候到了,來(lái)看請(qǐng)求參數(shù)圖中標(biāo)記的自上往下分別是:
書(shū)籍id
要抓取的信息
接口
接口地址
翻騰了好久找了一個(gè)js文件發(fā)現(xiàn)了sign的由來(lái)首先是 post 請(qǐng)求
再來(lái)分析Form Data數(shù)據(jù)
bookID和user_id都沒(méi)啥事
timestamp這個(gè)參數(shù)是有一定間隔時(shí)間的時(shí)間戳
頭大的是這個(gè), sign, 黑人問(wèn)號(hào)臉(這是個(gè)啥)
還是個(gè)md5加密的
那么問(wèn)題來(lái)了
這個(gè)r,通過(guò)這個(gè)接口可以知道它就是bookid了
小問(wèn)題是這個(gè)有固定間隔時(shí)間的timestamp怎么獲取,喜歡等待的小伙伴可以試試等等看,具體我也不知道,不過(guò)應(yīng)該在10分鐘以上了
大問(wèn)題是這個(gè)bookKey是個(gè)啥啊,找遍了也沒(méi)找到,我能怎么辦,我也很絕望啊,沒(méi)辦法只能放大招了
在官網(wǎng)的api可以看到這么幾個(gè),哇,看到這哥幾個(gè)莫名的興奮啊,點(diǎn)過(guò)去再看看,就問(wèn)你激動(dòng)不激動(dòng) 看到這里我就不多啰嗦了,直接上代碼(詳細(xì)說(shuō)明在注釋里)
const puppeteer = require("puppeteer"); const mongodb = require("mongodb") // mongoDB const mongo_url = "mongodb://127.0.0.1:27017/book" const mongoClient = mongodb.MongoClient // 休眠函數(shù) function sleep(second) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(" enough sleep~"); }, second); }) } // 站點(diǎn)地址url var url = `http://t.shuqi.com/route.php?pagename=route.php#!/ct/cover/bid/6070553` class Parse { constructor() { this.page = null this.browser = null this.bookMessage = {} } async init() { // 構(gòu)造瀏覽器對(duì)象 // 顯示瀏覽器 this.browser = await puppeteer.launch({ "headless": false, }); // 創(chuàng)建頁(yè)面 this.page = await this.browser.newPage(); // 模擬瀏覽器信息 const UA = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36"; await Promise.all([ this.page.setUserAgent(UA), // 允許執(zhí)行js腳本 this.page.setJavaScriptEnabled(true), // 頁(yè)面視口大小 this.page.setViewport({width: 1100, height: 1080}), ]); await this.getBook() } async getBook() { // 打開(kāi)頁(yè)面 await this.page.goto(url); let page = await this.page // 等待頁(yè)面請(qǐng)求完成 page.on("requestfinished", request => { // 查看所有請(qǐng)求地址 // console.log(request.url) // ajax if (request.resourceType == "xhr") { // 匹配所需數(shù)據(jù)的請(qǐng)求地址 if(request.url.indexOf("http://walden1.shuqireader.com/webapi/book/info") != -1) { (async () => { try { // 獲取數(shù)據(jù)并轉(zhuǎn)為json格式 let res = await request.response(); let result = await res.json(); let res_data = result.data // 接口數(shù)據(jù)中找到需要的數(shù)據(jù) this.bookMessage = { "book_name": res_data.bookName, "book_summary": res_data.desc, "author_name": res_data.authorName, } let data = await this.bookMessage mongoClient.connect(mongo_url, (err, db) => { db.collection("shuqi_test").insert(data,(err, result) => { if(err) { console.log("連接失敗") } // 關(guān)閉瀏覽器 this.browser.close() // 關(guān)閉數(shù)據(jù)庫(kù)連接 db.close() } ) }) } catch(err) { console.log(err) } })() } } }); } } let parse = new Parse() parse.init()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107083.html
摘要:前面的文章將做爬蟲(chóng)的基礎(chǔ)一直到部署都梳理了一遍,現(xiàn)在來(lái)看一下分布式的處理為什么需要分布式需要抓取的不同數(shù)據(jù)有很多,會(huì)同時(shí)開(kāi)啟無(wú)頭瀏覽器去抓取,然后獲取到數(shù)據(jù)后又無(wú)厘頭的一股腦擠進(jìn)數(shù)據(jù)庫(kù)無(wú)法保證同一時(shí)刻需要的數(shù)據(jù)只有一個(gè)操作在進(jìn)行分布式選擇因 前面的文章將puppeteer做爬蟲(chóng)的基礎(chǔ)一直到部署都梳理了一遍,現(xiàn)在來(lái)看一下分布式的處理 1) 為什么需要分布式 1. 需要抓取的不同數(shù)據(jù)...
摘要:使用無(wú)頭瀏覽器做爬蟲(chóng)有什么拿什么它是的一個(gè)用來(lái)操縱瀏覽器的的庫(kù),對(duì)的你沒(méi)看錯(cuò),就是操作瀏覽器的,細(xì)思極恐啊簡(jiǎn)單說(shuō)就是瀏覽器有的它都有了當(dāng)然有些功能也正在開(kāi)發(fā)中可以注冊(cè),模擬登陸,設(shè)置操作事件,執(zhí)行腳本團(tuán)隊(duì)對(duì)其維護(hù),厲害了吧文檔地址安裝首先 使用chrome無(wú)頭瀏覽器做爬蟲(chóng) - 有什么拿什么 puppeteer 它是Node的一個(gè)用來(lái)操縱瀏覽器的API的庫(kù),對(duì)的你沒(méi)看錯(cuò),就是操作瀏覽器的...
摘要:前言根據(jù)慕課網(wǎng)實(shí)現(xiàn)電影微信公眾號(hào)前后端開(kāi)發(fā)學(xué)習(xí)后的改造由于上下班期間會(huì)看會(huì)小說(shuō),但是無(wú)奈廣告太多,還要收費(fèi),于是結(jié)合課程,進(jìn)行開(kāi)發(fā),并上傳到自己的微信小程序。 前言:根據(jù)慕課網(wǎng) Koa2 實(shí)現(xiàn)電影微信公眾號(hào)前后端開(kāi)發(fā) 學(xué)習(xí)后的改造 由于上下班期間會(huì)看會(huì)小說(shuō),但是無(wú)奈廣告太多,還要收費(fèi),于是結(jié)合課程,進(jìn)行開(kāi)發(fā),并上傳到自己的微信小程序。 showImg(https://segment...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:返回每個(gè)章節(jié)的集合。爬取完成,共計(jì)用了分鐘左右。判斷使用還是使用變量來(lái)存放未變化的,若下次循環(huán)與相等,說(shuō)明此次請(qǐng)求沒(méi)有成功,,因?yàn)槟承╉?yè)面本身存在錯(cuò)誤沒(méi)有數(shù)據(jù),則需要跳過(guò)。 ...
閱讀 2938·2023-04-26 02:22
閱讀 2292·2021-11-17 09:33
閱讀 3144·2021-09-22 16:06
閱讀 1078·2021-09-22 15:54
閱讀 3541·2019-08-29 13:44
閱讀 1921·2019-08-29 12:37
閱讀 1327·2019-08-26 14:04
閱讀 1920·2019-08-26 11:57