先來說說爬蟲的原理:爬蟲本質上是模擬人瀏覽信息的過程,只不過他通過計算機來達到快速抓取篩選信息的目的。所以我們想要寫一個爬蟲,最基本的就是要將我們需要抓取信息的網頁原原本本的抓取下來。這個時候就要用到requests庫了。
requests庫的安裝
requests庫本質上就是模擬了我們用瀏覽器打開一個網頁,發起請求是的動作。它能夠迅速的把請求的html源文件保存到本地
他安裝的方式非常簡單:我們用pip工具在命令行裡進行安裝
$ pip install requests`
接著我們看一下是否成功安裝了bs4庫
$ pip list
看一下安裝結果
requests庫的基本使用:
#首先我們先導入requests這個包import requests#我們來吧百度的index頁面的html源碼抓取到本地,並用r變量保存#注意這裡,網頁前面的 http://一定要寫出來,它並不能像真正的瀏覽器一樣幫我們補全http協議r = requests.get("http://www.baidu.com")#將下載到的內容打印一下:print(r.text)
可以看到,百度的首頁源碼文件我們已經把他抓取到本地了。
上面的抓取過程中,我們用到了requests庫的get方法,
這個方法是requests庫中最常用的方法之一。
他接受一個參數(url)並返回一個HTTP response對象。
與get方法相同的,requests庫還有許多其他常用方法:
下面我們來詳細瞭解一下 requests.get 這個方法:
#這個方法可以接收三個參數,其中第二個默認為None 第三個可選def get(url, params=None, **kwargs)#作用是模擬發起GET請求Sends a GET request.#模擬獲取頁面的url鏈接:param url: URL for the new :class:Request object. #額外參數 字典或字節流格式,可選:param params: (optional) Dictionary or bytes to be sent in the query string for the :class:Request. # 十二個控制訪問參數,比如可以自定義header:param **kwargs: Optional arguments that request takes. # 返回一個Response對象:return: :class:Response <Response> object :type: requests.Response
我們來著重講一下 **kwargs 這個參數
kwargs: 控制訪問的參數,均為可選項
params : 字典或字節序列,作為參數增加到url中
data : 字典、字節序列或文件對象,作為Request的內容 json : JSON格式的數據,作為Request的內容
headers : 字典,HTTP定製頭
cookies : 字典或CookieJar,Request中的cookie
auth : 元組,支持HTTP認證功能
files : 字典類型,傳輸文件
timeout : 設定超時時間,秒為單位
proxies : 字典類型,設定訪問代理服務器,可以增加登錄認證
allow_redirects : True/False,默認為True,重定向開關
stream : True/False,默認為True,獲取內容立即下載開關
verify : True/False,默認為True,認證SSL證書開關
cert : 本地SSL證書路徑
url: 擬更新頁面的url鏈接
data: 字典、字節序列或文件,Request的內容
json: JSON格式的數據,Request的內容
常用的兩個控制訪問參數:
1. 假設我們需要在GET請求裡自定義一個header頭文件:
import requestshd = {'User-agent':'123'}r = requests.get('http://www.baidu.com', headers=hd)print(r.request.headers)'''OUT:{'User-agent': '123', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}'''
2. 假設我們要自定義一個代理池
pxs = { 'http': 'http://user:[email protected]:1234', 'https': 'https://10.10.10.1:4321' }r = requests.get('http://www.baidu.com', proxies=pxs)
詳細瞭解Response對象
import requestsr = requests.get("http://www.baidu.com")'''Response(self)The :class:Response <Response> object, which contains a server's response to an HTTP request.'''#HTTP請求的返回狀態,比如,200表示成功,404表示失敗print (r.status_code)#HTTP請求中的headersprint (r.headers)#從header中猜測的響應的內容編碼方式 print (r.encoding)#從內容中分析的編碼方式(慢)print (r.apparent_encoding)#響應內容的二進制形式print (r.content)'''status_code:200 headers:{'Server': 'bfe/1.0.8.18', 'Date': 'Tue, 02 May 2017 12:01:47 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:27 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Content-Encoding':'gzip'}encoding: ISO-8859-1apparent_encoding:utf-8'''
requests抓取網頁的通用框架
import requestsdef getHtmlText(url): try: r = requests.get(url, timeout=30) # 如果狀態碼不是200 則應發HTTOError異常 r.raise_for_status() # 設置正確的編碼方式 r.encoding = r.apparent_encoding() return r.text except: return "Something Wrong!"
好了關於requests庫我們今天就寫到這,這是一個非常強大的庫,