1、爬蟲概述
爬蟲、又被稱為網(wǎng)路爬蟲,主要指從互聯(lián)網(wǎng)上進(jìn)行數(shù)據(jù)采集的腳本——后者程序,是進(jìn)行數(shù)據(jù)分析和數(shù)據(jù)挖掘的基礎(chǔ)。
教程主要從如下幾方面對(duì)爬蟲進(jìn)行解說明:
- 爬蟲基本概念:了解什么是爬蟲,對(duì)于爬蟲程序的定位
- 爬蟲的基本操作:了解爬蟲程序的開發(fā)流程和底層操作
- 爬蟲的數(shù)據(jù)篩選:對(duì)爬蟲采集的目標(biāo)數(shù)據(jù)和有效數(shù)據(jù)的分析和篩選
- 企業(yè)級(jí)普通爬蟲程序:常規(guī)爬蟲程序的開發(fā)處理流程
- 大數(shù)據(jù)爬蟲程序:分布式爬蟲程序的開發(fā)處理步驟
- 反爬蟲操作:分布在每個(gè)章節(jié),針對(duì)反爬蟲的處理措施進(jìn)行分析和處理
1.1、爬蟲分類
根據(jù)項(xiàng)目中的使用情況進(jìn)行區(qū)分,主要分為兩大類:通用大蟲和聚焦爬蟲
根據(jù)采集數(shù)據(jù)的過程進(jìn)行區(qū)分,又可分為兩大類型:累積爬蟲和增量爬蟲
11.1、通用怕成 & 聚焦爬蟲
通用爬蟲:最常見的數(shù)據(jù)采集程序,是網(wǎng)絡(luò)上搜索引擎使用的腳本程序,搜索引擎通過通用爬蟲進(jìn)行互聯(lián)網(wǎng)上的數(shù)據(jù)采集,提供給自己的客戶進(jìn)行數(shù)據(jù)搜索使用;通用爬蟲采集的數(shù)據(jù)具有普遍性,針對(duì)性較差;但是通用爬蟲的重用性較高,一旦開發(fā)調(diào)試完成,可以長(zhǎng)時(shí)間運(yùn)行給搜索引擎需要的數(shù)據(jù)
- 最常見的就是百度搜索、谷歌搜索等等各種搜索引擎,一百度搜索為例進(jìn)行關(guān)鍵詞搜索時(shí),點(diǎn)擊搜索結(jié)果中的百度快照,就可以查看到通用爬蟲采集數(shù)據(jù)的痕跡。
聚焦爬蟲:是數(shù)據(jù)供應(yīng)商企業(yè)使用最多的爬蟲程序,通常情況針對(duì)指定的范圍的數(shù)據(jù)進(jìn)行定向的數(shù)據(jù)采集和篩選,能在一定時(shí)間段內(nèi)最大限度的采集企業(yè)需要的有效數(shù)據(jù);但是重用性較差,一般針對(duì)不同數(shù)據(jù)需求、需要獨(dú)立開發(fā)爬蟲程序進(jìn)行數(shù)據(jù)采集
1.1.2、累積爬蟲 & 增量爬蟲
累積爬蟲:目標(biāo)數(shù)據(jù)一旦生成,不會(huì)發(fā)生改動(dòng),隨著時(shí)間的延伸數(shù)據(jù)量逐漸增大,累積爬蟲就是采集這樣的數(shù)據(jù),采集并保存歷史數(shù)據(jù)之后針對(duì)新生的數(shù)據(jù)進(jìn)一步獲取,采集過程中不會(huì)更新歷史數(shù)據(jù);如采集期權(quán)股票的數(shù)據(jù)、房地產(chǎn)地域價(jià)格歷史數(shù)據(jù)等等
增量爬蟲:目標(biāo)數(shù)據(jù)在需求更改過程中,可能會(huì)隨時(shí)發(fā)生變化;歷史數(shù)據(jù)的變動(dòng)和新增數(shù)據(jù)都被稱為增量,所以針對(duì)此類數(shù)據(jù)采集的爬蟲程序,稱為增量爬蟲;增量爬蟲的特點(diǎn)就是在采集數(shù)據(jù)的過程中隨機(jī)更新歷史數(shù)據(jù)的同時(shí)采集新增數(shù)據(jù)。如:搜索引擎采集網(wǎng)絡(luò)數(shù)據(jù),網(wǎng)絡(luò)上的頁(yè)面數(shù)據(jù)隨時(shí)可能發(fā)生變化,需要爬蟲針對(duì)采集的歷史數(shù)據(jù)隨時(shí)進(jìn)行更新并采集新增的網(wǎng)頁(yè)數(shù)據(jù)。
1.1.3、robot協(xié)議
活躍在網(wǎng)絡(luò)上的數(shù)據(jù)本身就是需要相關(guān)的客戶進(jìn)行訪問查看的,所以正常情況下網(wǎng)絡(luò)客戶能查看到的數(shù)據(jù)爬蟲一般都能采集處理;
但是很多情況下有些數(shù)據(jù)是受到保護(hù)的,網(wǎng)站一般發(fā)表聲明該類型數(shù)據(jù)被當(dāng)前網(wǎng)站版權(quán)保護(hù),其個(gè)人或者單位不能將該網(wǎng)站數(shù)據(jù)用于其他網(wǎng)站或者商業(yè)目的等,就是一種比較常規(guī)的限制。
同時(shí)在網(wǎng)絡(luò)上活躍著很多深層網(wǎng)絡(luò)數(shù)據(jù),進(jìn)行爬蟲數(shù)據(jù)采集的過程中,很有可能會(huì)從正常網(wǎng)頁(yè)中采集到該類型的URl 地址并獲取數(shù)據(jù),該類型數(shù)據(jù)極有可能回事涉密數(shù)據(jù),如果進(jìn)行非法訪問和采集會(huì)——民事責(zé)任 / 刑事責(zé)任
ROBOT 協(xié)議就是針對(duì)這樣的問題出現(xiàn)的規(guī)范和約束,一般稍有安全意識(shí)的網(wǎng)站都會(huì)有自己的robot協(xié)議,協(xié)議規(guī)范了允許爬蟲采集的網(wǎng)站地址列表和禁止訪問的地址列表,方便爬蟲程序在采集的過程中進(jìn)行參考使用。
訪問(https://ziyuan.baidu.com/robots/index)
1.2、為什么要使用爬蟲
爬蟲的作用是從網(wǎng)站上采集(下載)數(shù)據(jù)的,目前市場(chǎng)上流行的下載工具比比皆是,使用爬蟲的優(yōu)勢(shì) 和使用場(chǎng)景的目的性一定要明確:
爬蟲的優(yōu)勢(shì)是將下載數(shù)據(jù)的過程通過編寫的程序?qū)崿F(xiàn)自動(dòng)化批量處理,但是自動(dòng)化有兩個(gè)前提條件:需要編寫程序、可以批量處理;這兩個(gè)前提條件同時(shí)也說明了爬蟲的使用場(chǎng)景
- 采集數(shù)據(jù)之前,對(duì)目標(biāo)數(shù)據(jù)進(jìn)行分析,并編寫程序代碼
- 目標(biāo)數(shù)據(jù)是批量數(shù)據(jù)(非單個(gè)、極少數(shù)量數(shù)據(jù)),批量數(shù)據(jù)有自己的組成規(guī)律(尋找規(guī)律進(jìn)行爬?。?/li>
1.3、爬蟲使用注意事項(xiàng)
爬蟲技術(shù)在一定程度與上還是備受爭(zhēng)議的,尤其是聚焦爬蟲在數(shù)據(jù)處理過程中對(duì)于目標(biāo)數(shù)據(jù)所在的服務(wù)器會(huì)造成短時(shí)間的壓力提升;爬蟲程序由于程序本身的特殊性,在一定程度上可能會(huì)引發(fā)對(duì)一些網(wǎng)站的惡意攻擊行為;爬蟲采集數(shù)據(jù)的過程中對(duì)于數(shù)據(jù)的涉密性區(qū)分不是很嚴(yán)格,主要開人工手段進(jìn)行篩選操作:所以爬蟲處理過程中一定注意如下:
- 爬蟲采集的目標(biāo)數(shù)據(jù)量進(jìn)行分析
- 爬蟲采集的目標(biāo)數(shù)據(jù)涉密性進(jìn)行分析
- 爬蟲采集的目標(biāo)數(shù)據(jù)的頻率進(jìn)行分析
2、爬蟲基礎(chǔ)
簡(jiǎn)單入門掌握學(xué)習(xí),熟悉爬蟲步驟處理,對(duì)于爬蟲采集數(shù)據(jù)有初步認(rèn)識(shí)。
2.1、入門程序
爬蟲采集數(shù)據(jù),主要采集網(wǎng)站數(shù)據(jù),通常情況下操作步驟如下:
- 確定目標(biāo)網(wǎng)站URL地址
- 對(duì)目標(biāo)URL地址發(fā)送請(qǐng)求
- 獲取網(wǎng)站返回的響應(yīng)數(shù)據(jù)
- 對(duì)響應(yīng)數(shù)據(jù)進(jìn)行解析處理
- 得到目標(biāo)數(shù)據(jù)
操作過程的偽代碼如下:
import 依賴的模塊 ——————#引入依賴
url = “目標(biāo)網(wǎng)站確定的具體url地址” ————#定義目標(biāo)url
response = request . open (url) ————#f發(fā)送請(qǐng)求
html = response . 數(shù)據(jù)() ————#得到相應(yīng)的目標(biāo)數(shù)據(jù)
content = html 。 解碼() ————#解碼得到正確的數(shù)據(jù)
python3中處理采集數(shù)據(jù)的內(nèi)置模塊主要是urllib,該模塊中包含了大量的和爬蟲操 作的相關(guān)功能模塊和函數(shù)處理,按照上述步驟進(jìn)行操作,具體代碼編寫如下:
#引入需要的依賴模塊
from urllib import request
#向服務(wù)器發(fā)送請(qǐng)求,獲取相應(yīng)對(duì)象
response = request.urlopen("http://baidu.com/")
#從相應(yīng)對(duì)象中獲取服務(wù)器返回的數(shù)據(jù)
html = response.read()
#獲取的數(shù)據(jù)進(jìn)行編碼處理、打印
print(html.decode())
2.2、URLLIB模塊
URLLIB模塊是一個(gè)高級(jí)的 web 交流庫(kù),其核心功能就是模仿web瀏覽器等客戶端,去請(qǐng)求相應(yīng)的資源,并返回一個(gè)類文件對(duì)象。urllib 支持各種 web 協(xié)議,例如:HTTP、FTP、Gopher;同時(shí)也支持對(duì)本地文件進(jìn)行訪問。
urlopen返回對(duì)象提供方法:
- read() , readline() ,readlines() , fileno() , close() :這些方法的使用方式與文件對(duì)象完全一樣
- info():返回一個(gè)httplib.HTTPMessage對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息
- getcode():返回Http狀態(tài)碼。如果是http請(qǐng)求,200請(qǐng)求成功完成;404網(wǎng)址未找到
- geturl():返回請(qǐng)求的url
詳細(xì)urllib講解單獨(dú)章節(jié)~
2.3、數(shù)據(jù)編碼處理
我們通過爬蟲程序可以得到網(wǎng)站返回的數(shù)據(jù),但是返回的數(shù)據(jù)在展示過程中,出現(xiàn)了亂碼的問題,是因?yàn)榫W(wǎng)站本身有自己的字符編碼(通常情況下是“utf-8”’),我們程序在采集完成之后再控制臺(tái)進(jìn)行展示的過程中是使用本地默認(rèn)的編碼(windows 一般是gbk、Unix 中一般是utf-8),如果兩部分編碼不一致,就不出現(xiàn)亂碼的問題。
- 網(wǎng)頁(yè)結(jié)構(gòu)中的編碼,一般會(huì)定義在<meta charest=" "> 標(biāo)簽中,所以爬蟲采集網(wǎng)頁(yè)數(shù)據(jù)時(shí)可以分成兩個(gè)步驟進(jìn)行操作,先采集批量網(wǎng)頁(yè)中的一個(gè)網(wǎng)頁(yè)查看編碼格式,然后在代碼中根據(jù)指定編碼格式進(jìn)行解碼,得到正確數(shù)據(jù)之后,再進(jìn)行批量網(wǎng)頁(yè)數(shù)據(jù)的采集;這樣的操作方式是手工指定編碼方式。
#引入需要的依賴模塊
from urllib import request
#向服務(wù)器發(fā)送請(qǐng)求,獲取相應(yīng)對(duì)象
response = request.urlopen("https://baidu.com/")
#從相應(yīng)對(duì)象中獲取服務(wù)器返回的數(shù)據(jù)
html = response.read()
#獲取的數(shù)據(jù)進(jìn)行編碼處理
get_html = html.decode('utf-8')
# 打印
print(get_html)
但是手工指定編碼方式的操作,存在很大的局限性,批量網(wǎng)頁(yè)處理過程中一旦出現(xiàn)不同編碼格式的網(wǎng)頁(yè),很容易造成程序異常導(dǎo)致數(shù)據(jù)遺漏,所以我們可以通過python第三方模塊進(jìn)行目標(biāo)數(shù)據(jù)的分析判斷,得到一個(gè)具體的編碼格式,然后通過該檢測(cè)的編碼格式進(jìn)行數(shù)據(jù)的解碼工作
remark: 通過chardet模塊可以直接檢測(cè)目標(biāo)數(shù)據(jù)的編碼格式,但是編碼格式只是一個(gè)檢測(cè)的概率值,所以在編碼解碼錯(cuò)誤的情況下,需要人工介入進(jìn)行解碼操作
#引入需要的依賴模塊
from urllib import request
import chardet
#向服務(wù)器發(fā)送請(qǐng)求,獲取相應(yīng)對(duì)象
response = request.urlopen("https://baidu.com/")
#從相應(yīng)對(duì)象中獲取服務(wù)器返回的數(shù)據(jù)
html = response.read()
#獲取的數(shù)據(jù)進(jìn)行編碼處理
encoding = chardet.detect(html).get('encoding')
get_html = html.decode(encoding)
# 打印
print(get_html)
2.4、請(qǐng)求對(duì)象的包裝
前面的代碼中,目標(biāo)網(wǎng)站的url地址就是一個(gè)普通的字符串,通過該字符串可以發(fā)起一個(gè)具體的請(qǐng)求、但是在網(wǎng)站操作過程中,客戶端發(fā)送的一個(gè)請(qǐng)求可能會(huì)包含較多的格式數(shù)據(jù)如:請(qǐng)求url、請(qǐng)求頭、請(qǐng)求體、參數(shù)、cookie等等數(shù)據(jù);
爬蟲操作就是在模擬真實(shí)用戶的操作,請(qǐng)求的操作可以通過請(qǐng)求對(duì)象的方式進(jìn)行模擬,在python3中的urllib模塊下的Request類型,就是一個(gè)模擬發(fā)送的請(qǐng)求對(duì)象。
更新請(qǐng)求頭設(shè)置 > ip代理請(qǐng)求