爬蟲入門之urllib庫(一)

1 爬蟲概述

(1)互聯網爬蟲php

一個程序,根據Url進行爬取網頁,獲取有用信息

(2)核心任務css

爬取網頁
解析數據
難點 :爬蟲和反爬蟲之間的博弈

(3)爬蟲語言html

php     多進程和多線程支持很差
java    目前java爬蟲需求崗位旺盛,但代碼臃腫,重構成本高,而爬蟲須要常常修改,因此很差用
C\C++   學習成本比較高,性能和效率高,停留在研究層面,市場需求量小。體現程序員能力。
python  語法簡潔優美、對新手友好學習成本低、支持的模塊很是多、有scrapy很是強大的爬蟲框架

(4)爬蟲分類java

#通用爬蟲
    實例  百度、360、google、sougou等搜索引擎, 將網上的數據進行爬取並進行排名展現
    功能  訪問網頁->抓取數據->數據存儲->數據處理->提供檢索服務
    抓取流程
        1. 給定一些起始的URL,放入待爬取隊列
        2. 從隊列中獲取url對象,開始爬取數據
        3. 分析網頁,獲取網頁內的全部url,入隊,繼續重複執行第二步
    搜索引擎如何獲取新網站連接
        1. 主動給搜索引擎提交url
        2. 在其餘網站中設置友情連接
        3. 百度和DNS服務商合做,只要有域名,就會收錄新網站
    robots協議
        1.一個約定俗成的協議,添加robots.txt文件,來講明本網站哪些內容不能夠被抓取,起到限制做用
        2.本身寫的爬蟲無需遵照
    網站排名(SEO)
        1. 根據pagerank值進行排名(參考個網站流量、點擊率等指標)
        2. 百度競價排名,錢多就是爸爸
    缺點:
        1. 抓取的數據大可能是無用的
        2.不能根據用戶的需求來精準獲取數據
#聚焦爬蟲
    功能
        根據需求,實現爬蟲程序,抓取須要的數據
    原理
        1.網頁都有本身惟一的url(統一資源定位符)
        2.網頁都是html組成
        3.傳輸協議都是http/https
    設計思路
        1.肯定要爬取的url
        2.模擬瀏覽器經過http協議訪問url,獲取服務器返回的html代碼
        3.解析html字符串(根據必定規則提取須要的數據)
# URL放入爬取隊列緣由: 不少網頁都有友情連接,若是爬蟲漫無目的的爬取數據會爬到其餘網站,不一樣的網站都會存在不一樣的外部連接,因此有可能會重複,從隊列中獲取能夠避免重複網址的爬取

(5)總體框架python

1.python語法
2.使用的python庫
    urllib.request
    urllib.parse
    requests
    scrapy
3.解析內容方式: 
    正則表達式
    xpath  推薦使用xpath
    bs4
    jsonpath
4.採集動態html(通常模擬瀏覽器):由於全部的網站都不止存在一個請求(js.csss等動態請求),若是僅僅對網站首頁    發送請求,會致使網站內容接受不全   selenium + phantomjs
5.scrapy
    高性能異步網絡爬蟲框架
6.分佈式爬蟲
    scrapy-redis組件
7.反爬蟲的通常手段
    User-Agent 經過請求頭傳遞給服務器,用以說明訪問數據瀏覽器信息反爬蟲:先檢查是否有UA,或UA是否合法
    代理IP :  西刺代理
    驗證碼訪問 :  打碼平臺
    動態加載網頁
    數據加密  : 分析js代碼
    爬蟲-反爬蟲-反反爬蟲

2 http協議

(1)常見端口mysql

http   明文傳輸,端口號80
https   加密傳輸,端口號443
常見服務器端口號
    ftp    21
    ssh    22
    mysql   3306
    MongoDB  27017
    redis    6379

(2) http工做原理程序員

url組成 協議  主機HOST  端口號  資源路徑  query-string參數  錨點
url:   http://www.baidu.com:80/index.html?username=dancer&password=123456#anchor

上網原理 : 一個網頁通常都不止有一個url請求,在網頁內.js\.css文件也均可以是請求。當全部的請求都下載完成後,瀏覽器會把css.js.img等都翻譯成圖文並茂的形式

#請求頭詳解
    Accept
    Accept-Encoding
    Accept-Language
    Cache-Control  緩存控制
    Connection
    Cookie
    Host
    Upgrade-Insecure-Requests   是否升級爲https協議
    User-Agent  用戶代理
    X-Requested-With   ajax請求
