




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】實(shí)例:使用puppeteerheadless方式抓取JS網(wǎng)
puppeteergooglechrome團(tuán)隊(duì)出品的puppeteer是依賴nodejs和chromium的自動(dòng)化測試庫,它的最大優(yōu)點(diǎn)就是可以處理網(wǎng)頁中的動(dòng)態(tài)內(nèi)容,如JavaScript,能夠更好的模擬用戶。有些網(wǎng)站的反爬蟲手段是將部分內(nèi)容隱藏于某些javascript/ajax請求中,致使直接獲取a標(biāo)簽的方式不奏效。甚至有些網(wǎng)站會(huì)設(shè)置隱藏元素“陷阱”,對用戶不可見,腳本觸發(fā)則認(rèn)為是機(jī)器。這種情況下,puppeteer的優(yōu)勢就凸顯出來了。它可實(shí)現(xiàn)如下功能:開源地址:[/GoogleChrome/puppeteer/][1]npmipuppeteer注意先安裝nodejs,并在nodejs文件根目錄下執(zhí)行(npm文件同級)。安裝過程中會(huì)下載chromium,大約120M。用兩天(大約10小時(shí))摸索,繞過了相當(dāng)多的異步的坑,筆者對puppeteer和nodejs有了一定的掌握。一張長圖,抓取blog文章列表:抓取blog文章以csdnblog為例,文章內(nèi)容需要點(diǎn)擊“閱讀全文”來獲取,這就導(dǎo)致只能讀取dom的腳本失效。/**
*loadarticletolocalfiles
**/
constpuppeteer=require('puppeteer');
//emulateiphone
constuserAgent='Mozilla/5.0(iPhone;CPUiPhoneOS11_0likeMacOSX)AppleWebKit/604.1.38(KHTML,likeGecko)Version/11.0Mobile/15A372Safari/604.1';
constworkPath='./contents';
constfs=require("fs");
if(!fs.existsSync(workPath)){
fs.mkdirSync(workPath)
}
//baseurl
constrootUrl='/';
//maxwaitmilliseconds
constmaxWait=100;
//maxloopscrolltimes
constmakLoop=10;
(async()=>{
leturl;
letcountUrl=0;
constbrowser=awaitpuppeteer.launch({headless:false});//setheadless:truewillhidechromiumUI
constpage=awaitbrowser.newPage();
awaitpage.setUserAgent(userAgent);
awaitpage.setViewport({width:414,height:736});
awaitpage.setRequestInterception(true);
//filtertoblockimages
page.on('request',request=>{
if(request.resourceType()==='image')
request.abort();
else
request.continue();
});
awaitpage.goto(rootUrl);
for(leti=0;i<makLoop;i++){
try{
awaitpage.evaluate(()=>window.scrollTo(0,document.body.scrollHeight));
awaitpage.waitForNavigation({timeout:maxWait,waitUntil:['networkidle0']});
}catch(err){
console.log('scrolltobottomandthenwait'+maxWait+'ms.');
}
}
awaitpage.screenshot({path:workPath+'/screenshot.png',fullPage:true,quality:100,type:'jpeg'});
//#feedlist_idli[data-type="blog"]a
constsel='#feedlist_idli[data-type="blog"]h3a';
consthrefs=awaitpage.evaluate((sel)=>{
letelements=Array.from(document.querySelectorAll(sel));
letlinks=elements.map(element=>{
returnelement.href
})
returnlinks;
},sel);
console.log('totallinks:'+hrefs.length);
process();
asyncfunctionprocess(){
if(countUrl<hrefs.length){
url=hrefs[countUrl];
countUrl++;
}else{
browser.close();
return;
}
console.log('processingurl:'+url);
try{
consttab=awaitbrowser.newPage();
awaittab.setUserAgent(userAgent);
awaittab.setViewport({width:414,height:736});
awaittab.setRequestInterception(true);
//filtertoblockimages
tab.on('request',request=>{
if(request.resourceType()==='image')
request.abort();
else
request.continue();
});
awaittab.goto(url);
//executetaprequest
try{
awaittab.tap('.read_more_btn');
}catch(err){
console.log('there\'snonereadmorebutton.NoneedtoTAP');
}
lettitle=awaittab.evaluate(()=>document.querySelector('#article.article_title').innerText);
letcontents=awaittab.evaluate(()=>document.querySelector('#article.article_content').innerText);
contents='TITLE:'+title+'\nURL:'+url+'\nCONTENTS:\n'+contents;
constfs=require("fs");
fs.writeFileSync(workPath+'/'+tab.url().substring(tab.url().lastIndexOf('/'),tab.url().length)+'.txt',contents);
console.log(title+"hasbeendownloadedtolocal.");
awaittab.close();
}catch(err){
console.log('url:'+tab.url()+'\n'+err.toString());
}finally{
process();
}
}
})();
執(zhí)行過程錄屏可以在我公眾號查看,下邊是截圖:執(zhí)行結(jié)果文章內(nèi)容列表:文章內(nèi)容:結(jié)束語以前就想過既然nodejs是使用JavaScript腳本語言,那么它肯定能處理網(wǎng)頁的JavaScript內(nèi)容,但并沒有發(fā)現(xiàn)合適的/高效率的庫。直到發(fā)現(xiàn)puppeteer,才下定決心試水。話說回來,nodejs的異步真的是很頭疼的一件事,這上百行代碼我竟然折騰了10個(gè)小時(shí)。大家可拓展下代碼中process()方法,使用async.eachSeries,我使用的遞歸方式并不是最優(yōu)解。事實(shí)上,逐一處理并不高效,原本我寫了一個(gè)異步的關(guān)閉browser方法:lettryCloseBrowser=setInterval(function(){
console.log("checkifanyprocessrunning...")
if(countDown<=0){
clearInterval(tryCloseBrowser);
console.log("noneprocessrunning,close.")
browser.close();
}
},3000);按照這個(gè)思路
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60268-7:2025 CMV EN Sound system equipment - Part 7: Headphones and earphones
- 2024年河北省隆化縣人民醫(yī)院公開招聘護(hù)理工作人員試題帶答案詳解
- 洪洞教編初中數(shù)學(xué)試卷
- 醫(yī)院項(xiàng)目管理課件
- 醫(yī)院課件教學(xué)課件
- 《網(wǎng)絡(luò)綜合布線》教案 項(xiàng)目3實(shí)訓(xùn)任務(wù) 實(shí)施工程預(yù)算和撰寫采購招標(biāo)文件
- 健康管理中心課件內(nèi)容
- 中國無線鼠標(biāo)行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 2021-2026年中國風(fēng)光互補(bǔ)控制器市場競爭格局及投資戰(zhàn)略規(guī)劃報(bào)告
- 2025-2030年中國制動(dòng)鼓行業(yè)市場供需態(tài)勢及發(fā)展前景研判報(bào)告
- DBJ50T-195-2025 混凝土抗壓強(qiáng)度檢測技術(shù)標(biāo)準(zhǔn)
- 《南昌市海綿城市建設(shè)規(guī)劃設(shè)計(jì)導(dǎo)則》
- 牙齒漂白治療技術(shù)操作指南
- 道路施工工藝培訓(xùn)
- 2025-2030全球及中國乙酰檸檬酸三丁酯(ATBC)行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 克羅恩病診斷與治療課件
- 2025濟(jì)寧市泗水縣泗河街道社區(qū)工作者考試真題
- 初二化學(xué)全套試題及答案
- 核心素養(yǎng)教學(xué)落地四大關(guān)鍵策略
- 融資代建合同模板5篇
- 甲方工期回復(fù)函
評論
0/150
提交評論