@(爬蟲)[puppeteer|]javascript
爬蟲又稱網絡機器人。天天或許你都會使用搜索引擎,爬蟲即是搜索引擎重要的組成部分,爬取內容作索引。現現在大數據,數據分析很火,那數據哪裏來呢,能夠經過網絡爬蟲爬取啊。那我萌就來探討一下網絡爬蟲吧。html
[TOC]java
如圖所示,這是爬蟲的流程圖,能夠看到經過一個種子URL開啓爬蟲的爬取之旅,經過下載網頁,解析網頁中內容存儲,同時解析中網頁中的URL 去除重複後加入到等待爬取的隊列。而後從隊列中取到下一個等待爬取的URL重複以上步驟,是否是很簡單呢?git
上面也提到在爬取完一個網頁後從等待爬取的隊列中選取一個URL去爬去,那如何選擇呢?是選擇當前爬取網頁中的URL 仍是繼續選取當前URL中同級URL呢?這裏的同級URL是指來自同一個網頁的URL,這就是爬取策略之分。github
廣度優先策略即是將當前某個網頁中URL先爬取徹底,再去爬取從當前網頁中的URL爬取的URL,這就是BFS,若是上圖的關係圖表示網頁的關係,那麼BFS的爬取策略將會是:(A->(B,D,F,G)->(C,E));web
深度優先策略爬取某個網頁,而後繼續去爬取從網頁中解析出的URL,直到爬取完。 (A->B->C->D->E->F->G)chrome
下載網頁看起來很簡單,就像在瀏覽器中輸入連接同樣,下載完後瀏覽器便能顯示出來。固然結果是並非這樣的簡單。 ####模擬登陸 對於一些網頁來講須要登陸才能看到網頁中內容,那爬蟲怎麼登陸呢?其實登陸的過程就是獲取訪問的憑證(cookie,token...)編程
let cookie = '';
let j = request.jar()
async function login() {
if (cookie) {
return await Promise.resolve(cookie);
}
return await new Promise((resolve, reject) => {
request.post({
url: 'url',
form: {
m: 'username',
p: 'password',
},
jar: j
}, function(err, res, body) {
if (err) {
reject(err);
return;
}
cookie = j.getCookieString('url');
resolve(cookie);
})
})
}
複製代碼
這裏是個簡單的栗子,登陸獲取cookie, 而後每次請求都帶上cookie.json
有的網頁內容是服務端渲染的,沒有CGI可以得到數據,只能從html中解析內容,可是有的網站的內容並非簡單的便能獲取內容,像linkedin這樣的網站並非簡單的可以得到網頁內容,網頁須要經過瀏覽器執行後才能得到最終的html結構,那怎麼解決呢?前面我萌提到瀏覽器執行,那麼我萌有沒有可編程的瀏覽器呢?puppeteer,谷歌chrome團隊開源的無頭瀏覽器項目,利用無頭瀏覽器便能模擬用戶訪問,便能獲取最重網頁的內容,抓取內容。 利用puppeteer 模擬登陸瀏覽器
async function login(username, password) {
const browser = await puppeteer.launch();
page = await browser.newPage();
await page.setViewport({
width: 1400,
height: 1000
})
await page.goto('https://maimai.cn/login');
console.log(page.url())
await page.focus('input[type=text]');
await page.type(username, { delay: 100 });
await page.focus('input[type=password]');
await page.type(password, { delay: 100 });
await page.$eval("input[type=submit]", el => el.click());
await page.waitForNavigation();
return page;
}
複製代碼
執行login()
後便能像在瀏覽器中登陸後,便能像瀏覽器中登陸後便能獲取html中的內容,固然也能夠直接請求CGI
async function crawlData(index, data) {
let dataUrl = `https://maimai.cn/company/contacts?count=20&page=${index}&query=&dist=0&cid=${cinfo.cid}&company=${cinfo.encodename}&forcomp=1&searchTokens=&highlight=false&school=&me=&webcname=&webcid=&jsononly=1`;
await page.goto(dataUrl);
let res = await page.evaluate((e) => {
return document.body.querySelector('pre').innerHTML;
});
console.log(res)
res = JSON.parse(res);
if (res && res.result == 'ok' && res.data.contacts && res.data.contacts.length) {
data = data.concat(res.data.contacts.map((item) => {
let contact = item.contact;
console.log(contact.name)
return {
name: contact.name,
occupation: contact.line4.split(',')[0],
company: contact.company,
title: contact.position
}
}));
return await crawlData(++index, data);
}
return data;
}
複製代碼
像有的網站,拉鉤,每次爬取的cookie都同樣,也能利用無頭瀏覽器取爬取,這樣每次就不用每次爬取的時候擔憂cookie.
固然爬蟲不單單這些,更多的是對網站進行分析,找到合適的爬蟲策略。對後關於puppeteer
,不單單能夠用來作爬蟲,由於能夠編程,無頭瀏覽器,能夠用來自動化測試等等。