摘要:寫爬蟲抓取頁面是不是還需要等待頁面有數據了才能抓取,那么頁面渲染的這段時間雖然不長但架不住多啊是不是可以省去呢時間要好好的利用起來基礎不太了解的可以參考我這篇簡單使用的文章使用抓取接口攔截數據這里有小伙伴就要說了我都知道接口了直接去請求不就
寫爬蟲抓取頁面是不是還需要等待頁面有數據了才能抓取,那么頁面渲染的這段時間(雖然不長但架不住多啊)是不是可以省去呢 時間要好好的利用起來 基礎不太了解的可以參考我這篇簡單使用的文章
使用puppeteer抓取接口攔截ajax數據 這里有小伙伴就要說了我都知道接口了直接去請求不就完了嗎,python,node,axios,原生的ajax那個不行啊 哈哈,那要是接口參數中有隨機數呢,有隨機時間點呢,有隨機時間戳和uuid再混起來呢 分分鐘懷疑人生來看小說站的接口參數 咱們準備抓取的信息
接口數據 懷疑人生的時候到了,來看請求參數圖中標記的自上往下分別是:
書籍id
要抓取的信息
接口
接口地址
翻騰了好久找了一個js文件發現了sign的由來首先是 post 請求
再來分析Form Data數據
bookID和user_id都沒啥事
timestamp這個參數是有一定間隔時間的時間戳
頭大的是這個, sign, 黑人問號臉(這是個啥)
還是個md5加密的
那么問題來了
這個r,通過這個接口可以知道它就是bookid了
小問題是這個有固定間隔時間的timestamp怎么獲取,喜歡等待的小伙伴可以試試等等看,具體我也不知道,不過應該在10分鐘以上了
大問題是這個bookKey是個啥啊,找遍了也沒找到,我能怎么辦,我也很絕望啊,沒辦法只能放大招了
在官網的api可以看到這么幾個,哇,看到這哥幾個莫名的興奮啊,點過去再看看,就問你激動不激動 看到這里我就不多啰嗦了,直接上代碼(詳細說明在注釋里)
const puppeteer = require("puppeteer"); const mongodb = require("mongodb") // mongoDB const mongo_url = "mongodb://127.0.0.1:27017/book" const mongoClient = mongodb.MongoClient // 休眠函數 function sleep(second) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(" enough sleep~"); }, second); }) } // 站點地址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() { // 構造瀏覽器對象 // 顯示瀏覽器 this.browser = await puppeteer.launch({ "headless": false, }); // 創建頁面 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), // 允許執行js腳本 this.page.setJavaScriptEnabled(true), // 頁面視口大小 this.page.setViewport({width: 1100, height: 1080}), ]); await this.getBook() } async getBook() { // 打開頁面 await this.page.goto(url); let page = await this.page // 等待頁面請求完成 page.on("requestfinished", request => { // 查看所有請求地址 // console.log(request.url) // ajax if (request.resourceType == "xhr") { // 匹配所需數據的請求地址 if(request.url.indexOf("http://walden1.shuqireader.com/webapi/book/info") != -1) { (async () => { try { // 獲取數據并轉為json格式 let res = await request.response(); let result = await res.json(); let res_data = result.data // 接口數據中找到需要的數據 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("連接失敗") } // 關閉瀏覽器 this.browser.close() // 關閉數據庫連接 db.close() } ) }) } catch(err) { console.log(err) } })() } } }); } } let parse = new Parse() parse.init()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107083.html
摘要:前面的文章將做爬蟲的基礎一直到部署都梳理了一遍,現在來看一下分布式的處理為什么需要分布式需要抓取的不同數據有很多,會同時開啟無頭瀏覽器去抓取,然后獲取到數據后又無厘頭的一股腦擠進數據庫無法保證同一時刻需要的數據只有一個操作在進行分布式選擇因 前面的文章將puppeteer做爬蟲的基礎一直到部署都梳理了一遍,現在來看一下分布式的處理 1) 為什么需要分布式 1. 需要抓取的不同數據...
摘要:使用無頭瀏覽器做爬蟲有什么拿什么它是的一個用來操縱瀏覽器的的庫,對的你沒看錯,就是操作瀏覽器的,細思極恐啊簡單說就是瀏覽器有的它都有了當然有些功能也正在開發中可以注冊,模擬登陸,設置操作事件,執行腳本團隊對其維護,厲害了吧文檔地址安裝首先 使用chrome無頭瀏覽器做爬蟲 - 有什么拿什么 puppeteer 它是Node的一個用來操縱瀏覽器的API的庫,對的你沒看錯,就是操作瀏覽器的...
摘要:前言根據慕課網實現電影微信公眾號前后端開發學習后的改造由于上下班期間會看會小說,但是無奈廣告太多,還要收費,于是結合課程,進行開發,并上傳到自己的微信小程序。 前言:根據慕課網 Koa2 實現電影微信公眾號前后端開發 學習后的改造 由于上下班期間會看會小說,但是無奈廣告太多,還要收費,于是結合課程,進行開發,并上傳到自己的微信小程序。 showImg(https://segment...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:返回每個章節的集合。爬取完成,共計用了分鐘左右。判斷使用還是使用變量來存放未變化的,若下次循環與相等,說明此次請求沒有成功,,因為某些頁面本身存在錯誤沒有數據,則需要跳過。 ...
閱讀 2925·2023-04-26 02:22
閱讀 2286·2021-11-17 09:33
閱讀 3127·2021-09-22 16:06
閱讀 1062·2021-09-22 15:54
閱讀 3530·2019-08-29 13:44
閱讀 1905·2019-08-29 12:37
閱讀 1316·2019-08-26 14:04
閱讀 1905·2019-08-26 11:57