[Python爬蟲] 二、爬蟲原理之定義、分類、流程與編碼格式


往期內容提要:


一、爬蟲的定義、分類和流程

  • 爬蟲定義
    • 網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人)就是模擬瀏覽器發送網絡請求,接收請求響應,一種按照一定的規則,自動地抓取互聯網信息的程序。
    • 爬蟲就是模擬瀏覽器的行爲,越像越好,越像就越不容易被發現。
    • 原則上,只要是瀏覽器(客戶端)能做的事情,爬蟲都能夠做。
  • 爬蟲的分類
    • 通用爬蟲:通常指搜索引擎的爬蟲。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。
    • 聚焦爬蟲:針對特定網站的爬蟲,我們現在學習的網絡爬蟲,就是聚焦爬蟲
  • 爬蟲的流程
    爬蟲流程步驟如下:
    • 向起始url發送請求,並獲取響應
    • 對響應進行提取
    • 如果提取url,則繼續發送請求獲取響應
    • 如果提取數據,則將數據進行保存

在這裏插入圖片描述


(1) 通用爬蟲/搜索引擎(Search Engine)工作原理

在正式學習聚焦爬蟲前,我們先來了解通用爬蟲工作原理,進而釐清我們學習聚焦爬蟲之原因。

通用網絡爬蟲 從互聯網中搜集網頁,採集信息,這些網頁信息用於爲搜索引擎建立索引從而提供支持,它決定着整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響着搜索引擎的效果。

第一步:抓取網頁

搜索引擎網絡爬蟲的基本工作流程如下:

  1. 首先選取一部分的種子URL,將這些URL放入待抓取URL隊列;

  2. 取出待抓取URL,解析DNS得到主機的IP,並將URL對應的網頁下載下來,存儲進已下載網頁庫中,並且將這些URL放進已抓取URL隊列。

  3. 分析已抓取URL隊列中的URL,分析其中的其他URL,並且將URL放入待抓取URL隊列,從而進入下一個循環....

Robots協議(也叫爬蟲協議、機器人協議等),全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取,例如:

淘寶網:https://www.taobao.com/robots.txt

騰訊網: http://www.qq.com/robots.txt

第二步:數據存儲

搜索引擎通過爬蟲爬取到的網頁,將數據存入原始頁面數據庫。其中的頁面數據與用戶瀏覽器得到的HTML是完全一樣的。

搜索引擎蜘蛛在抓取頁面時,也做一定的重複內容檢測,一旦遇到訪問權重很低的網站上有大量抄襲、採集或者複製的內容,很可能就不再爬行。

第三步:預處理

搜索引擎將爬蟲抓取回來的頁面,進行各種步驟的預處理。

  • 提取文字
  • 中文分詞
  • 消除噪音(比如版權聲明文字、導航條、廣告等……)
  • 索引處理
  • 鏈接關係計算
  • 特殊文件處理
  • ....

除了HTML文件外,搜索引擎通常還能抓取和索引以文字爲基礎的多種文件類型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我們在搜索結果中也經常會看到這些文件類型。

但搜索引擎還不能處理圖片、視頻、Flash 這類非文字內容,也不能執行腳本和程序。

第四步:提供檢索服務,網站排名

搜索引擎在對信息進行組織和處理後,爲用戶提供關鍵字檢索服務,將用戶檢索相關的信息展示給用戶。

同時會根據頁面的PageRank值(鏈接的訪問量排名)來進行網站排名,這樣Rank值高的網站在搜索結果中會排名較前。

在這裏插入圖片描述


(2) 通用性搜索引擎存在着一定的侷限性:

  1. 通用搜索引擎所返回的結果都是網頁,而大多情況下,網頁裏90%的內容對用戶來說都是無用的。

  2. 不同領域、不同背景的用戶往往具有不同的檢索目的和需求,搜索引擎無法提供針對具體某個用戶的搜索結果。

  3. 萬維網數據形式的豐富和網絡技術的不斷髮展,圖片、數據庫、音頻、視頻多媒體等不同數據大量出現,通用搜索引擎對這些文件無能爲力,不能很好地發現和獲取。

  4. 通用搜索引擎大多提供基於關鍵字的檢索,難以支持根據語義信息提出的查詢,無法準確理解用戶的具體需求。

因此我們需要學習聚集爬蟲。聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,能儘量保證只抓取與需求相關的網頁信息。

在這裏插入圖片描述


二、編碼格式

(1) 爲什麼要掌握python3字符串的相關知識

  • str :unicode的呈現形式(網頁中的UTF-8就是Unicode的實現方式之一)
  • bytes(二進制) :互聯網上數據的都是以二進制的方式傳輸的——所以就需要將str轉換成bytes進行傳輸

bytes對象只負責以二進制字節序列的形式記錄所需記錄的對象,至於該對象到底表示什麼(比如到底是什麼字符)則由相應的編碼格式解碼所決定。其中 ASCII、GB2312、GB18030、Unicode這類字符集是各國家文字、標點符號、圖形符號、數字等的集合,str是這些字符集的呈現形式。

在這裏插入圖片描述

(2)python2、python3 與 bytes、str

Python2 中

>>> type(b'xxxxx')
<type 'str'>
>>> type('xxxxx')
<type 'str'>

Python3 中

>>> type(b'xxxxx')
<class 'bytes'>
>>> type('xxxxx')
<class 'str'>

Python 2 裏不區分bytes和str,bytes是Python 3中特有的。

實際應用中在互聯網上是通過二進制進行傳輸,所以就需要將str轉換成bytes進行傳輸,在Python 2中由於不區分str和bytes所以可以直接通過encode()和decode()方法進行編碼解碼。

而在Python 3中把兩者給分開了,所以就需要將str轉換成bytes進行傳輸,而在接收中通過decode()解碼成我們需要的編碼進行處理數據。這樣不管對方是什麼編碼而本地是我們使用的編碼這樣就不會亂碼。

encode
decode
str
bytes

str 使用encode方法轉化爲 bytes

bytes通過decode轉化爲str

(3)bytearray

bytearray和bytes不一樣的地方在於,bytearray是可變的。

In [26]: str1
Out[26]: '人生苦短,我用Python!'
In [28]: b1=bytearray(str1.encode())
In [29]: b1
Out[29]: bytearray(b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!')
In [30]: b1.decode()
Out[30]: '人生苦短,我用Python!'
In [31]: b1[:6]=bytearray('生命'.encode())
In [32]: b1
Out[32]: bytearray(b'\xe7\x94\x9f\xe5\x91\xbd\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!')
In [33]: b1.decode()
Out[33]: '生命苦短,我用Python!'

後期內容提要:


如果您有任何疑問或者好的建議,期待你的留言與評論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章