原文鏈接:https://www.fkomm.cn/article/2018/7/16/16.html
來說先說爬蟲的原理:爬蟲本質上是模擬人瀏覽信息的過程,只不過他通過計算機來達到快速抓取篩選信息的目的所以我們想要寫一個爬蟲,最基本的就是要將我們需要抓取信息的網頁原原本本的抓取下來。這個時候就要用到請求庫了。
requests庫的安裝
requests庫本質上就是模擬了我們用瀏覽器打開一個網頁,發起請求是的動作。它能夠迅速的把請求的html源文件保存到本地
安裝的方式非常簡單:
我們用PIP工具在命令行裏進行安裝
$ pip install requests
接着我們看一下是否成功安裝了requests庫:
$ pip list
看一下安裝結果:
equests庫的基本使用:
#首先我們先導入requests這個包
import requests
#我們來把百度的index頁面的源碼抓取到本地,並用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的內容
常用的兩個控制訪問參數:
-
假設我們需要在GET請求裏自定義一個header頭文件:
hd = {'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'} '''
- 假設我們要自定義一個代理池:
pxs = { 'http': 'http://user:[email protected]:1234', 'https': 'https://10.10.10.1:4321' } r = requests.get('http://www.baidu.com', proxies=pxs)
詳細瞭解Response對象:
'''
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請求中的headers
print (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', 'La
st-Modified': 'Mon, 23 Jan 2017 13:28:27 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'Keep-A
live', '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-1
apparent_encoding:utf-8
'''
requests抓取網頁的通用框架
import requests
def 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庫我們今天就寫到這,
這是一個非常強大的庫,
更多的功能大家可以去看一下官方的文檔
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html