成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

node.js - 用node做爬蟲,循環模擬接口獲取數據,async/await怎么做到同步操作,控制流程?

瀏覽:225日期:2024-07-12 11:19:34

問題描述

目前的思路如下:1.獲取分類下所有的標簽頁面url,2.循環抓取頁面中抓取當前標簽頁獲取json的api地址,3.抓取當前標簽的商品列表,4.抓取當前標簽的分頁加載中的商品。

但是現在做到的是,第二步開始,未等到2-4執行完畢再循環下一個,有嘗試用async/await,但是未實現流程控制。此處求教。

var http = require(’http’);var fs = require('fs');var superagent = require(’superagent’);var urls = [];var pageIndex = 1;var xlsxData = ’’;getGoodsUrl(urls);function getGoodsUrl(urls){ superagent.post(’http://bravetime.davdian.com/index.php?c=Index&a=getCatNavList’).type(’text/html; charset=utf-8’).set(’Accept’,’application/json, text/javascript, */*; q=0.01’).end(function(err, res) { if (err) {console.log(’分類數據請求失敗’); } else {console.log(’分類數據請求成功’);var resData = res.text;var resData = JSON.parse(resData); if(resData.data.length > 0){ resData.data.forEach(function(item){var rowObj = [];var title = item.title;var category = item.content.category; category.forEach(function(item){ var text = []; text.push(title+ ’--’ + item.text); text.push(item.link); rowObj.push(text); }); urls.push(rowObj); }); loopUrls(urls);} else { console.log(’分類數據為空’);}// saveInfo(xlsxData); }})}function loopUrls(urls){ urls.forEach(function(item){var row = item;row.forEach(function(item){ var tagTitie = item[0]; var tegUrl = item[1]; getApiUrl(tagTitie,tegUrl);}); });}function getApiUrl(title,url){ var realUrl = ’http://bravetime.davdian.com’ + url; http.get(realUrl,function(res){ var html = ’’; res.on(’data’,function(data){ html += data; }); res.on(’end’,function(){ console.log(’正在獲取’ + title + ’頁面數據’); var reg = /goodsUrl = '(.+)'/; var apiUrl = reg.exec(html); getGoodsJson(apiUrl[1],pageIndex); }); }).on(’error’,function(){ console.log(’獲取html出錯!!’); });}function getGoodsJson(url,pageIndex){ superagent.post(’http://bravetime.davdian.com/’ + url + ’page_size=10&rp=catergory_search&rl=list’).send({page:pageIndex}).type(’application/x-www-form-urlencoded; charset=UTF-8’).set(’Accept’,’application/json, text/javascript, */*; q=0.01’).end(function(err, res) { if (err) {console.log(’第’ + pageIndex + ’頁請求失敗’); } else {console.log(’第’ + pageIndex + ’頁請求成功’);var resData = res.text;var resData = JSON.parse(resData); if(resData.data.length > 0){ resData.data.forEach(function(item){ xlsxData = xlsxData + item.goods_name + ’ ’ + item.shop_price + ’ ’ + item.goods_number + ’rn’; }); pageIndex = parseInt(pageIndex) + 1; setTimeout(function(){ getGoodsJson(url,pageIndex); },200);} else { console.log(’數據已加載完畢’); saveTxt(xlsxData); pageIndex = 1; return false;}// saveInfo(xlsxData); }})}function saveTxt(data){ fs.writeFile('create.txt',data,function (err) {if (err) throw err ; console.log('File Saved !'); //文件被保存 }) ;}function saveInfo(data){ var buffer = xlsx.build([{name: 'mySheetName', data: data}]); fs.writeFileSync('myFile.xlsx', buffer, ’binary’); console.log(’excel保存成功’);}

下面是結果圖示及代碼執行順序:

node.js - 用node做爬蟲,循環模擬接口獲取數據,async/await怎么做到同步操作,控制流程?

node.js - 用node做爬蟲,循環模擬接口獲取數據,async/await怎么做到同步操作,控制流程?

問題解答

回答1:

generatorasyncpromise

回答2:

你這整個過程都是異步的,沒看出一點同步的意思。我覺得你可能沒有理解什么是異步。

Async/await 是建立在 Promise 基礎上的,而 Superagent 本身是支持 Promise 的,你可以直接用 async/await。

async function() { try { const result = await superagent.get(url); console.log(result.headers); console.log(result.body); } catch (error) { console.error(error); }}

http://visionmedia.github.io/...

http://www.ruanyifeng.com/blo...

然后你需要的就是把 http.get() 換成 superagent.get()。

回答3:

一般他人的業務邏輯都沒什么耐性能看下去。

如樓上所言,Async/await 是建立在 Promise 基礎上,如果你調用的第三方庫的API接口沒有返回promise對象的話,想用Async/await 你只能自己每一步都新建一個promise對象,這樣其實寫起來也很麻煩,當然如果能返回promise對象的話就很方便。

以下不用promise 用node核心模塊event寫的,供你參考一下:

const EventEmitter = require(’events’);class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();myEmitter.on(’step1’, (m) => { //第一步 //業務邏輯處理得到結果result1 //判斷是否觸發下一步,如有需要將這步的結果傳給下一步 myEmitter.emit(’step2’, result1); });myEmitter.on(’step2’, (result1) => { //第二步 //業務邏輯處理得到結果result2 //判斷是否觸發下一步,如有需要將這步的結果傳給下一步 myEmitter.emit(’step3’, result2);});myEmitter.on(’step3’, (result2) => { //以此類推});myEmitter.emit(’step1’, urls);回答4:

可以使用 Node8 的 util.promisify,或者 Bluebird 等把 Node 回調形式的函數改成 Promise 風格的函數,然后就可以使用 async/await 來寫代碼。

代碼本身還是異步調用,只是寫法看起來像是同步的。所以在寫的時候還是要注意流程結構,尤其是在寫循環的時候。代的代碼太長,所以我寫個小例子來說明

async function remoteCall() { // do something}list = []; // 假設是很多數據async function process() { // 這種寫法必須要一個 remoteCall 完成之后才進行另一個 for (let i = 0; i < list.length; i++) {await remoteCall(); } doAfter();}async function process2() { // 這種寫法沒法 await list.forEach(function(t) {remoteCall(); });}async function process3() { // 這種寫法 doAfter 一早就會執行 list.forEach(async function(t) {await remoteCall(); }); // 它可能會在 remoteCall() 之前 doAfter();}async function process4() { // 這種寫法必須要全部 remoteCall 成功才能進行到 doAfter // remoteCall返回的 promise 如果 reject 會拋異常 var promises = list.map(t => remoteCall()); await Promise.all(promises); doAfter();}

成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产在线精品一区在线观看麻豆| 欧美视频完全免费看| 久久精品一区二区国产| 中文字幕中文乱码欧美一区二区| 99久久久精品| 日韩欧美国产一区在线观看| 五月婷婷综合激情| 欧美日韩在线精品一区二区三区| 久久综合九色综合97婷婷女人 | 性久久久久久| 亚洲蜜桃精久久久久久久| 精品福利av| 亚洲欧洲韩国日本视频| 黄色欧美日韩| 国产精品高潮呻吟久久| 一区在线观看| 亚洲另类一区二区| 亚洲精品久久| 亚洲激情欧美激情| 国产精品日韩久久久| 一区二区三区不卡视频在线观看| 亚洲美女网站| 亚洲一区二区不卡免费| 国产视频亚洲| 奇米综合一区二区三区精品视频| 欧美日韩一卡二卡| 国产91精品久久久久久久网曝门| 日韩亚洲欧美一区| 99re这里只有精品视频首页| 久久亚洲精华国产精华液| 91在线高清观看| 国产女同性恋一区二区| 欧美亚州在线观看| 国产精品日韩精品欧美在线| 亚洲视频观看| 亚洲图片欧美综合| 欧洲亚洲国产日韩| 国产精品一区二区三区四区| 日韩一区国产二区欧美三区| 成人伦理片在线| 国产精品伦理一区二区| 亚洲麻豆一区| 香港成人在线视频| 欧美日韩亚洲综合在线 | 精品国产凹凸成av人导航| 99久久99久久久精品齐齐| 中文字幕av一区二区三区高| 亚洲国产欧美日韩| 亚洲最大成人综合| 欧美色视频在线观看| 成人一区二区三区在线观看| 国产欧美日韩麻豆91| 99精品国产99久久久久久福利| 舔着乳尖日韩一区| 51久久夜色精品国产麻豆| 波多野结衣的一区二区三区| 亚洲国产精品成人综合| 99视频在线精品国自产拍免费观看| 亚洲第一成年网| 欧美性做爰猛烈叫床潮| 波多野结衣欧美| 亚洲一区二区三区在线播放| 欧美日韩美女一区二区| 99麻豆久久久国产精品免费优播| 国产精品白丝在线| 久久久7777| 国产福利精品导航| 国产精品成人一区二区艾草 | 在线精品一区二区| 日本在线播放一区二区三区| 88在线观看91蜜桃国自产| 欧美激情成人在线| 日韩在线一二三区| xf在线a精品一区二区视频网站| 亚洲福利国产| 久久精品久久精品| 中文字幕精品—区二区四季| 久久免费99精品久久久久久| 成人精品小蝌蚪| 亚洲欧美精品午睡沙发| 欧美日韩一区二区在线观看视频 | 中文字幕亚洲电影| 日本国产一区二区| 91一区一区三区| 亚洲成a人片在线不卡一二三区 | 成人av午夜电影| 亚洲自拍偷拍欧美| 91精品国产色综合久久不卡蜜臀| 一区一区视频| 国产一区二区女| 亚洲激情图片qvod| 精品国产在天天线2019| 久久久99国产精品免费| 91免费版在线| 麻豆国产精品视频| 国产精品久久久爽爽爽麻豆色哟哟| 久久综合影音| 欧美大香线蕉线伊人久久国产精品| 日韩高清一区在线| 国产精品毛片无遮挡高清| 欧美亚洲一区二区在线观看| 狠狠色综合色区| 国产一区二区三区香蕉| 国产精品夫妻自拍| 国产风韵犹存在线视精品| 亚洲制服丝袜av| 久久久夜色精品亚洲| 欧洲一区二区av| 欧美一区网站| 蓝色福利精品导航| 亚洲欧洲色图综合| 欧美高清精品3d| 亚洲深爱激情| 亚洲三级免费| 久久久久国产成人精品亚洲午夜| 精品无码三级在线观看视频| 精品日韩欧美一区二区| 亚洲欧美精品| 91婷婷韩国欧美一区二区| 国产一区二区在线观看免费播放| 免费日本视频一区| 亚洲欧洲av色图| 精品国产一区二区三区忘忧草| 亚洲影音一区| 欧美成人午夜| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日本午夜精品一区二区三区电影| 精品99999| 久久资源在线| 91在线视频官网| 久久66热re国产| 亚洲一区二区在线视频| 精品国产露脸精彩对白| 欧美日韩一区视频| 亚洲每日在线| 欧美连裤袜在线视频| 精品午夜久久福利影院| 亚洲欧美日韩国产综合| 欧美xxxxx裸体时装秀| 久久av一区二区三区| 欧美国产一区二区三区激情无套| 午夜久久久久久久久| 国产视频一区在线观看| 欧美久久电影| 国产成人三级在线观看| 日本欧美肥老太交大片| 亚洲欧美区自拍先锋| 久久久久久久电影| 717成人午夜免费福利电影| 国产欧美大片| 国产精品成人一区二区网站软件| 成人在线综合网站| 蜜臀av一区二区在线免费观看 | 午夜欧美精品| 国产·精品毛片| 激情欧美一区二区三区在线观看| 五月开心婷婷久久| 亚洲精品高清视频在线观看| 中文字幕欧美激情一区| 欧美不卡激情三级在线观看| 欧美日韩另类一区| 91搞黄在线观看| 色悠悠久久综合| 中文久久精品| 黄色成人在线网址| 91麻豆6部合集magnet| 丁香网亚洲国际| 国产在线不卡一区| 日本不卡123| 亚洲高清免费观看高清完整版在线观看| 中文av一区特黄| 26uuu精品一区二区| 欧美一区二区三区免费| 欧洲日韩一区二区三区| 久久国产精品一区二区三区四区| 亚洲色图自拍| 99精品99| 午夜亚洲福利在线老司机| 国产日韩欧美电影| 国产精品美女久久久久久 | 一区二区三区在线免费视频| 亚洲天堂精品在线观看| 亚洲精品日产精品乱码不卡| 一区二区三区四区五区视频在线观看 | 在线亚洲一区二区| 欧美亚洲综合一区| 欧美日韩国产综合草草| 91精品在线免费| 日韩欧美国产一区二区在线播放 | 日韩精品乱码av一区二区| 日本不卡一区二区三区高清视频| 午夜不卡av在线| 麻豆精品一区二区| 国产九九视频一区二区三区| 国产suv精品一区二区883| 97精品国产97久久久久久久久久久久| 成人av在线一区二区三区| 99精品视频一区二区| 国产在线精品二区| 免费久久久一本精品久久区|