成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

puppeteer進(jìn)階版_爬取小說(shuō)站

qpal / 974人閱讀

摘要:寫(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)備抓取的信息

圖中標(biāo)記的自上往下分別是:

書(shū)籍id

要抓取的信息

接口

接口地址

接口數(shù)據(jù)

懷疑人生的時(shí)候到了,來(lái)看請(qǐng)求參數(shù)

首先是 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è)js文件發(fā)現(xiàn)了sign的由來(lái)

還是個(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)辦法只能放大招了


來(lái)來(lái)來(lái)
在官網(wǎng)的api可以看到這么幾個(gè),哇,看到這哥幾個(gè)莫名的興奮啊,點(diǎn)過(guò)去再看看,就問(wèn)你激動(dòng)不激動(dòng)
看到這里我就不多啰嗦了,直接上代碼(詳細(xì)說(shuō)明在注釋里)


代碼最為關(guān)鍵的地方截圖

結(jié)果截圖

突然頓悟,都這樣了,試問(wèn)頁(yè)面上還有啥是拿不到的,完整代碼 轉(zhuǎn)載請(qǐng)附上本文章地址
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

相關(guān)文章

  • puppeteer_node爬蟲(chóng)分布式進(jìn)階

    摘要:前面的文章將做爬蟲(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ù)...

    sutaking 評(píng)論0 收藏0
  • puppeteer的簡(jiǎn)單使用_爬取頁(yè)面信息

    摘要:使用無(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ò),就是操作瀏覽器的...

    ARGUS 評(píng)論0 收藏0
  • Koa2 + Mongo + 爬蟲(chóng) 搭建 小說(shuō)微信小程序(本地開(kāi)發(fā)篇)

    摘要:前言根據(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...

    Kross 評(píng)論0 收藏0
  • 首次公開(kāi),整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0
  • python爬取某趣閣小說(shuō)(2.0),十分鐘爬完一千六百章

    摘要:返回每個(gè)章節(jié)的集合。爬取完成,共計(jì)用了分鐘左右。判斷使用還是使用變量來(lái)存放未變化的,若下次循環(huán)與相等,說(shuō)明此次請(qǐng)求沒(méi)有成功,,因?yàn)槟承╉?yè)面本身存在錯(cuò)誤沒(méi)有數(shù)據(jù),則需要跳過(guò)。 ...

    My_Oh_My 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

qpal

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<