天天看點

爬蟲入門之爬蟲概述與urllib庫(一)

1 爬蟲概述

(1)網際網路爬蟲

一個程式,根據Url進行爬取網頁,擷取有用資訊           

(2)核心任務

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

(3)爬蟲語言

php     多程序和多線程支援不好
java    目前java爬蟲需求崗位旺盛,但代碼臃腫,重構成本高,而爬蟲需要經常修改,是以不好用
C\C++   學習成本比較高,性能和效率高,停留在研究層面,市場需求量小。展現程式員能力。
python  文法簡潔優美、對新手友好學習成本低、支援的子產品非常多、有scrapy非常強大的爬蟲架構           

(4)爬蟲分類

#通用爬蟲
    執行個體  百度、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)整體架構

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)常見端口

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常見的狀态碼

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 面闆

主要是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())