#響應頭詳解
    Connection
    Content-Encoding  gzip 壓縮格式,瀏覽器須要對其進行解壓縮,咱們本身寫的爬蟲,不要寫這個
    Content-Type  服務器向客戶端回傳數據類型
    Date
    Expires   過時時間
    Server
    Transfer-Encoding  內容是否分包傳輸

(3) http常見的狀態碼ajax

1
xx:信息

100 Continue
服務器僅接收到部分請求,可是一旦服務器並無拒絕該請求,客戶端應該繼續發送其他的請求。
101 Switching Protocols
服務器轉換協議:服務器將聽從客戶的請求轉換到另一種協議。



2xx:成功

200 OK
請求成功(其後是對GET和POST請求的應答文檔)
201 Created
請求被建立完成,同時新的資源被建立。
202 Accepted
供處理的請求已被接受,可是處理未完成。
203 Non-authoritative Information
文檔已經正常地返回,但一些應答頭可能不正確,由於使用的是文檔的拷貝。
204 No Content
沒有新文檔。瀏覽器應該繼續顯示原來的文檔。若是用戶按期地刷新頁面,而Servlet能夠肯定用戶文檔足夠新,這個狀態代碼是頗有用的。
205 Reset Content
沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
206 Partial Content
客戶發送了一個帶有Range頭的GET請求,服務器完成了它。



3xx:重定向

