首頁 > web前端 > js教程 > 主體

puppeteer爬蟲是什麼?爬蟲的工作原理

青灯夜游
發布: 2018-11-19 17:58:58
轉載
3924 人瀏覽過

這篇文章帶給大家的內容是介紹puppeteer爬蟲是什麼?爬蟲的工作原理。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

爬蟲(puppeteer)是什麼?

爬蟲又稱為網路機器人。每天或許你都會使用搜尋引擎,爬蟲是搜尋引擎重要的組成部分,爬取內容做索引。現如今大數據,數據分析很火,那數據哪裡來呢,可以透過網路爬蟲爬取。那我萌就來探討一下網路爬蟲吧。

puppeteer爬蟲是什麼?爬蟲的工作原理

爬蟲的工作原理

#如圖所示,這是爬蟲的流程圖,可以看到透過一個種子URL開啟爬蟲的爬取之旅,透過下載網頁,解析網頁中內容存儲,同時解析中網頁中的URL 去除重複後加入到等待爬取的隊列。然後從隊列取到下一個等待爬取的URL重複以上步驟,是不是很簡單呢?

廣度(BFS)還是深度(DFS)優先策略

上面也提到在爬取一個網頁後從等待爬取的隊列中選取一個URL去爬去,那要如何選擇呢?是選擇目前爬取網頁中的URL 還是繼續選取目前URL中同級URL呢?這裡的同級URL是指來自同一個網頁的URL,這就是爬取策略之分。

puppeteer爬蟲是什麼?爬蟲的工作原理

廣度優先策略(BFS)

#廣度優先策略就是將目前某個網頁中URL先爬取完全,再去爬取從目前網頁中的URL爬取的URL,這就是BFS,如果上圖的關係圖表示網頁的關係,那麼BFS的爬取策略將會是:(A->(B,D, F,G)->(C,F));

深度優先策略(DFS)

深度優先策略爬取某個網頁,然後繼續去爬取從網頁解析出的URL,直到爬取完為止。
(A->B->C->D->E->F->G)

下載網頁

下載網頁看起來很簡單,就像在瀏覽器中輸入連結一樣,下載完後瀏覽器就能顯示出來。當然結果是不是這樣的簡單。

模擬登入

對於某些網頁來說需要登入才能看到網頁中內容,那爬蟲要怎麼登入呢?其實登入的過程就是取得存取的憑證(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.

#取得網頁內容

有的網頁內容是服務端渲染的,沒有CGI能夠取得數據,只能從html解析內容,但是有的網站的內容並不是簡單的便能取得內容,像linkedin這樣的網站並不是簡單的能夠獲得網頁內容,網頁需要通過瀏覽器執行後才能獲得最終的html結構,那要怎麼解決呢?前面我萌提到瀏覽器執行,那我有沒有可程式化的瀏覽器呢? puppeteer,Googlechrome團隊開源的無頭瀏覽器項目,利用無頭瀏覽器便能模擬使用者訪問,便能取得最重網頁的內容,抓取內容。
利用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://example.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中的內容,當讓w哦萌也可以直接請求CGI

async function crawlData(index, data) {
                    let dataUrl = `https://example.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);
                    // ...
                }
登入後複製

像有的網站,拉鉤,每次爬取的cookie都一樣,也能利用無頭瀏覽器取爬取,這樣每次就不用每次爬取的時候擔心cookie.

寫在最後

當然爬蟲不只這些,更多的是對網站進行分析,找到合適的爬蟲策略。對後關於puppeteer,不僅僅可以用來做爬蟲,因為可以編程,無頭瀏覽器,可以用來自動化測試等等。

以上是puppeteer爬蟲是什麼?爬蟲的工作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!