摘要:写爬虫抓取页面是不是还需要等待页面有数据了才能抓取,那么页面渲染的这段时间虽然不长但架不住多啊是不是可以省去呢时间要好好的利用起来基础不太了解的可以参考我这篇简单使用的文章使用抓取接口拦截数据这里有小伙伴就要说了我都知道接口了直接去请求不就
写爬虫抓取页面是不是还需要等待页面有数据了才能抓取,那么页面渲染的这段时间(虽然不长但架不住多啊)是不是可以省去呢 时间要好好的利用起来 基础不太了解的可以参考我这篇简单使用的文章
使用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()
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/107083.html
摘要:前面的文章将做爬虫的基础一直到部署都梳理了一遍,现在来看一下分布式的处理为什么需要分布式需要抓取的不同数据有很多,会同时开启无头浏览器去抓取,然后获取到数据后又无厘头的一股脑挤进数据库无法保证同一时刻需要的数据只有一个操作在进行分布式选择因 前面的文章将puppeteer做爬虫的基础一直到部署都梳理了一遍,现在来看一下分布式的处理 1) 为什么需要分布式 1. 需要抓取的不同数据...
摘要:使用无头浏览器做爬虫有什么拿什么它是的一个用来操纵浏览器的的库,对的你没看错,就是操作浏览器的,细思极恐啊简单说就是浏览器有的它都有了当然有些功能也正在开发中可以注册,模拟登陆,设置操作事件,执行脚本团队对其维护,厉害了吧文档地址安装首先 使用chrome无头浏览器做爬虫 - 有什么拿什么 puppeteer 它是Node的一个用来操纵浏览器的API的库,对的你没看错,就是操作浏览器的...
摘要:前言根据慕课网实现电影微信公众号前后端开发学习后的改造由于上下班期间会看会小说,但是无奈广告太多,还要收费,于是结合课程,进行开发,并上传到自己的微信小程序。 前言:根据慕课网 Koa2 实现电影微信公众号前后端开发 学习后的改造 由于上下班期间会看会小说,但是无奈广告太多,还要收费,于是结合课程,进行开发,并上传到自己的微信小程序。 showImg(https://segment...
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
摘要:返回每个章节的集合。爬取完成,共计用了分钟左右。判断使用还是使用变量来存放未变化的,若下次循环与相等,说明此次请求没有成功,,因为某些页面本身存在错误没有数据,则需要跳过。 ...
阅读 2925·2023-04-26 02:22
阅读 2285·2021-11-17 09:33
阅读 3126·2021-09-22 16:06
阅读 1062·2021-09-22 15:54
阅读 3530·2019-08-29 13:44
阅读 1904·2019-08-29 12:37
阅读 1315·2019-08-26 14:04
阅读 1904·2019-08-26 11:57