【網絡爬蟲入門02】HTTP客戶端庫Requests的基本原理與基礎應用
廣東職業技術學院 ?歐浩源 2017-10-15?
1、引言
? ? 實現網絡爬蟲的第一步就是要建立網絡連接并向服務器或網頁等網絡資源發起請求。urllib是目前最常用的做法,然而Requests會比urlib更加方便,能夠讓人以更加簡單的方式獲取網絡資源。
2、什么是Requests?
? ? Requests是用Python語言編寫,基于urllib,采用Apache2 Licensed開源協議的HTTP庫。它比urllib更加方便,可以節約我們大量的工作,完全滿足HTTP測試需求。
? ? Requests對象有Get、Post、Put、Delete、Head、Options等HTTP方法,使用起來非常簡單。對于WEB系統,一般只支持Get和Post方法。在網絡爬蟲中,Get方法最常用。在本文中也重點討論該方法相關的應用,其他方法即更加詳細的使用,見用戶手冊:
? ? http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
3、發起網絡請求
? ? 使用Requests的Get方法發送網絡請求非常簡單。
? ? 首先,導入Requests模塊:
? ? import requests
? ? 然后,通過URL向網頁發起請求:
? ? res = requests.get('http://www.gdptc.cn/')
? ? 這時,我們有一個名為res的Requests對象,從這個對象中我們可以獲取所有我們想要的信息,例如將網頁的URL打印出來。
? ? print(res.url)
4、獲取響應內容
? ? 我們能讀取服務器響應的內容。Requests會自動解碼來自服務器的內容,大多數unicode字符集都能被無縫地解碼。
? ? 請求發出后,Requests會基于HTTP頭部對響應的編碼作出有根據的推測。當你訪問res.text 之時,Requests會使用其推測的文本編碼。你可以找出 Requests使用了什么編碼,并且能夠使用res.encoding屬性來改變它。
? ? 如果你改變了編碼,每當你訪問 res.text ,Request 都將會使用res.encoding的新值。
5、響應頭的內容
? ? 服務器響應頭以一個Python字典的形式來表示。這個字典比較特殊,它是僅為HTTP頭部而生的。
? ? res.headers的結果是:
{
? 'Content-Length' : '39037'
? 'X-Powered-By' : 'ASP.NET'
? 'Date' : 'Sat, 14 Oct 2017 13:58:41 GMT'
? 'X-AspNet-Version' : '2.0.50727'
? 'Cache-Control' : 'private'
? 'Content-Type' : 'text/html; charset=utf-8'
? 'Server' : 'Microsoft-IIS/7.5'
}
? ? 通過這個服務器的響應頭,我們可以知道服務器的一些基本數據信息。根據 RFC2616, HTTP頭部是大小寫不敏感的。因此,我們可以使用任意大寫形式來訪問這些響應頭字段。例如我們想查看服務器的編碼和服務器型號:
6、定制請求頭
? ? 如果你想為請求添加HTTP頭部,只要簡單地傳遞一個dict給headers參數就可以了。很多服務器對于非正常的請求往往會拒絕,這時候就需要給網絡請求穿上合法的外衣,而偽裝請求頭部則是最常用的手段。
? ? 用戶代理User Agent,是HTTP協議中的一部分,屬于請求頭的組成部分。它是一個特殊字符串頭,是一種向訪問網站提供你所使用的瀏覽器類型及版本、操作系統及版本、瀏覽器內核等信息的標識。通過添加合法瀏覽器的UA信息,可以將爬蟲的請求偽裝成瀏覽器的請求。
? ? 例如,IE9瀏覽器的User Agent為:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;
? ? 這些常用的瀏覽器UA在網上都可以查到。
? ? 如果要模擬IE9瀏覽器訪問百度網站,可以這樣實現:
? ? Requests不會基于定制 header 的具體情況改變自己的行為。只不過在最后的請求中,所有的header信息都會被傳遞進去。
7、小結
? ? Requests的用法遠不止此,但作為網絡爬蟲的入門應用,上述知識基本足夠。向服務器發送請求的方法也不止一種,怎么熟悉怎么用,怎么方便怎么用,作為入門,多了解,多學習,多練習,多應用才是正道。