300 Multiple Choices
多重選擇。連接列表。用戶能夠選擇某連接到達目的地。最多容許五個地址。
301 Moved Permanently
所請求的頁面已經轉移至新的url。
302 Moved Temporarily
所請求的頁面已經臨時轉移至新的url。
303 See Other
所請求的頁面可在別的url下被找到。
304 Not Modified
未按預期修改文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(通常是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
305 Use Proxy
客戶請求的文檔應該經過Location頭所指明的代理服務器提取。
306 Unused
此代碼被用於前一版本。目前已再也不使用,可是代碼依然被保留。
307 Temporary Redirect
被請求的頁面已經臨時移至新的url。



4xx:客戶端錯誤

400 Bad Request
服務器未能理解請求。
401 Unauthorized
被請求的頁面須要用戶名和密碼。
401.1
登陸失敗。
401.2
服務器配置致使登陸失敗。
401.3
因爲 ACL 對資源的限制而未得到受權。
401.4
篩選器受權失敗。
401.5
ISAPI/CGI 應用程序受權失敗。
401.7
訪問被 Web 服務器上的 URL 受權策略拒絕。這個錯誤代碼爲 IIS 6.0 所專用。
402 Payment Required
此代碼尚沒法使用。
403 Forbidden
對被請求頁面的訪問被禁止。
403.1
執行訪問被禁止。
403.2
讀訪問被禁止。
403.3
寫訪問被禁止。
403.4
要求 SSL。
403.5
要求 SSL 128。
403.6
IP 地址被拒絕。
403.7
要求客戶端證書。
403.8
站點訪問被拒絕。
403.9
用戶數過多。
403.10
配置無效。
403.11
密碼更改。
403.12
拒絕訪問映射表。
403.13
客戶端證書被吊銷。
403.14
拒絕目錄列表。
403.15
超出客戶端訪問許可。
403.16
客戶端證書不受信任或無效。
403.17
客戶端證書已過時或還沒有生效。
403.18
在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼爲 IIS 6.0 所專用。
403.19
不能爲這個應用程序池中的客戶端執行 CGI。這個錯誤代碼爲 IIS 6.0 所專用。
403.20
Passport 登陸失敗。這個錯誤代碼爲 IIS 6.0 所專用。
404 Not Found
服務器沒法找到被請求的頁面。
404.0
沒有找到文件或目錄。
404.1
沒法在所請求的端口上訪問 Web 站點。
404.2
Web 服務擴展鎖定策略阻止本請求。
404.3
MIME 映射策略阻止本請求。
405 Method Not Allowed
請求中指定的方法不被容許。
406 Not Acceptable
服務器生成的響應沒法被客戶端所接受。
407 Proxy Authentication Required
用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理。
408 Request Timeout
請求超出了服務器的等待時間。
409 Conflict
因爲衝突,請求沒法被完成。
410 Gone
被請求的頁面不可用。
411 Length Required
"Content-Length" 未被定義。若是無此內容,服務器不會接受請求。
412 Precondition Failed
請求中的前提條件被服務器評估爲失敗。
413 Request Entity Too Large
因爲所請求的實體的太大,服務器不會接受請求。
414 Request-url Too Long
因爲url太長,服務器不會接受請求。當post請求被轉換爲帶有很長的查詢信息的get請求時,就會發生這種狀況。
415 Unsupported Media Type
因爲媒介類型不被支持,服務器不會接受請求。
416 Requested Range Not Satisfiable
服務器不能知足客戶在請求中指定的Range頭。
417 Expectation Failed
執行失敗。
423
鎖定的錯誤。



5xx:服務器錯誤

500 Internal Server Error
請求未完成。服務器遇到不可預知的狀況。
500.12
應用程序正忙於在 Web 服務器上從新啓動。
500.13
Web 服務器太忙。
500.15
不容許直接請求 Global.asa。
500.16
UNC 受權憑據不正確。這個錯誤代碼爲 IIS 6.0 所專用。
500.18
URL 受權存儲不能打開。這個錯誤代碼爲 IIS 6.0 所專用。
500.100
內部 ASP 錯誤。
501 Not Implemented
請求未完成。服務器不支持所請求的功能。
502 Bad Gateway
請求未完成。服務器從上游服務器收到一個無效的響應。
502.1
CGI 應用程序超時。 ·
502.2
CGI 應用程序出錯。
503 Service Unavailable
請求未完成。服務器臨時過載或當機。
504 Gateway Timeout
網關超時。
505 HTTP Version Not Supported
服務器不支持請求中指明的HTTP協議版本

3 抓包工具fiddler

(1) 配置https正則表達式

點擊Tools-->options--->https--->選中面板下
Capture Https CONNECTS
Decrypt Https Traffic
Ignore
複選框後,將Fiddler重啓便可

(2) Web Session 面板redis

主要是Fiddler抓取到的每條http請求(每條稱一個session),主要包含了請求的url,協議,狀態碼,body等信息

圖片

圖片

(3) 數據統計版

Inspector

ImageView標籤:   JPG 格式使用 ImageView 就能夠看到圖片
TextView 標籤:  HTML/JS/CSS 使用 TextView 能夠看到響應的內容。
Raw標籤:   Raw標籤能夠查看響應報文和響應正文,可是不包含請求報文
Cookies標籤:   Cookies標籤能夠看到請求的cookie和響應的set-cookie頭信息。
WebForms:   post請求全部表單數據
Headers:   請求頭和響應頭信息
Json\XML:   Json或XML格式的數據

其餘面板

Statistics面板   HTTP請求的性能和其餘數據分析
composer面板   能夠模擬向相應的服務器發送數據的過程
Filters面板   Filter標籤則能夠設置Fiddler的過濾規則,來達到過濾http請求的目的。最簡單如:過濾內網http              請求而只抓取internet的http請求,或則過濾相應域名的http請求。

WebSession選擇功能
    select json\html\image
    cls清除全部請求
    ?xxx搜索

4 Urllib庫

(1)版本

python2
    urllib
    urllib2
python3
    urllib
    
urllib2 官方文檔:https://docs.python.org/2/library/urllib2.html
urllib2 源碼:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py
urllib2 在 python3.x 中被改成urllib.request
    
字節-->字符串   解碼decode
字符串-->字節   編碼encode

(2)常見的命令

請求響應

urllib.request.urlopen()     返回一個response對象
urllib.request.urlretrieve()    讀取內容,直接保存到本地 圖片/視頻/網頁

response.read()   讀取二進制數據   
response.readline()   讀取一行
response.readlines()  讀取多行
response.getcode()  獲取狀態碼       
response.geturl()   獲取請求對象l是由哪一個url返回來的
response.getheaders()   得到請求頭信息

處理URL

urllib.parse.urlencode()   把字典對象解析成url可識別的參數字符串
#例如
url = 'https://www.baidu.com/s?'
data = {
    'wd':'美女'
}
source = urllib.parse.urlencode(data)
url = url+source
print(url)

urllib.parse.quote()   url編碼中只能出現-_.a~z  若是有中文須要進行編碼
#例如
url在線編碼工具
http://tool.oschina.net/encode?type=4
url = urllib.pares.quote('http://www.baidu.com/user=語言&pass=123')

urllib.parse.unquote()  url解碼

構建請求對象

User-Agent定製  urllib.request.Request  可使用這個類來定製一個請求對象,來模擬瀏覽器登陸

#模擬請求頭
headers = {
    'User-Agent':'xxxxx'
}
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())
相關文章
相關標籤/搜索