是不是要等页面有数据了再写爬虫爬页面,这样页面渲染的时间(虽然不长,但也坚持不了多少)能省下来吗?不懂基础的可以参考我的文章简单易用的文章使用puppeteer抓取接口拦截ajax数据。这里有朋友会告诉我,我知道接口,直接去request就行了。Python、node、axios、原生ajax都不行。哈哈,如果是接口的话参数里有随机数,有随机时间点,有随机时间戳和uuid混在一起,分分钟怀疑人生,看我们要抢的小说站的接口参数,而我们要抓取的信息图中从上到下的标记分别是:图书id要抓取的信息接口接口地址接口数据。是时候怀疑人生了。让我们看一下请求参数。首先是post请求,然后分析FormData数据bookID和user_id。大头是这个,sign,黑色问号脸(这是什么)翻了半天,找了个js文件,发现sign的出处还是md5加密的,于是问题就来这个r了,通过这个接口,我们可以知道是bookid小问题就是如何获取这个固定时间间隔的时间戳。喜欢等的朋友可以试试看。具体我不知道,但应该在10分钟以上。最大的问题是这本书的Key是什么?我也找不到。我能做些什么?我也很绝望。只好放大了,大家在官网的API中可以看到其中几个,直接上传代码即可(详见评论)。关键部分代码及结果截图请附上本文地址constpuppeteer=require('puppeteer');constmongodb=require('mongodb')//mongoDBconstmongo_url='mongodb://127.0.0.1:27017/book'constmongoClient=mongodb.MongoClient//睡眠函数functionsleep(second){returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve('睡够了~');},second);})}//站点地址urlvarurl=`http://t.shuqi.com/route.php?pagename=route.php#!/ct/cover/bid/6070553`classParse{constructor(){this.page=nullthis.browser=nullthis.bookMes??sage={}}asyncinit(){//构造浏览器对象//显示浏览器this.browser=awaitpuppeteer.launch({'headless':false,});//创建页面this.page=awaitthis.browser.newPage();//模拟浏览器信息constUA="Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/64.0.3282.119Safari/537.36";awaitPromise.all([this.page.setUserAgent(UA),//允许js脚本执行this.page.setJavaScriptEnabled(true),//页面视口大小this.page.setViewport({width:1100,height:1080}),]);awaitthis.getBook()}asyncgetBook(){//打开页面awaitthis.page.goto(url);letpage=awaitthis.page//等待页面请求完成page.on('requestfinished',request=>{//查看所有请求地址//console.log(request.url)//ajaxif(request.resourceType=="xhr"){//匹配所需数据的请求地址if(request.url.indexOf('http://walden1.shuqireader.com/webapi/book/info')!=-1){(async()=>{try{//获取数据并将其转换为json格式letres=awaitrequest.response();letresult=awaitres.json();letres_data=result.data//找到需要在接口数据datathis.bookMes??sage={'book_name':res_data.bookName,'book_summary':res_data.desc,'author_name':res_data.authorName,}letdata=awaitthis.bookMes??sagemongoClient.connect(mongo_url,(err,db)=>{db.collection('shuqi_test').insert(data,(err,result)=>{if(err){console.log('connectionfailed')}//关闭浏览器this.browser.close()//关闭数据库连接db.close()})})}catch(err){console.log(err)}})()}}});}}letparse=newParse()parse.init()
