0基礎帶你認識爬蟲

爬蟲
1、認識爬蟲
一、概念
口語化定義:網絡爬蟲,程序,自動,批量,下載網絡資源。專業角度:假裝成客戶端與服務端進行數據交互的程序
2.相關概念
2.1應用架構(軟件的結構是什麼樣子的)
- c /s client server 客戶端,服務端架構(好比lol,qq)
- b /s browser 瀏覽器服務器架構(各類網站)
- m /s mobile 移動端,服務端(手機app)
css

 

 

 那麼客戶端和服務端怎麼傳數據呢?他們有協議html

2.2 http協議
超文本傳輸協議(從服務器傳輸超文本信息到客戶端,客戶端是沒有數據的,數據在服務端,打開一個網頁,數據經過http協議從服務器下載回來,整個互聯網90%的數據都是基於http協議)
一個完整的http事務包含如下幾個流程
1. 輸入網址,dns(域名解析成ip,ip就是咱們電腦在互聯網上的地址,惟一的,在dns上找到域名,解析成咱們須要的ip,找到咱們的服務器)
2. TCP鏈接,三次握手(創建好鏈接,創建好通道)
3. 客戶端發送HTTP請求報文
4.服務端收到請求,處理請求,返回一個包含結果的響應
5.瀏覽器 (根據收到信息的不一樣)渲染和展現
特色
- http無鏈接 每次只處理一個請求(很是快速,每一個請求都是完整的)
- http媒體獨立
- http無狀態(連續兩次請求區分不了是兩個用戶仍是一個用戶)python

2.2.1 請求(request)
一個完整的http請求報文報文包含:請求行,請求頭,空行,請求數據/請求體
程序員

 

 

 


1.請求方法
1.0 GET(沒有請求體,最多隻能發送1024字節) POST HEAD
1.1 web

GET 獲取數據(查)
POST 用戶帳號密碼(增)
PUT(改)
DELETE(刪)
2. 請求頭
‘名稱+:+值’正則表達式

 

 

 Host 指定的請求資源域名(主機和端口號)400表明連不上數據庫

UA 指定我是用什麼軟件給你發送的,我是什麼客戶端,我是用電腦仍是手機,甚至我是用華爲的手機仍是蘋果的手機,微博上面回覆一條顯示什麼手機
Acceept
cookie http是無狀態的,可是咱們如今又要他可以去把不一樣的請求,可以把一個客戶端的不一樣請求聯繫在一塊兒用到的技術json

3. 請求體/請求數據
二進制,b'' 。GET沒有,請求頭和請求體必定要有個空行,否則解析不了瀏覽器

2.2.2 響應
一個完整的響應報文包含:狀態行,消息報頭,空行,響應正文
安全

 

 

 http響應狀態碼

讓你快速知道當前響應是個什麼狀況,描述了響應的結果

 

 

1開頭的通常看不到

3開頭的重定向,打開一個網站的時候,輸入用戶名和密碼,有些網站會跳轉,服務端會告訴你一個標誌,你須要跳到另一個頁面

4開頭的表明咱們的代碼有問題,看下域名寫對了沒有,看下參數寫對了沒有,表明客戶端錯誤
5開頭表明服務器錯誤
通常用二、三、四、5,1通常不怎麼用

響應報頭(瞭解)

 

 

Allow

Date

Set-Cookie
Content-Type

2.2.3 會話技術(瞭解)
http是無狀態的,服務器不知道連發兩個請求不知道都是你,怎麼把他聯繫在一塊兒,怎麼區分一個用戶的連續請求
cookie,session
cookies (瞭解)(複數,不止一個cookie)
一個用戶請求個人服務端,首先個人服務端檢測你有沒有,沒有不要緊,我在響應裏面有個Set-Cookie,給你設置cookie,瀏覽器在接到這個響應以後,看到這個Set-Cookie以後,他會把你設置的這個cookie記錄下來,瀏覽器會幫你保存這個信息,幫你把這個信息會保存在電腦上面,下次再請求這個網站時,瀏覽器就會檢測看你有沒有cookie,有就會把它帶上,從而解決了這個問題 案例

憑證,保存在客戶端 不安全,數據太大時響應變慢,因此發明了session

session 會話(指打個電話,撥通,講完以後掛掉,這叫一次會話)在web這個領域,session什麼意思呢,其實就是打開瀏覽器,訪問某一個網站,在這個網站上點點點點點點,最後關閉這個網站,關閉這個瀏覽器,整個一個過程就叫作session,就叫一次會話基於cookie,session把數據 保存在服務端(不一樣的框架,不一樣的人實現的時候不同,有人會把session存在數據庫,有人會把session放在內存裏面,有人會把session信息存在文件)
session是怎麼運做的?
簡單理解,我在服務器,維持一個大字典,每一個客戶的信息我用這個大字典來表示,我給每一個客戶生成一個cookie,叫作session ID,生成一個隨機的,獨立的字符串,每一次只要把這個session ID攜帶過來就能夠了,你登陸的時候我就在個人字典裏面去新建一個字典,這個字典的key就是session ID,而後把你的值放到那個你的session ID對應的那個字典裏面,那我能夠存不少信息,這個時候個人信息,個人用戶名和密碼我不會存在裏面,即便被竊取了,也無非是別人可以登錄一下,可是咱們支付又要輸密碼,沒辦法去繞過,無形中比cookie安全高了不少,另外我存儲信息也能夠存的多一點,我不須要傳給你,你只須要發一個session ID給我,一個session ID最多64字節

