一文讀懂網路爬蟲
前言
在當前資料爆發的時代,資料分析行業勢頭強勁,越來越多的人涉足資料分析領域。進入領域最想要的就是獲取大量的資料來為自己的分析提供支援,但是如何獲取網際網路中的有效資訊?這就促進了“爬蟲”技術的飛速發展。
網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。
傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入佇列,直到滿足系統的一定停止條件。聚焦爬蟲的工作流程較為複雜,需要根據一定的網頁分析演算法過濾與主題無關的連結,保留有用的連結並將其放入等待抓取的URL佇列。然後,它將根據一定的搜尋策略從佇列中選擇下一步要抓取的網頁URL,並重覆上述過程,直到達到系統的某一條件時停止。
另外,所有被爬蟲抓取的網頁將會被系統存貯,進行一定的分析、過濾,並建立索引,以便之後的查詢和檢索;對於聚焦爬蟲來說,這一過程所得到的分析結果還可能對以後的抓取過程給出反饋和指導。
筆者是爬蟲初學者,通過這篇綜述來記錄一下自己的心得體會。
以下為文章主要內容:
1. 初見爬蟲
使用Python中的Requests第三方庫。在Requests的7個主要方法中,最常使用的就是get()方法,通過該方法構造一個向伺服器請求資源的Request物件,結果返回一個包含伺服器資源的額Response物件。通過Response物件則可以獲取請求的返回狀態、HTTP響應的字串即URL對應的頁面內容、頁面的編碼方式以及頁面內容的二進位制形式。
在瞭解get()方法之前我們先了解一下HTTP協議,通過對HTTP協議來理解我們訪問網頁這個過程到底都進行了哪些工作。
1.1 淺析HTTP協議
超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的www檔案都必須遵守這個標準。HTTP協議主要有幾個特點:
支援客戶/伺服器模式
簡單快捷:客服向伺服器發出請求,只需要傳送請求方法和路徑。請求方法常用的有GET, HEAD, POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度快。
靈活:HTTP允許傳輸任意型別的資料物件。
無連線:無連線的含義是限制每次連線請求只處理一個請求。伺服器處理完客戶的請求,收到客戶的應答後即斷開連線,這種方式可以節省傳輸時間。
無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事物處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大,另一方面,在伺服器不需要先前資訊時它的應答就較快。
下面通過一張圖我們來了解一下訪問網頁的過程都發生了什麼:
1. 首先瀏覽器拿到網址之後先將主機名解析出來。如 http://www.baidu.com/index.html 則會將主機名 www.baidu.com 解析出來。
2. 查詢ip,根據主機名,會首先查詢ip,首先查詢hosts檔案,成功則返回對應的ip地址,如果沒有查詢到,則去DNS伺服器查詢,成功就返回ip,否則會報告連線錯誤。
3. 傳送http請求,瀏覽器會把自身相關資訊與請求相關資訊封裝成HTTP請求 訊息傳送給伺服器。
4. 伺服器處理請求,伺服器讀取HTTP請求中的內容,在經過解析主機,解析站點名稱,解析訪問資源後,會查詢相關資源,如果查詢成功,則返回狀態碼200,失敗就會返回大名鼎鼎的404了,在伺服器監測到請求不在的資源後,可以按照程式設計師設定的跳轉到別的頁面。所以有各種有個性的404錯誤頁面。
5. 伺服器返回HTTP響應,瀏覽器得到返回資料後就可以提取資料,然後呼叫解析核心進行翻譯,最後顯示出頁面。之後瀏覽器會對其引用的檔案比如圖片,css,js等檔案不斷進行上述過程,直到所有檔案都被下載下來之後,網頁就會顯示出來。
HTTP請求,http請求由三部分組成,分別是:請求行、訊息報頭、請求正文。請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:
GET 請求獲取Request-URI所標識的資源
POST 在Request-URI所標識的資源後附加新的資料
HEAD 請求獲取由Request-URI所標識的資源的響應訊息報頭
PUT 請求伺服器儲存一個資源,並用Request-URI作為其標識
DELETE 請求伺服器刪除Request-URI所標識的資源
TRACE 請求伺服器回送收到的請求資訊,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求
GET方法應用舉例:在瀏覽器的位址列中輸入網址的方式訪問網頁時,瀏覽器採用GET方法向伺服器獲取資源,eg:GET /form.html HTTP/1.1 (CRLF)
HTTP響應也是由三個部分組成,分別是:狀態行、訊息報頭、響應正文。
狀態行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF,其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。
狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示資訊--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤--伺服器未能實現合法的請求
常見狀態程式碼、狀態描述、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常。
eg:HTTP/1.1 200 OK (CRLF)
詳細的HTTP協議可以參考這篇文章:
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
前面我們瞭解了HTTP協議,那麼我們訪問網頁的過程,那麼網頁在是什麼樣子的。爬蟲眼中的網頁又是什麼樣子的。
網是靜態的,但爬蟲是動態的,所以爬蟲的基本思想就是沿著網頁(蜘蛛網的節點)上的連結的爬取有效資訊。當然網頁也有動態(一般用PHP或ASP等寫成,例如使用者登陸介面就是動態網頁)的,但如果一張蛛網搖搖欲墜,蜘蛛會感到不那麼安穩,所以動態網頁的優先順序一般會被搜尋引擎排在靜態網頁的後面。
知道了爬蟲的基本思想,那麼具體如何操作呢?這得從網頁的基本概念說起。一個網頁有三大構成要素,分別是html檔案、css檔案和JavaScript檔案。如果把一個網頁看做一棟房子,那麼html相當於房子外殼;css相當於地磚塗料,美化房子外觀內飾;JavaScript則相當於傢俱電器浴池等,增加房子的功能。從上述比喻可以看出,html才是網頁的根本,畢竟地磚顏料在市場上也有,傢俱電器都可以露天擺設,而房子外殼才是獨一無二的。
下面就是一個簡單網頁的例子:
而在爬蟲眼裡,這個網頁是這樣的:
因此網頁實質上就是超文字(hypertext),網頁上的所有內容都是在形如“<>...</>”這樣的標籤之內的。如果我們要蒐集網頁上的所有超連結,只需尋找所有標籤中前面是"href="的字串,並檢視提取出來的字串是否以"http"(超文字轉換協議,https表示安全的http協議)開頭即可。如果超連結不以"http"開頭,那麼該連結很可能是網頁所在的本地檔案或者ftp或smtp(檔案或郵件轉換協議),應該過濾掉。
在Python中我們使用Requests庫中的方法來幫助我們實現對網頁的請求,從而達到實現爬蟲的過程。
1.2 Requests庫的7個主要方法:
最常用的方法get用來實現一個簡單的小爬蟲,通過示例程式碼展示:
2. Robots協議
Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網路爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。通過幾個小例子來解讀一下robots.txt中的內容,robots.txt預設放置於網站的根目錄小,對於一個沒有robots.txt檔案的網站,預設是允許所有爬蟲獲取其網站內容的。
我們對於robots協議的理解,如果是商業利益我們是必須要遵守robots協議內容,否則會承擔相應的法律責任。當只是個人玩轉網頁、練習則是建議遵守,提高自己編寫爬蟲的友好程度。
3. 網頁解析
BeautifulSoup嘗試化平淡為神奇,通過定位HTML標籤來格式化和組織複雜的網路資訊,用簡單易用的Python物件為我們展示XML結構資訊。
BeautifulSoup是解析、遍歷、維護“標籤樹”的功能庫。
3.1 BeautifulSoup的解析器
BeautifulSoup通過以上四種解析器來對我們獲取的網頁內容進行解析。使用官網的例子來看一下解析結果:
首先獲取以上的一段HTML內容,我們通過BeautifulSoup解析之後,並且輸出解析後的結果來對比一下:
通過解析的網頁內容,我們就可以使用BeautifulSoup中的方法來輕而易舉的獲得網頁中的主要資訊:
3.2 BeautifulSoup類的基本元素
3.3 BeautifulSoup的遍歷功能
遍歷分為上行遍歷、下行遍歷、平行遍歷三種。
下行遍歷:
上行遍歷:
平行遍歷:
4. 正則表示式
正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文字。
筆者也是初學正則表示式,感覺自己不能簡潔清晰的講述正則表示式,建議參考網上的教程( http://deerchao.net/tutorials/regex/regex.htm#mission )圖文並茂,詳細講解了正則表示式。
通過掌握正則表示也可以幫助我們獲取網頁中的主要資訊。
5. 爬蟲框架Scrapy
Scrapy是Python開發的一個快速,高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料。Scrapy用途廣泛,可以用於資料探勘、監測和自動化測試。
Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種型別爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支援。
5.1 Scrapy爬蟲框架結構
Engine: 控制所有模組之間的資料流、根據條件觸發事件。
Downloader: 根據請求下載網頁
Scheduler: 對所有爬去請求進行排程管理
Spider: 解析Downloader返回的響應、產生爬取項、產生額外的爬去請求。
Item Pipelines: 以流水線方式處理Spider產生的爬取項、可能包括清理、檢驗和查重爬取項中的HTML資料、將資料儲存到資料庫。
5.2 資料流
1. 引擎開啟一個網站(open a domain),找到處理該網站的Spider並向該spider請求第一個要爬取的URL(s)。
2. 引擎從Spider中獲取到第一個要爬取的URL並在排程器(Scheduler)以Request排程。
3. 引擎向排程器請求下一個要爬取的URL。
4. 排程器返回下一個要爬取的URL給引擎,引擎將URL通過下載中介軟體(請求(request)方向)轉發給下載器(Downloader)。
5. 一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其通過下載中介軟體(返回(response)方向)傳送給引擎。
6. 引擎從下載器中接收到Response並通過Spider中介軟體(輸入方向)傳送給Spider處理。
7. Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。
8. 引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給排程器。
9. (從第二步)重複直到排程器中沒有更多地request,引擎關閉該網站。
6. 分散式爬蟲
6.1 多執行緒爬蟲
在爬取資料量小的情況下,我們使用的都是序列下載網頁的,只有前一次下載完成之後才會啟動新的下載。資料量小的情況下尚可應對。但面對大型網站就會顯得效能不足,如果我們可以同時下載多個網頁,那麼下載時間將會得到顯著改善。
我們將序列下載爬蟲擴充套件成並行下載。需要注意的是如果濫用這一功能,多執行緒爬蟲請求內容過快,可能會造成伺服器過載,或是IP地址被封禁。為了避免這一問題,我們的爬蟲就要設定一個delay標識,用於設定請求同一域名時的最小時間間隔。
在Python中實現多執行緒是比較簡單的,Python中的thread模組是比較底層的模組,Python的threading模組是對thread做了一些封裝,可以更加方便的被使用。
簡要的看一下thread模組中含函式和常量:
Thread中常用的函式和物件:
一般來說,使用執行緒有兩種模式, 一種是建立執行緒要執行的函式, 把這個函式傳遞進Thread物件裡,讓它來執行. 另一種是直接從Thread繼承,建立一個新的class,把執行緒執行的程式碼放到這個新的class裡。
實現多程序的程式碼和例子參考:
http://www.jianshu.com/p/86b8e78c418a
6.2 多程序爬蟲
Python中的多執行緒其實並不是真正的多執行緒,並不能做到充分利用多核CPU資源。
如果想要充分利用,在python中大部分情況需要使用多程序,那麼這個包就叫做 multiprocessing。
藉助它,可以輕鬆完成從單程序到併發執行的轉換。multiprocessing支援子程序、通訊和共享資料、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等元件。
Process基本使用:
在multiprocessing中,每一個程序都用一個Process類來表示。首先看下它的API:
target 表示呼叫物件,你可以傳入方法的名字
args 表示被呼叫物件的位置引數元組,比如target是函式a,他有兩個引數m,n,那麼args就傳入(m, n)即可
kwargs 表示呼叫物件的字典
name 是別名,相當於給這個程序取一個名字
group 分組,實際上不使用
我們先用一個例項來感受一下:
最簡單的建立Process的過程如上所示,target傳入函式名,args是函式的引數,是元組的形式,如果只有一個引數,那就是長度為1的元組。
然後呼叫start()方法即可啟動多個程序了。
另外你還可以通過 cpu_count() 方法還有 active_children() 方法獲取當前機器的 CPU 核心數量以及得到目前所有的執行的程序。
通過一個例項來感受一下:
執行結果:
通過開啟多個程序實現爬蟲,會大大縮減爬取資訊的速度。詳細介紹請參考:
http://cuiqingcai.com/3335.html
7. 非同步網站資料採集
在收集網頁資訊時我們會遇到,網頁的載入模型為瀑布流形式,頁面URL沒有改變,但依然可以加載出內容。這時候就需要我們分析網頁中JavaScript中的一些程式碼,從中獲取我們所需要的資料。
面對使用JS渲染的頁面推薦使用PhantomJS,無介面,可指令碼程式設計的WebKit瀏覽器。參考 : http://cuiqingcai.com/2577.html
Selenium一種自動化測試工具。可以方便實現Web介面測試。使用PhantomJS渲染解析JS,Selenium用來驅動以及寫與Python的對接,然後Python進行後期處理。參考: http://cuiqingcai.com/2599.html
8. 爬蟲的儲存
在剛開始接觸爬蟲的時候,我們習慣將小的爬蟲結果輸出在命令列中,看著命令列中一行行的資料顯得頗有成就感,但是隨著資料的增多,並且需要進行資料分析時,將資料列印到命令列就不是辦法了。為了可以遠端使用大部分網路爬蟲,我們還是需要將收集的資料儲存起來。
8.1 媒體檔案
媒體檔案常見的有兩種儲存方式:只獲取URL連結,或者直接把原始檔下載下來。但是推薦使用第一種方式。優點如下:
爬蟲執行的更快,耗費的流量更少,因為只儲存連結,不需要下載檔案。
節省儲存空間,因為不需要儲存媒體檔案。
儲存URL的程式碼更容易寫,也不需要實現檔案下載程式碼
不下載檔案能夠降低目標主機伺服器的負載。
當然這樣做也存在一些缺點:
內嵌在我們網頁中的外站連結被稱為盜鏈,使用這種連結會讓我們麻煩不斷,每個網站都會實施防盜鏈措施。
因為你的連結檔案在別人的伺服器,所以我們的應用就要跟著別人的節奏運行了。
盜鏈很容易改變,如果把盜鏈放在部落格等地,被對方發現很可能被惡搞。或者是把URL儲存備用,等到用的時候發現連結已經過期了。
在現實中網路瀏覽器不僅可以訪問HTML頁面並切換頁面,它們也會下載訪問頁面上的所有資源。下載檔案會讓我們的爬蟲看起來更像人在瀏覽頁面。
8.2 把資料儲存到CSV
CSV是儲存表格資料的常用檔案格式。每行都用一個換行符分隔,列與列之間用逗號分隔。Python中的CSV庫可以非常簡單的修改CSV檔案,也可以從零開始建立一個CSV檔案:
我們可以使用csv模組提供的功能將爬蟲獲取的資訊存入csv檔案中。
8.3 MySQL
對於大量的爬蟲資料,並且在之後我們需要反覆用來篩選分析的資料,我們選擇儲存在資料庫中。
MySQL是目前最受歡迎的開源關係型資料庫管理系統,它是一種非常靈活、穩定、功能齊全的DBMS,許多頂級網站都在用它,YouTube、Twitter、Facebook等。
Python中沒有內建的MySQL支援工具,不過,有很多開源的庫可以用來與MySQL做互動,最為出名的就是PyMySQL。
結合上述過程將爬蟲獲取到的資料存入資料庫中。
9. 爬蟲的常見技巧
9.1 模擬登入
目前的網站多是採用cookie跟蹤使用者是否已經登入的資訊。一旦網站驗證了你的登入權證,它就會儲存在你瀏覽器的cookie中,裡面通常包含一個伺服器生成的命令牌、登入有效時限和狀態跟蹤資訊。網站會把這個cookie當作資訊驗證的證據,在我們瀏覽網站的每個頁面時出示給伺服器。
通過Chrome等瀏覽器自帶的開發者工具,我們從Network中獲取請求網頁的頭部和表單,在Header中我們就可以檢視cookie中儲存的登入資訊,我們可以通過Scrapy設定請求網頁的頭部資訊,並將cookie儲存在本地,來實現模擬登陸的效果。詳細的操作可以檢視部落格:http://www.jianshu.com /p/b7f41df6202d
9.2 網頁驗證碼
簡單的說,驗證碼就是一張圖片,圖片上有字串。網站是如何實現的呢?有WEB基礎的人可能會知道,每個瀏覽器基本都有cookie,作為這次回話的唯一標示。每次訪問網站,瀏覽器都會把這個cookie傳送給伺服器。驗證碼就是和這個cookie繫結到一起的。如何理解呢?舉個例子,現在有網站W,有A和B兩個人,同時訪問W,W給A返回的驗證碼是X,給B返回的驗證碼是Y,這兩個驗證碼都是正確的,但是如果A輸入了B的驗證碼,肯定驗證不通過。那伺服器是怎麼區分A和B呢,就是用到的cookie。再舉個例子,有些網站你登入一次之後,下次繼續訪問可能就自動登陸了,也是用cookie來標示唯一身份的,如果清除了cookie也就無法自動登陸了。
對於一些簡單的驗證碼我們可以通過機器識別,但是對於一些人眼都很難識別的驗證碼就只能尋找更加複雜的技術了。簡單的驗證碼識別過程就是對驗證碼圖片的一個處理過程。
灰度圖轉換,可以結合opencv中的imread方法。
影象去噪(均值濾波器、高斯濾波器等等)。
影象二值化(這個過程中驗證碼中的字串已經成為黑色的,底色為白色)。
使用影象識別方式,識別圖中的字串達到識別驗證碼的目的。
推薦閱讀:
http://www.jianshu.com/p/dd699561671b
http://www.cnblogs.com/hearzeus/p/5166299.html(上篇)
http://www.cnblogs.com/hearzeus/p/5226546.html(下篇)
9.3 爬蟲代理池
由於筆者是個爬蟲初學者也沒有用到過這麼複雜的技術,不過筆者在爬蟲的過程中的確是體會了被封IP地址的痛苦。所以推薦大家有精力的可以來學習並完成一個。
推薦閱讀:
https://www.zhihu.com/question/47464143
10. 防爬蟲
由於暴力爬蟲會對網站的伺服器產生很大的壓力,所以各個網站對爬蟲都有限制,大多數網站會定義robots.txt.檔案可以讓爬蟲瞭解該網站的限制。限制是作為建議給出。但是爬蟲前檢查該檔案可以最小化我們的爬蟲被封禁的可能。
相關推薦
一文讀懂網路爬蟲
前言在當前資料爆發的時代,資料分析行業勢頭強勁,越來越多的人涉足資料分析領域。進入領域最想要的就是獲取大量的資料來為自己的分析提供支援,但是如何獲取網際網路中的有效資訊?這就促進了“爬蟲”技術的飛速發展。網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則
【CNN】一文讀懂卷積神經網路CNN
本文為大家解讀如何簡單明瞭的解釋卷積,並且分享了學習中的一些方法案例。 首先文章的提綱為: CNN栗子鎮樓 What is CNN 什麼是卷積 什麼是池化 Why CNN 對
深度 | 生成對抗網路初學入門:一文讀懂GAN的基本原理(附資源)
選自 Sigmoidal 作者:Roman Trusov 機器之心編譯 參與:Panda 生成對抗網路是現在人工智慧領域的當紅技術之一。近日,Sigmoidal.io 的部落格發表了一篇入門級介紹文章,對 GAN 的原理進行了解釋說明。另外,在該文章的最後還附帶了一些能幫助初學者自己
一文讀懂對抗生成網路的3種模型
https://www.toutiao.com/i6635851641293636109/ 2018-12-17 14:53:28 基於對抗生成網路技術的線上工具edges2cats, 可以為簡筆畫塗色 前言 在GAN系
一文讀懂神經網路(附PPT、視訊)
來源:雲棲社群本文共6500字,建議閱讀10分鐘。本文從神經網路的發展歷史出發,為你介紹感知器模
一文讀懂BP神經網路
轉自一位懂生活的女神的部落格園的文章。http://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文版的譯者
一文讀懂複雜網路(應用、模型和研究歷史)
出處:https://yq.aliyun.com/articles/231424?do=login#摘要: 隨著近幾年關於複雜網路(Complex network)理論及其應用研究的不斷深入,已有大量關於複雜網路的文章發表在Science,ature,RL,NAS等國際一流的
一文讀懂生成對抗網路GANs(附學習資源)
原文標題:AnIntuitive Introduction to Generative Adve
一文讀懂卷積神經網路中的1x1卷積核
前言 在介紹卷積神經網路中的1x1卷積之前,首先回顧卷積網路的基本概念[1]。 卷積核(convolutional kernel):可以看作對某個區域性的加權求和;它是對應區域性感知,它的原理是在觀察某個物體時我們既不能觀察每個畫素也不能一次觀察整體,而是
一文讀懂大數據計算框架與平臺
ddr 不同 失敗 克服 可定制 同時 數據庫引擎 後處理 alc 1.前言 計算機的基本工作就是處理數據,包括磁盤文件中的數據,通過網絡傳輸的數據流或數據包,數據庫中的結構化數據等。隨著互聯網、物聯網等技術得到越來越廣泛的應用,數據規模不斷增加,TB、PB量級成為常
一文讀懂 超簡單的 structured stream 源碼解讀
ket exec res exce bus sin imp += work 為了讓大家理解structured stream的運行流程,我將根據一個代碼例子,講述structured stream的基本運行流程和原理。 下面是一段簡單的代碼: 1 val spark =
一文讀懂Spring Boot、微服務架構和大數據治理之間的故事
Springboot微服務架構 微服務的誕生並非偶然,它是在互聯網高速發展,技術日新月異的變化以及傳統架構無法適應快速變化等多重因素的推動下誕生的產物。互聯網時代的產品通常有兩類特點:需求變化快和用戶群體龐大,在這種情況下,如何從系統架構的角度出發,構建靈活、易擴展的系統,快速應對需求的變化;同時,隨著用戶的
一文讀懂阻塞、非阻塞、同步、異步IO
UC max register class 掃描 基本 角度 cloud 問題: 介紹 在談及網絡IO的時候總避不開阻塞、非阻塞、同步、異步、IO多路復用、select、poll、epoll等這幾個詞語。在面試的時候也會被經常問到這幾個的區別。本文就來講一下這幾個詞
一文讀懂架構師都不知道的isinstance檢查機制
Python起步通過內建方法 isinstance(object, classinfo) 可以判斷一個對象是否是某個類的實例。但你是否想過關於鴨子協議的對象是如何進行判斷的呢? 比如 list 類的父類是繼 object 類的,但通過 isinstance([], typing.Iterable) 返回的卻是
【深度學習】一文讀懂機器學習常用損失函數(Loss Function)
back and 們的 wiki 導出 歐氏距離 classes 自變量 關於 最近太忙已經好久沒有寫博客了,今天整理分享一篇關於損失函數的文章吧,以前對損失函數的理解不夠深入,沒有真正理解每個損失函數的特點以及應用範圍,如果文中有任何錯誤,請各位朋友指教,謝謝~
從HTTP/0.9到HTTP/2:一文讀懂HTTP協議的歷史演變和設計思路
eight 結果 key 視頻 this sso單點登陸 會有 研究 patch 本文原作者阮一峰,作者博客:ruanyifeng.com。 1、引言 HTTP 協議是最重要的互聯網基礎協議之一,它從最初的僅為瀏覽網頁的目的進化到現在,已經是短連接通信的事實工業標準,最新版
一文讀懂以太坊代幣合約
規則 sta ini class 2015年 交易 存在 部分 生活 本文首發自 https://www.secpulse.com/archives/73696.html ,轉載請註明出處。 工欲善其事,必先利其器。要想挖掘和分析智能合約的漏洞,你必須要先學會看
什麽是音視頻直播雲服務 ? 一文讀懂
type 限制 推流 數據 優缺點 視頻通訊系統 最終 通訊 地理 說到音視頻雲服務,大多數人可能聯想到的是網絡直播應用場景,實際上,硬件對音視頻雲服務的需求也在逐漸提升。而這樣的市場需求也推動了整個行業的發展,目前,阿裏雲、騰訊雲和網易雲等巨頭都已入局,除此之外還有即構科
一文讀懂機器學習大殺器XGBoost原理
結構 近似算法 機器 form con gin fff .cn tran http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在
一文讀懂什麽是Java中的自動拆裝箱
.com 空指針異常 http har 三目運算 容器 ava eof 關系 基本數據類型 基本類型,或者叫做內置類型,是Java中不同於類(Class)的特殊類型。它們是我們編程中使用最頻繁的類型。 Java是一種強類型語言,第一次申明變量必須說明數據類型,第一次變量