1.為什么要學(xué)習(xí)爬蟲?
數(shù)據(jù)的來源
1.企業(yè)生產(chǎn)的用戶數(shù)據(jù)
2.數(shù)據(jù)管理公司
3.政府/機構(gòu)提供的公開數(shù)據(jù)
4.第三方數(shù)據(jù)平臺購買數(shù)據(jù)
5.爬蟲爬數(shù)據(jù)
爬蟲的定義
網(wǎng)絡(luò)爬蟲(又稱為網(wǎng)頁蜘蛛姜盈,網(wǎng)絡(luò)機器人)就是模擬客戶端發(fā)送請求杂抽,接收請求響應(yīng)岳枷,一種按照一定的規(guī)則罚斗,自動抓取互聯(lián)網(wǎng)信息的程序跺株。
爬蟲怎么抓取網(wǎng)頁上的數(shù)據(jù)府喳?
網(wǎng)頁的三大特征:
1.網(wǎng)頁都有自己唯一的URL
2.網(wǎng)頁都是HTML來描述頁面信息
3.網(wǎng)頁都使用HTTP/HTTPS協(xié)議來傳輸HTML數(shù)據(jù)
爬蟲的設(shè)計思路:
1.確定需要爬取的URL地址
2.通過HTTP/HTTPS協(xié)議獲取對應(yīng)的HTML頁面
3.提取HTML頁面有用的數(shù)據(jù)
為什么選擇Python做爬蟲?
簡介肉津,高效妹沙,支持模塊多距糖,HTTP請求和HTML解析的模塊豐富。
調(diào)用其他接口方便恩脂。
2.爬蟲的分類
爬蟲分為:
1.通用爬蟲
2.聚焦爬蟲
通用爬蟲:是搜索引擎抓取系統(tǒng)的重要組成部分没炒,主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地玉凯,形成一個互聯(lián)網(wǎng)的鏡像備份漫仆。
聚焦爬蟲:是“面向特定主題需求”的一種網(wǎng)絡(luò)爬蟲泪幌,它與通用搜索引擎爬蟲的區(qū)別在于:聚焦爬蟲在實施網(wǎng)頁抓取時會對內(nèi)容進行處理篩選祸泪,盡量保證只抓取需求相關(guān)的網(wǎng)頁信息浴滴。
3.HTTP和HTTPS協(xié)議
HTTP協(xié)議簡介
協(xié)議概念:通信計算機雙方必須共同遵守的一組約定升略,只有遵守這個約定品嚣,計算機之間才能相互通信翰撑。
HTTP協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議):是一種發(fā)布和接收HTML頁面的方法瓜饥。
HTTPS協(xié)議(HyperText Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版乓土,在HTTP下加入SSL層趣苏。
SSL(?Secure Socket Layer?安全套接層)主要用于web的安全傳輸協(xié)議食磕,在傳輸層對網(wǎng)絡(luò)連接進行加密彬伦,保障Internet上數(shù)據(jù)傳輸安全
HTTP的端口號為80
HTTPS的端口號為443
HTTP的請求與響應(yīng)
HTTP通信由兩部分組成:客戶端請求消息與服務(wù)器響應(yīng)消息
URL:統(tǒng)一資源定位符媚朦,是用于完整地描述Internet上網(wǎng)頁和其他資源的地址一種標(biāo)識。
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:協(xié)議(例如:http, https, ftp)
host:服務(wù)器的IP地址或者域名
port#:服務(wù)器的端口(如果是走協(xié)議默認端口浙炼,缺省端口80)
path:訪問資源的路徑
query-string:參數(shù)弯屈,發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor:錨(跳轉(zhuǎn)到網(wǎng)頁的指定錨點位置)
客戶端HTTP請求
URL只是標(biāo)識資源的位置,而HTTP是用來提交和獲取資源宴偿≌酰客戶端發(fā)送一個HTTP請求到服務(wù)器的請求消息娩践,包括以下格式:
請求行材泄、請求頭部、空行、請求數(shù)據(jù)
請求方法
根據(jù)HTTP標(biāo)準族檬,HTTP請求可以使用多種請求方法单料。
HTTP 0.9:只有基本的文本 GET 功能。
HTTP 1.0:完善的請求/響應(yīng)模型换怖,并將協(xié)議補充完整,定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP 1.1:在 1.0 基礎(chǔ)上進行更新彻坛,新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法昌屉。
HTTP 2.0(未普及):請求/響應(yīng)首部的定義基本沒有改變,只是所有首部鍵必須全部小寫椰于,而且請求行要獨立為 :method怠益、:scheme、:host瘾婿、:path這些鍵值對蜻牢。
HTTP請求主要分為Get和Post兩種方法
GET是從服務(wù)器上獲取數(shù)據(jù)烤咧,POST是向服務(wù)器傳送數(shù)據(jù)
GET請求參數(shù)顯示,都顯示在瀏覽器網(wǎng)址上抢呆,HTTP服務(wù)器根據(jù)該請求所包含URL中的參數(shù)來產(chǎn)生響應(yīng)內(nèi)容煮嫌,即“Get”請求的參數(shù)是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese
POST請求參數(shù)在請求體當(dāng)中抱虐,消息長度沒有限制而且以隱式的方式進行發(fā)送昌阿,通常用來向HTTP服務(wù)器提交量比較大的數(shù)據(jù)(比如請求中包含許多參數(shù)或者文件上傳操作等),請求的參數(shù)包含在“Content-Type”消息頭里恳邀,指明該消息體的媒體類型和編碼
常用的請求報頭
1.Host (主機和端口號)
Host:對應(yīng)網(wǎng)址URL中的Web名稱和端口號懦冰,用于指定被請求資源的Internet主機和端口號,通常屬于URL的一部分谣沸。
2.Connection (鏈接類型)
Connection:表示客戶端與服務(wù)連接類型
Client 發(fā)起一個包含 Connection:keep-alive 的請求刷钢,HTTP/1.1使用 keep-alive 為默認值。
Server收到請求后:
如果 Server 支持 keep-alive乳附,回復(fù)一個包含 Connection:keep-alive 的響應(yīng)内地,不關(guān)閉連接;
如果 Server 不支持 keep-alive赋除,回復(fù)一個包含 Connection:close 的響應(yīng)阱缓,關(guān)閉連接。
如果client收到包含 Connection:keep-alive 的響應(yīng)举农,向同一個連接發(fā)送下一個請求荆针,直到一方主動關(guān)閉連接。
3. Upgrade-Insecure-Requests (升級為HTTPS請求)
Upgrade-Insecure-Requests:升級不安全的請求并蝗,意思是會在加載 http 資源時自動替換成 https 請求祭犯,讓瀏覽器不再顯示https頁面中的http請求警報秸妥。
4. User-Agent (瀏覽器名稱)
User-Agent:是客戶瀏覽器的名稱
5. Accept (傳輸文件類型)
Accept:指瀏覽器或其他客戶端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互聯(lián)網(wǎng)郵件擴展))文件類型滚停,服務(wù)器可以根據(jù)它判斷并返回適當(dāng)?shù)奈募袷健?/p>
Accept: */*:表示什么都可以接收。
Accept:image/gif:表明客戶端希望接受GIF圖像格式的資源粥惧;
Accept:text/html:表明客戶端希望接受html文本键畴。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示瀏覽器支持的 MIME 類型分別是 html文本、xhtml和xml文檔突雪、所有的圖像格式資源起惕。
6. Referer (頁面跳轉(zhuǎn)處)
Referer:表明產(chǎn)生請求的網(wǎng)頁來自于哪個URL,用戶是從該 Referer頁面訪問到當(dāng)前請求的頁面咏删。這個屬性可以用來跟蹤Web請求來自哪個頁面惹想,是從什么網(wǎng)站來的等。
7. Accept-Encoding(文件編解碼格式)
Accept-Encoding:指出瀏覽器可以接受的編碼方式督函。編碼方式不同于文件格式嘀粱,它是為了壓縮文件并加速文件傳遞速度激挪。瀏覽器在接收到Web響應(yīng)之后先解碼,然后再檢查文件格式锋叨,許多情形下這可以減少大量的下載時間垄分。
8. Accept-Language(語言種類)
Accept-Langeuage:指出瀏覽器可以接受的語言種類,如en或en-us指英語娃磺,zh或者zh-cn指中文薄湿,當(dāng)服務(wù)器能夠提供一種以上的語言版本時要用到。
9. Accept-Charset(字符編碼)
Accept-Charset:指出瀏覽器可以接受的字符編碼偷卧。
10. Cookie (Cookie)
Cookie:瀏覽器用這個屬性向服務(wù)器發(fā)送Cookie豺瘤。Cookie是在瀏覽器中寄存的小型數(shù)據(jù)體,它可以記載和服務(wù)器相關(guān)的用戶信息
11. Content-Type (POST數(shù)據(jù)類型)
Content-Type:POST請求里用來表示的內(nèi)容類型听诸。
服務(wù)端HTTP響應(yīng)
HTTP響應(yīng)也由四個部分組成炉奴,分別是:?狀態(tài)行、消息報頭蛇更、空行瞻赶、響應(yīng)正文
常用的響應(yīng)報頭(了解)
1. Cache-Control:must-revalidate, no-cache, private。
這個值告訴客戶端派任,服務(wù)端不希望客戶端緩存資源砸逊,在下次請求資源時,必須要從新請求服務(wù)器掌逛,不能從緩存副本中獲取資源师逸。
2. Connection:keep-alive
這個字段作為回應(yīng)客戶端的Connection:keep-alive,告訴客戶端服務(wù)器的tcp連接也是一個長連接豆混,客戶端可以繼續(xù)使用這個tcp連接發(fā)送http請求篓像。
3. Content-Encoding:gzip
告訴客戶端,服務(wù)端發(fā)送的資源是采用gzip編碼的皿伺,客戶端看到這個信息后员辩,應(yīng)該采用gzip對資源進行解碼。
4. Content-Type:text/html;charset=UTF-8
告訴客戶端鸵鸥,資源文件的類型奠滑,還有字符編碼,客戶端通過utf-8對資源進行解碼妒穴,然后對資源進行html解析宋税。通常我們會看到有些網(wǎng)站是亂碼的,往往就是服務(wù)器端沒有返回正確的編碼讼油。
5.Date: Thu, 02 Jan 2020 06:32:55 GMT
這個是服務(wù)端發(fā)送資源時的服務(wù)器時間杰赛,GMT是格林尼治所在地的標(biāo)準時間。http協(xié)議中發(fā)送的時間都是GMT的矮台,這主要是解決在互聯(lián)網(wǎng)上乏屯,不同時區(qū)在相互請求資源的時候阔墩,時間混亂問題。
響應(yīng)狀態(tài)碼
響應(yīng)狀態(tài)代碼有三位數(shù)字組成瓶珊,第一個數(shù)字定義了響應(yīng)的類別啸箫,且有五種可能取值。
常見狀態(tài)碼:
100~199:表示服務(wù)器成功接收部分請求伞芹,要求客戶端繼續(xù)提交其余請求才能完成整個處理過程忘苛。
200~299:表示服務(wù)器成功接收請求并已完成整個處理過程。常用200(OK 請求成功)唱较。
300~399:為完成請求扎唾,客戶需進一步細化請求。例如:請求的資源已經(jīng)移動一個新地址南缓、常用302(所請求的頁面已經(jīng)臨時轉(zhuǎn)移至新的url)胸遇、307和304(使用緩存資源)。
400~499:客戶端的請求有錯誤汉形,常用404(服務(wù)器無法找到被請求的頁面)纸镊、403(服務(wù)器拒絕訪問,權(quán)限不夠)概疆。
500~599:服務(wù)器端出現(xiàn)錯誤逗威,常用500(請求未完成。服務(wù)器遇到不可預(yù)知的情況)岔冀。
4-爬蟲requests庫
requests的作用
作用:發(fā)送網(wǎng)絡(luò)請求凯旭,返回相應(yīng)數(shù)據(jù)
中文文檔API:http://docs.python-requests.org/zh_CN/latest/
response.text和response.content的區(qū)別
response.text
類型:str
修改編碼方式:response.encoding = 'utf-8'
response.content
類型:bytes
修改編碼方式:response.content.decode('utf8')
requests深入
發(fā)送POST請求
哪些地方我們會用到POST請求:
1 登錄注冊(post比get安全)
2 需要傳輸大文本的時候(POST請求對數(shù)據(jù)長度沒有要求)
爬蟲也需要在這兩個地方模擬瀏覽器發(fā)送post請求
使用代理
問題:為什么爬蟲需要使用代理
1 讓服務(wù)器以為不是同一個客戶端在請求
2 防止我們的真實地址被泄露,防止被追究
使用代理IP
準備一堆的IP地址使套,組成IP池罐呼,隨機選擇一個IP來用
檢查IP的可用性
1.可以使用requests檢查
2.在線代理IP質(zhì)量檢查的網(wǎng)站
cookie和session區(qū)別
cookie數(shù)據(jù)存放在客戶端的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上侦高。
cookie不是很安全嫉柴,別人可以分析存放在本地的cookie并進行cookie欺騙
session會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多矫膨,會比較占用你服務(wù)器的性能
單個cookie保存的數(shù)據(jù)不能超過4K差凹,很多瀏覽器都限制一個站點最多保存20個cookie
爬蟲處理cookie和session
帶上cookie期奔、session的好處:能夠請求到登錄之后的頁面
帶上cookie侧馅、session的弊端:一套cookie和session往往和一個用戶對應(yīng)請求太多,請求次數(shù)太多呐萌,容易被服務(wù)器識別為爬蟲
不需要cookie的時候盡量不去使用cookie
但是為了獲取登錄之后的頁面馁痴,我們必須發(fā)送帶有cookies的請求
requests提供了一個叫做session類,來實現(xiàn)客戶端和服務(wù)端的會話保持使用方法1實例化一個session對象2讓session發(fā)送get或者post請求session=requests.session()response=session.get(url,headers)
請求登錄之后的網(wǎng)站的思路:
1 實例化session
2 先使用session發(fā)送請求,登錄對應(yīng)網(wǎng)站肺孤,把cookie保持在session中
3 在使用session請求登錄之后才能訪問的網(wǎng)站罗晕,session能夠自動攜帶登錄成功時保存在其中的cookie济欢,進行請求
不發(fā)送post請求,使用cookie獲取登錄后的頁面
cookie過期時間很長的網(wǎng)站
在cookie過期之前能夠拿到所有的數(shù)據(jù)小渊,
配合其他程序一起使用法褥,其他程序?qū)iT獲取cookie,當(dāng)前程序?qū)iT請求頁面