爬蟲入門之爬蟲概述與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 128403.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())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章