2.2.4 網絡資源
能夠經過互聯網去獲取網頁、圖片,音頻、視頻、媒體文件意見其餘文件的集合的總稱
爬蟲的目標,定位
2.2.5 URL
統一資源定位符,網址,標識互聯網上某一處網絡資源的地址

 

 

 沒有用默認端口,須要顯示的寫上,他的端口不是80,那就必須在域名的後面加上‘:8080’

/開始到?前面表明的是路徑,你是要幹什麼,你是要首頁面仍是要登陸頁面,仍是要登陸,仍是要註冊,仍是要付款你就經過後面這個路徑去區分,咱們剛纔說的那個cookie,他會根據這個進行區分
路徑參數,在URL裏面咱們能夠帶上這個參數,這個參數能夠在服務器解析,通常狀況下這個參數是用來作查詢參數的,若是要傳大量的數據要放在請求體裏面
用來標識資源在互聯網上的位置,前面表明協議,我這個資源要經過這個協議能夠訪問,在哪裏呢,這個域名和端口就會指向這臺計算機,什麼信息呢,經過這個路徑就指定這個信息,須要哪些參數,後面加上參數,舉個例子,我要訪問互聯網上的某張圖片
2.3 https 超文本傳輸安全協議
http有個很是大的缺點,http發送的時候數據都是明文的,沒有加密的
ssl?TLS協議 依託於http的,只不過是在http傳送的過程當中他把數據進行了加密,僅此而已
與http的區別
1.https須要申請證書 - ca證書
2.http是明文的,https加密
3.鏈接方式:http 80 端口 https 443端口
端口: 咱們一個電腦上有不少程序,每一個程序他要訪問網絡的時候公用一個id,怎麼區分不一樣的軟件,怎麼區分不一樣的請求,就經過端口
4.

3. 應用領域

3.1 數據採集
淘寶,阿里巴巴,騰訊,百度,華爲這種大公司大平臺,他們的數據,他們其實有不少免費的,好比說百度有不少免費的服務其實你是付了費的,付了什麼費呢,有你的信息,像不少論壇啊,免費的,你以爲你是免費的時候,固然你也是免費的,他也是提供了服務給你,其實這些大公司的佈局都是獲取用戶數據,對於大公司來講,他有本身的平臺,有本身的渠道可以拿到數據,那不少中小企業怎麼辦呢?兩個辦法,第一個就是買,找大公司去買數據,我和騰訊合做,我和阿里巴巴合做,好比說電商平臺和阿里巴巴去合做,搞一個淘寶直通車,廣告費用。還有個渠道呢,在很長一段時間就是個爬蟲,好比去爬淘寶的商品,你要去爬餓了麼,爬美團都有

3.2 搜索引擎
谷歌 它發展起來,最開始就是一個爬蟲,發展到如今一個世界級的頂尖的公司,谷歌公司叫作‘’程序員的殿堂‘’若是你有谷歌公司的工做經驗,你在國內BAT這種公司你就隨便進,若是你有BAT的工做經驗,通常的其餘企業你也隨便進,對不對。谷歌公司最開始其實就是一個爬蟲,百度他的搜索也就是一個爬蟲,全部的搜索引擎其實都是爬蟲,他不停的在互聯網上不分日夜的處處去爬,他抽象把互聯網當作一個節點這樣一個網絡,爬蟲程序在裏面,這樣去形象的去比喻,把別人網站的信息收入到本身的數據庫,好比說你搜索一個圖片,全部圖片相關的網站統統都會搜索出來,他在早期怎麼作呢,他就是去根據你那個,他的爬蟲有個規則啊,他不會爬你整個網頁,他只會爬你的頭部,咱們打開一個網頁的時候

 

 

 

他這裏有個meta,它這裏面有 不少的信息。
3.3 模擬操做
有時候咱們一些重複的勞動,咱們都知道如今要智能化,自動化,有灌水機器人,之前論壇裏面要灌水嘛,要把帖子給頂上去,一會兒幾十萬哪裏找這麼多人,雖說有水軍,可是這個水軍要錢的,技術人員經過寫爬蟲模擬用戶去登陸,去發帖子。還有測試的,軟件行業搞測試的,寫好一個軟件,在發佈的時候須要去作各類測試,自動化測試。12306搶票程序,經過爬蟲我能夠實現,設定好時間,設定好我去哪裏,買哪趟車,這個程序幫我自動運行,幫我去搶票,這個也是爬蟲。


