您好,登錄后才能下訂單哦!
爬蟲的原理很好理解,就是在服務端請求另一個服務器的資源,前端有跨域問題,而服務端沒有,這是天然優勢。掌握node的前端可以為所欲為了。
1 首先,根據請求資源的協議選擇合適的模塊,比如csdn是https協議,就用https的方法取請求,之前沒有注意到這個問題。
var?https?=?require('https');
2 用get方法請求需要抓去內容的網頁地址,試過用request方法,沒有反應。
?https.get('https://www.xxx.net',function(res){ ????????...... ?})
3 用cheerio模塊查找dom元素,抓取需要的內容。cheerio是服務端的dom操作工具,以jquery為內核。
var?cheerio?=?require('cheerio'); ?????res.on('data',?(chunk)?=>?{ ????????const?$?=?cheerio.load(chunk); ????????let?content=$('.company_list'); ?????})
4 把圖片的絕對地址改成本地路徑,前端頁面無法直接訪問跨域受保護圖片。
let?imgsrc=[]; content.find('img').each((index,e)=>{ ???? ????var?originsrc=e.attribs.src; ????e.attribs.src?='/images/'+e.attribs.src.split('?')[0].split('/').pop(); ????imgsrc.push(originsrc); })
5 最后一步,也是最重要的一步:把圖片保存在本地文件夾。試過fs.readFile 和fs.writeFile,保存下來的圖片受損打不開;試過直接get請求,返回的圖片都是0字節。正確的方法是用request方法,至于為什么?我也不清楚啊。可能是binary二進制的優勢,畢竟再怎么偽裝,所有數據本質還是二進制吧。
var?request?=?require('request'); imgsrc.forEach(item=>{ ????var?filename?=?item.split('?')[0].split('/').pop(); ????request({?url:?item,?encoding:?null?},?(err,?response,?body)?=>?{? ????????fs.writeFileSync('./public/images/'+filename,?body,?{?encoding:?'binary'?}); ????}) })
到此為止,爬蟲的功能就結束了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。