python 3.x 爬蟲基礎
python 3.x 爬蟲基礎---http headers詳解
python 3.x 爬蟲基礎---Urllib詳解
python 3.x 爬蟲基礎---Requersts,BeautifulSoup4(bs4)
python 3.x 爬蟲基礎---正則表達式
前言
上一篇文章?python 爬蟲入門案例----爬取某站上海租房圖片?中有對headers的講解,可能是對爬蟲了解的不夠深刻,所以老覺得這是一項特別簡單的技術,也可能是簡單所以網上對爬蟲系統的文檔,書和視頻感覺都好少,故此準備接下這段時間對爬蟲涉及到的點做個系統的學習與總結。
利用瀏覽器查看headers
打開瀏覽器,按F12(開發調試工具)------》查看網絡工作(Network)------》選擇你訪問的頁面地址------》headers。就可以看到你想要的信息,如下圖(【白眼】這些有點開發基礎的應該都知道吧)
如圖所示我們可以看出heades包含(通用)request headers(請求) 與response headers(響應)。從名字上我們大概就能知道它們相應的作用是什么吧。這一塊知識可以去學習http 協議去了解,記得以前買過一本書叫做《圖解http》,有興趣的看一去看一下。
request headers
爬蟲第一步應該就是要獲取頁面信息,但是那往往別人是不想讓你爬它們的網站的至于為什么?請用腳指頭想一想,其實我以前的項目也做過防止爬蟲的功能,net mvc防網絡攻擊案例?,那么存在壓迫就會有反抗,其中反爬蟲的方式headers的偽造就是第一步。其中我主要提一下Host,Connection,Accept,Accept-Encoding,Accept-Language,User-Agent,Referrer這7個請求頭。
Host詳解
大家應該知道host是在http1-1之后才有的,也就是以前沒有host只存在ip網站也是能夠正常運行的,但是為什要加入host的呢。
如上圖我們去ping host。host:csblogs.com 對應的ip是104.27.132.253,那么我在這就要問了,有沒有可能blogs.com也對應104.27.132.253這個ip地址?答案是肯定的,做過web開發的人員應該都在自己電腦上部署過多個web站點。只需要我們用不同的端口就行。是的host就是域名嗎。他主要就是實現一對多的功能。一臺虛擬主機上的一個ip可以放成千上萬個網站。當對這些網站的請求到來時,服務器根據Host這一行中的值來確定本次請求的是哪個具體的網站,就是域名解析。
Connection詳解
如下圖有沒有發現請求與相應都存在Connection,那么它到底有什么用呢?控制HTTP C/S直接是否可以進行長連接。HTTP1.1規定了默認保持長連接,但是python爬蟲的時候有可能會出現短鏈接。那么什么是長連接?
? 數據傳輸完成了保持TCP連接不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸數據;相反的就是短連接。
其中一下可以對其進行簡單的設置,進行傳遞。
Connection: Keep-alive#長連接
Connection:close#短鏈接
Keep-Alive: timeout=20#tcp通道保持20s
Accept詳解
指定客戶端能夠接受的內容類型,在這唯一要提醒的就是它只是建議服務器,而并非就是你寫成什么他就返回給你什么。
Accept-Encoding詳解
瀏覽器發給服務器,聲明瀏覽器支持的編碼類型的。
Accept-Encoding: compress, gzip //支持compress 和gzip類型 Accept-Encoding: //默認是identity Accept-Encoding: * //支持所有類型 Accept-Encoding: compress;q=0.5, gzip;q=1.0 //按順序支持 gzip , compress Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 // 按順序支持 gzip , identity
Accept-Language詳解
請求頭允許客戶端聲明它可以理解的自然語言,以及優先選擇的區域方言。
Accept-Language: Zh-CN, zh;q=0.8, en-gb;q=0.8, en;q=0.7#最佳語言為中文-中國(默認權重為1),其次為中文,權重為0.8,再次為英國英語,權重為0.8,最后為通用英語,權重0.7
user_agent詳解
向訪問網站提供你所使用的瀏覽器類型及版本、操作系統及版本、瀏覽器內核、等信息的標識。通過這個標識,用戶所訪問的網站可以顯示不同的排版從而為用戶提供更好的體驗或者進行信息統計;例如用手機訪問谷歌和電腦訪問是不一樣的,這些是谷歌根據訪問者的UA來判斷的,這個應該所有接觸爬蟲不管不知道它什么意思都會用到它,因為如果沒有它,大部分都會沒反應。
#user_agent 集合 user_agent_list = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)','Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0','Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', ] #隨機選擇一個user_agent = random.choice(user_agent_list) #傳遞給header #headers = { 'User-Agent': user_agent }
為什么要隨機傳遞一個不行嗎?其實大部分時候我都是用一個。其實就是你偽造的越不想爬蟲就越是越好的爬蟲。
Referer詳解
當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器籍此可以獲得一些信息用于處理。用于統計訪問量、防外連接等。這個怎么說呢,就是你如果你想查看去看有沒有火車票,那么你就要先登入12306網站。
# 對付“反盜鏈”(服務器會識別headers中的referer是不是它自己,如果不是則不響應),構建以下headers headers = { "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)", "Referer": "https://www.cnblogs.com" }
其他
Authorization:授權信息,通常出現在對服務器發送的WWW-Authenticate頭的應答中;
Cookie:這是最重要的請求頭信息之一;一般可以直接復制,對于一些變化的可以選擇構造(python中的一些庫也可以實現),詳情請了解http.cookiejar,python 3.x 爬蟲基礎---Urllib詳解有提及。
From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它;
If-Modified-Since:只有當所請求的內容在指定的日期之后又經過修改才返回它,否則返回304“Not Modified”應答;
Pragma:指定“no-cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝;
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操作系統和CPU類型。
Origin:Origin字段里只包含是誰發起的請求,并沒有其他信息。跟Referer不一樣的 是Origin字段并沒有包含涉及到用戶隱私的URL路徑和請求內容,這個尤其重要。
并且Origin字段只存在于POST請求,而Referer則存在于所有類型的請求;
結語
那么就先寫到這里了,上篇文章說春節前最后一篇,結果沒壓抑住,在這就祝大家新年快樂了。來年大家一起努力吧。
?