2、開發流程
1.分析請求流程
2. 發送請求
3. 獲取響應內容
4. 解析內容
5. 數據持久化
1. 分析請求流程
目的:找到目標資源的http請求。具體指標:
1. 請求方法
2. url
3. 請求頭
4. 請求數據(參數)
1.1 工具(抓包)
1.1.1 fiddler
1.1.2 谷歌瀏覽器
基本上咱們寫的爬蟲80%以上用谷歌瀏覽器就足夠,提供了一個開發者調試工具,能對咱們的http請求進行監控,按下F12打開,Network點開,輸入網站一回車,分析網頁結構就用Elements,分析頁面用Network,下面的每一條都是一次http事務。

 

 右邊是請求的詳細信息,Headers是頭部信息,Preview是對結果的渲染,這裏爲何是白板呢?我這裏要跟你們講個概念,一個網頁並非一次請求就能夠搞定的,現階段的網站一個頁面他不多是一個html,(在互聯網的古時候那個時候都是靜態頁面,一個網頁就是一個請求),一個頁面在加載的時候不止一個請求,而後請求也有前後順序。Response是第一次響應回來的數據

 

 2. 發送請求

2.1 經過socket 發送HTTP請求
from socket import socket
建立客戶端
client = socket()
 鏈接服務端
client.connect(('www.baidu.com',80))
構建http請求報文
data = b'GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n'
發送報文
client.send(data)
接受響應
res = 'b'
temp = client.recv(1024)
print('*'*20)
while temp:
res +=temp
temp = client.recv(1024)
print(res)
client.close()

2.2 工具庫
1.urllib python的標準庫,網絡請求的
2. urllib3 基於python3
3. requests
這個庫使得爬蟲氾濫,間接致使不少網站的反爬技術不斷升級,使用這個equests庫能夠很是簡單的,毫無門檻的去下載不少不少的資源
2.2.1 requests
特色,專爲人類而構建,是優雅和簡單的python庫,也是有史以來下載次數作多的python軟件包之一。

3.獲取響應內容
3.1 利用socket 下載一張圖片

 

3..2 requests下載

 

 4. 解析內容

響應體:一個是文本,還有個是二進制數據
文本:html,json,(js,css)
4.1 html 解析
4.1.1 正則表達式
4.1.2 beautiful soup
4.1.3 xpath
4.2 json 解析
4.2.1 jsonpath
咱們寫爬蟲的時候有很大一部分工做須要去解析,對數據進行解析,而後提取咱們須要的內容

5. 數據持久化
1. 寫文件
二進制數據,少許的通常狀況下都是寫文件,好比下載圖片,mp3,下載視頻,變成文件存回來
2. 寫數據庫
有大量的文本數據,結構性的,存到數據庫,好比說查某個商品的銷售數據,網上找論文,小說,下載整個網站的小說要把它存到數據庫
3、重點和難點
1. 數據獲取
有不少反爬措施,反爬技術日新月異
1.1 請求頭反爬
好比只要瀏覽器訪問,加一個UA,基本上沒有用,處理起來很是方便
1.2 cookie
cookie 處理起來也不難,requests已經幫咱們作了cookie 處理了
1.3 驗證碼
點觸、圖形、字符、滑動、短信、語音驗證碼等等,有的驗證碼是破解不了的,驗證碼的處理上面難度很是大,在須要登陸或者驗證碼的處理上實際上是一個比較難的地方
1.4 行爲檢測
機器學習,經過對用戶的行爲,好比點擊頻率,網頁的停留時間,他會進行學習,而後經過這些指標,經過一些模型來判斷這個是一個爬蟲仍是一我的,這個的難點在你要發現它的規則,也就是他經過什麼去判斷。舉個簡單例子,好比時間間隔,爬蟲通常你設定的是好比每秒鐘它去爬一次,他就每秒鐘,分絕不差,可是人點擊時間是隨機的,爲了處理這個,我就在每次爬取的時候在中間加個隨機值,隨機休眠一段時間我再去爬,就能夠解決這個問題。
1.5 參數加密
比較困難,須要去研究,去調試它的gs,看他是用什麼方法去加密的數據,須要足夠的耐心去gs調試和分析
1.6 字體反爬
爬不到具體的數字,每次自定義的字體,須要去學習相應的字體,把關鍵的字用本身的字體,比較困難
2. 爬取效率
2.1 併發
你在你的電腦上同時運行多個程序
2.2 異步
2.3 分佈式
爬蟲會檢測ip,若是同一個IP訪問次數過多,我就以爲你有可能有問題,我可能會封你的ip,這個時候就須要分佈式,你把你的爬蟲在不一樣的電腦上,部署在不一樣的主機上面去運行,去爬取

總結以下:

 

相關文章
相關標籤/搜索