成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

puppeteer爬蟲

felix0913 / 2698人閱讀

摘要:爬蟲爬蟲又稱網(wǎng)絡(luò)機器人。每天或許你都會使用搜索引擎,爬蟲便是搜索引擎重要的組成部分,爬取內(nèi)容做索引。那我萌就來探討一下網(wǎng)絡(luò)爬蟲吧。對后關(guān)于不僅僅可以用來做爬蟲,因為可以編程,無頭瀏覽器,可以用來自動化測試等等。

@(爬蟲)[puppeteer|]

爬蟲又稱網(wǎng)絡(luò)機器人。每天或許你都會使用搜索引擎,爬蟲便是搜索引擎重要的組成部分,爬取內(nèi)容做索引?,F(xiàn)如今大數(shù)據(jù),數(shù)據(jù)分析很火,那數(shù)據(jù)哪里來呢,可以通過網(wǎng)絡(luò)爬蟲爬取啊。那我萌就來探討一下網(wǎng)絡(luò)爬蟲吧。

[TOC]

爬蟲的工作原理

如圖所示,這是爬蟲的流程圖,可以看到通過一個種子URL開啟爬蟲的爬取之旅,通過下載網(wǎng)頁,解析網(wǎng)頁中內(nèi)容存儲,同時解析中網(wǎng)頁中的URL 去除重復(fù)后加入到等待爬取的隊列。然后從隊列中取到下一個等待爬取的URL重復(fù)以上步驟,是不是很簡單呢?

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

上面也提到在爬取完一個網(wǎng)頁后從等待爬取的隊列中選取一個URL去爬去,那如何選擇呢?是選擇當(dāng)前爬取網(wǎng)頁中的URL 還是繼續(xù)選取當(dāng)前URL中同級URL呢?這里的同級URL是指來自同一個網(wǎng)頁的URL,這就是爬取策略之分。

廣度優(yōu)先策略(BFS)

廣度優(yōu)先策略便是將當(dāng)前某個網(wǎng)頁中URL先爬取完全,再去爬取從當(dāng)前網(wǎng)頁中的URL爬取的URL,這就是BFS,如果上圖的關(guān)系圖表示網(wǎng)頁的關(guān)系,那么BFS的爬取策略將會是:(A->(B,D,F,G)->(C,F));

深度優(yōu)先策略(DFS)

深度優(yōu)先策略爬取某個網(wǎng)頁,然后繼續(xù)去爬取從網(wǎng)頁中解析出的URL,直到爬取完。
(A->B->C->D->E->F->G)

下載網(wǎng)頁

下載網(wǎng)頁看起來很簡單,就像在瀏覽器中輸入鏈接一樣,下載完后瀏覽器便能顯示出來。當(dāng)然結(jié)果是并不是這樣的簡單。

模擬登錄

對于一些網(wǎng)頁來說需要登錄才能看到網(wǎng)頁中內(nèi)容,那爬蟲怎么登錄呢?其實登錄的過程就是獲取訪問的憑證(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.

獲取網(wǎng)頁內(nèi)容

有的網(wǎng)頁內(nèi)容是服務(wù)端渲染的,沒有CGI能夠獲得數(shù)據(jù),只能從html中解析內(nèi)容,但是有的網(wǎng)站的內(nèi)容并不是簡單的便能獲取內(nèi)容,像linkedin這樣的網(wǎng)站并不是簡單的能夠獲得網(wǎng)頁內(nèi)容,網(wǎng)頁需要通過瀏覽器執(zhí)行后才能獲得最終的html結(jié)構(gòu),那怎么解決呢?前面我萌提到瀏覽器執(zhí)行,那么我萌有沒有可編程的瀏覽器呢?puppeteer,谷歌chrome團隊開源的無頭瀏覽器項目,利用無頭瀏覽器便能模擬用戶訪問,便能獲取最重網(wǎng)頁的內(nèi)容,抓取內(nèi)容。
利用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;
}

執(zhí)行login()后便能像在瀏覽器中登錄后,便能像瀏覽器中登錄后便能獲取html中的內(nèi)容,當(dāng)讓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);
                    // ...
                }

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

寫在最后

當(dāng)然爬蟲不僅僅這些,更多的是對網(wǎng)站進行分析,找到合適的爬蟲策略。對后關(guān)于puppeteer,不僅僅可以用來做爬蟲,因為可以編程,無頭瀏覽器,可以用來自動化測試等等。

招納賢士

今日頭條長期大量招聘前端工程師,可選北京、深圳、上海、廈門等城市。歡迎投遞簡歷到 [email protected] / [email protected]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108611.html

相關(guān)文章

  • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    LinkedME2016 評論0 收藏0
  • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    Jeffrrey 評論0 收藏0
  • puppeteer爬蟲

    摘要:利用空閑時間,學(xué)習(xí)了下爬蟲,我也想爬取下網(wǎng)上的資源部分參數(shù)名稱參數(shù)類型參數(shù)說明在請求的過程中是否忽略報錯信息,默認(rèn)為是否以無頭的模式運行,也就是不顯示,默認(rèn)為可執(zhí)行文件的路徑,默認(rèn)是使用它自帶的如果你想指定一個自己的路徑,可以通過這個參數(shù)設(shè) 利用空閑時間,學(xué)習(xí)了下puppeteer爬蟲,我也想爬取下網(wǎng)上的資源 1.部分api puppeteer.launch(options) 參數(shù)...

    scola666 評論0 收藏0
  • 使用Node.js爬取任意網(wǎng)頁資源并輸出高質(zhì)量PDF文件到本地~

    摘要:上面只爬取了京東首頁的圖片內(nèi)容,假設(shè)我的需求進一步擴大,需要爬取京東首頁中的所有標(biāo)簽對應(yīng)的跳轉(zhuǎn)網(wǎng)頁中的所有的文字內(nèi)容,最后放到一個數(shù)組中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文適合無論是否有爬蟲以及Node.js基礎(chǔ)的朋友觀看~ 需求: 使用Node.js爬取網(wǎng)頁資源,開箱即用的配置 將爬取到的...

    seasonley 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<