Python構(gòu)建網(wǎng)頁爬蟲原理分析
既然本篇文章說到的是Python構(gòu)建網(wǎng)頁爬蟲原理分析,那么小編先給大家看一下Python中關(guān)于爬蟲的精選文章:
python爬蟲實戰(zhàn)之最簡單的網(wǎng)頁爬蟲教程
網(wǎng)絡(luò)爬蟲是當(dāng)今最常用的系統(tǒng)之一。最流行的例子是 Google 使用爬蟲從所有網(wǎng)站收集信息。除了搜索引擎之外,新聞網(wǎng)站還需要爬蟲來聚合數(shù)據(jù)源??磥恚灰阆刖酆洗罅康男畔?,你可以考慮使用爬蟲。
建立一個網(wǎng)絡(luò)爬蟲有很多因素,特別是當(dāng)你想擴(kuò)展系統(tǒng)時。這就是為什么這已經(jīng)成為最流行的系統(tǒng)設(shè)計面試問題之一。在這篇文章中,我們將討論從基本爬蟲到大型爬蟲的主題,并討論在面試中可能會遇到的各種問題。
1 - 基本解決方案
如何建立一個基本的網(wǎng)絡(luò)爬蟲?
在系統(tǒng)設(shè)計面試之前,我們已經(jīng)在《系統(tǒng)設(shè)計面試之前需要知道的八件事》中談到,就是從簡單的東西開始。讓我們專注于構(gòu)建在單線程上運行的基本網(wǎng)頁爬蟲。有了這個簡單的解決方案,我們可以繼續(xù)優(yōu)化。
要抓取單個網(wǎng)頁,我們只需要向相應(yīng)的 URL 發(fā)出 HTTP GET 請求,并解析響應(yīng)數(shù)據(jù),這是抓取工具的核心??紤]到這一點,一個基本的網(wǎng)絡(luò)爬蟲可以這樣工作:
以包含我們要抓取的所有網(wǎng)站的網(wǎng)址池開始。
對于每個 URL,發(fā)出 HTTP GET 請求來獲取網(wǎng)頁內(nèi)容。
解析內(nèi)容(通常為 HTML)并提取我們想要抓取的潛在網(wǎng)址。
添加新的網(wǎng)址到池中,并不斷抓取。
這取決于具體問題,有時我們可能會有一個獨立的系統(tǒng)來生成抓取網(wǎng)址。例如,一個程序可以不斷監(jiān)聽 RSS 訂閱,并且對于每個新文章,都可以將該 URL 添加到爬取池中。
2 - 規(guī)模問題
眾所周知,任何系統(tǒng)在擴(kuò)展后都會面臨一系列問題。在網(wǎng)絡(luò)爬蟲中,將系統(tǒng)擴(kuò)展到多臺機(jī)器時,有很多東西可能出錯。
在跳轉(zhuǎn)到下一節(jié)之前,請花幾分鐘的時間思考一下分布式網(wǎng)絡(luò)爬蟲的瓶頸,以及如何解決這個問題。在這篇文章的其余部分,我們將討論解決方案的幾個主要問題。
3 - 抓取頻率
你多久爬一次網(wǎng)站?
這聽起來可能不是什么大事,除非系統(tǒng)達(dá)到一定的規(guī)模,而且你需要非常新鮮的內(nèi)容。例如,如果你想要獲取上一小時的最新消息,則抓取工具可能需要每隔一小時不斷抓取新聞網(wǎng)站。但是這有什么問題呢?
對于一些小型網(wǎng)站,他們的服務(wù)器很可能無法處理這種頻繁的請求。一種方法是遵循每個站點的robot.txt。對于不知道robot.txt是什么的人,這基本是網(wǎng)站與網(wǎng)絡(luò)爬蟲交流的標(biāo)準(zhǔn)。它可以指定不應(yīng)該抓取什么文件,大多數(shù)網(wǎng)絡(luò)爬蟲都遵循配置。另外,你可以為不同的網(wǎng)站設(shè)置不同的抓取頻率。通常,每天只有幾個網(wǎng)站需要被多次抓取。
4 - 去重
在一臺機(jī)器上,你可以將 URL 池保留在內(nèi)存中,并刪除重復(fù)的條目。但是,分布式系統(tǒng)中的事情變得更加復(fù)雜?;旧希鄠€爬蟲可以從不同的網(wǎng)頁中提取相同的 URL,他們都希望將這個 URL 添加到 URL 池中。當(dāng)然,多次抓取同一頁面是沒有意義的。那么我們?nèi)绾稳ブ貜?fù)這些網(wǎng)址?
一種常用的方法是使用 Bloom Filter。簡而言之,布隆過濾器是一個節(jié)省空間的系統(tǒng),它允許你測試一個元素是否在一個集合中。但是,它可能有誤報。換句話說,如果布隆過濾器可以告訴你一個 URL 絕對不在池中,或者可能在池中。
為了簡要地解釋布隆過濾器是如何工作的,空布隆過濾器是m位(全0)的位數(shù)組。還有k個散列函數(shù),將每個元素映射到m位中的一個。所以當(dāng)我們在布隆過濾器中添加一個新的元素(URL)時,我們將從哈希函數(shù)中得到k位,并將它們?nèi)吭O(shè)置為1.因此,當(dāng)我們檢查一個元素的存在時,我們首先得到k位,如果它們中的任何一個不是1,我們立即知道該元素不存在。但是,如果所有的k位都是1,這可能來自其他幾個元素的組合。
布隆過濾器是一個非常常用的技術(shù),它是一個完美的解決方案,用于在網(wǎng)絡(luò)爬蟲中去重網(wǎng)址。
5 - 解析
從網(wǎng)站獲取響應(yīng)數(shù)據(jù)后,下一步是解析數(shù)據(jù)(通常是 HTML)來提取我們所關(guān)心的信息。這聽起來像一個簡單的事情,但是,可能很難使其健壯。
我們面臨的挑戰(zhàn)是,你總是會在 HTML 代碼中發(fā)現(xiàn)奇怪的標(biāo)記,URL 等,很難涵蓋所有的邊界情況。例如,當(dāng) HTML 包含非 Unicode 字符時,你可能需要處理編解碼問題。另外,當(dāng)網(wǎng)頁包含圖片,視頻甚至PDF 時,也會造成奇怪的行為。
另外,一些網(wǎng)頁都像使用 AngularJS 一樣通過 Javascript 呈現(xiàn),你的抓取工具可能無法得到任何內(nèi)容。
我會說沒有銀彈,不能為所有的網(wǎng)頁做一個完美的,健壯的爬蟲。你需要大量的健壯性測試,以確保它能夠按預(yù)期工作。
總結(jié)
還有很多我還沒有涉及到的有趣的話題,但是我想提一下其中的一些,這樣你就可以思考了。有一件事是檢測循環(huán)。許多網(wǎng)站包含鏈接,如A->B->C->A,你的爬蟲可能會永遠(yuǎn)運行。想想如何解決這個問題?
另一個問題是 DNS 查找。當(dāng)系統(tǒng)擴(kuò)展到一定的水平時,DNS 查找可能是一個瓶頸,你可能要建立自己的 DNS 服務(wù)器。
與許多其他系統(tǒng)類似,擴(kuò)展的網(wǎng)絡(luò)爬蟲可能比構(gòu)建單個機(jī)器版本困難得多,并且在系統(tǒng)設(shè)計面試中可以討論許多事情。嘗試從一些樸素的解決方案開始,并繼續(xù)優(yōu)化它,這可以使事情變得比看起來更容易。
以上就是我們總結(jié)的關(guān)于網(wǎng)頁爬蟲的相關(guān)文章內(nèi)容,大家如果還有其他想知道的可以在下方的留言區(qū)域討論,感謝大家對腳本之家的支持。
相關(guān)文章
Python學(xué)習(xí)筆記之For循環(huán)用法詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記之For循環(huán)用法,結(jié)合實例形式詳細(xì)分析了Python for循環(huán)的功能、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下2019-08-08
Python閉包之返回函數(shù)的函數(shù)用法示例
這篇文章主要介紹了 Python閉包之返回函數(shù)的函數(shù)用法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
使用Python和大模型進(jìn)行數(shù)據(jù)分析和文本生成
Python語言以其簡潔和強大的特性,成為了數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)和人工智能開發(fā)的首選語言之一,在這篇文章中,我將介紹如何用Python連接和使用大模型,并通過示例展示如何在實際項目中應(yīng)用這些技術(shù),需要的朋友可以參考下2024-05-05
python?動態(tài)導(dǎo)入模塊實現(xiàn)模塊熱更新的方法
這篇文章主要介紹了python?動態(tài)導(dǎo)入模塊,實現(xiàn)模塊熱更新,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
Django項目如何配置Memcached和Redis緩存?選擇哪個更有優(yōu)勢?
這篇文章主要介紹了Django項目如何配置Memcached和Redis緩存,幫助大家更好的理解和學(xué)習(xí)使用django框架,感興趣的朋友可以了解下2021-04-04
python2和python3實現(xiàn)在圖片上加漢字的方法
python2和python3實現(xiàn)在圖片上加漢字,最主要的區(qū)別還是內(nèi)部編碼方式不一樣導(dǎo)致的,在代碼上表現(xiàn)為些許的差別。這篇文章主要介紹了python2和python3實現(xiàn)在圖片上加漢字,需要的朋友可以參考下2019-08-08
conda虛擬環(huán)境下使用pyinstaller打包程序為exe文件全過程
pyinstaller是一個支持跨平臺使用的第三方庫,它可以將腳本執(zhí)行所需的模塊和庫,自動分析、收集并生成一個文件夾或者可執(zhí)行文件,這篇文章主要給大家介紹了關(guān)于conda虛擬環(huán)境下使用pyinstaller打包程序為exe文件的相關(guān)資料,需要的朋友可以參考下2023-12-12
python爬取w3shcool的JQuery課程并且保存到本地
本文主要介紹python爬取w3shcool的JQuery的課程并且保存到本地的方法解析。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能
這篇文章主要給大家介紹了關(guān)于Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能的相關(guān)資料,在Python環(huán)境下,利用百度AI開放平臺文字識別技術(shù),對表格類圖片進(jìn)行識別,需要的朋友可以參考下2021-09-09

