Requests庫

1. Requests庫入門

1.1 安裝Requests庫

用管理員權限啟動cmd控制臺,執(zhí)行下列代碼

# 安裝Requests庫
pip install requests

在Python環(huán)境下運行下列代碼,驗證requests庫被安裝

# 載入requests庫
import requests

# 訪問百度主頁
r = requests.get('http://www.baidu.com')
# 查看狀態(tài)碼
r.status_code # 200(狀態(tài)碼200,表示訪問成功)

# 更改編碼
r.encoding = 'utf-8'
# 打印網絡內容
r.text # 【結果很多,省略】
requests庫方法 說明
requests.request() 構造一個請求,支撐以下各方法的基礎方法
requests.get() 獲取HTML網頁的主要方法,對應HTTP的GET
requests.head() 獲取HTML網頁頭信息的方法,對應HTTP的HEAD
requests.post() 向HTML網頁提交POST請求的方法,對應HTTP的POST
requests.put() 向HTML網頁提交PUT請求的方法,對應HTTP的PUT
requests.patch() 向HTML網頁提交局部修改請求,對應HTTP的PATCH
requests.delete() 向HTML網頁提交刪除請求,對應HTTP的PDELETE

1.2 get()方法

# 獲得一個網頁最簡單的代碼
r = requests.get('url')
# 完整的requests.get()函數(shù)的完整的使用方法有3個參數(shù)
r = requests.get('url', params=None, **kwargs)

url:擬獲取頁面的url鏈接
params:url中的格外參數(shù)、字典、字節(jié)流格式,可選
**kwargs:12個控制訪問的參數(shù),可選
構造一個向服務器請求資源的Request對象,這個對象是Requests內部生成的
返回一個包含服務器資源的Response對象

Requests庫的2個重要對象:Request對象、Response對象
Response對象:包含爬蟲返回的內容(包含服務器返回的所有信息,同時包含Request對象)

import requests
r = requests.get('http://www.baidu.com')
print(r.status_code)
# 檢測r的類型
type(r)
print(type(r)) # 【結果表示返回的r是一個class(類),class的名是requests】
# 返回get請求,獲得頁面的頭部信息
r.headers
Response對象屬性 說明
r.status_code HTTP請求的返回狀態(tài),200表示鏈接成功,404表示失敗
r.text HTTP響應內容的字符串形式,即url對應的內容頁面
r.encoding 從HTTP header中猜測的響應內容編碼方式
r.apparent_encoding 從內容中分析出的響應內容編碼方式
r.content HTTP響應內容的二進制形式

使用get()方法獲取網上資源流程
r.status_code檢測返回的Response對象狀態(tài)
如果是200,可用r.text、r.encoding、r.apparent_encoding、r.content等去解析返回的內容
如果404或者其他,說明這次url的訪問出現(xiàn)異常

import requests
r = requests.get('http://www.baidu.com')
print(r.status_code)

# 查看內容
r.text # (內容中有些地方有亂碼)
# 查看編碼
r.encoding # 'ISO-8859-1'
# 查看編碼
r.apparent_encoding # 'utf-8'

# 更改編碼后,答應內容
r.encoding = 'utf-8'
r.text # 內容中出現(xiàn)中文字符

r.encoding:如果header中不存在charset,則認為編碼為ISO-8859-1(ISO-8859-1編碼不能識別中文)
r.apparent_encoding:根據網頁內容分析出的編碼方式(原則上比r.encoding更加準確)

1.3 通用代碼框架

理解Requests庫的異常 說明
requests.ConnectionError 網絡連接錯誤異常,如DNS查詢失敗、決絕連接等
requests.HTTPError HTTP錯誤異常
requests.URLRequired URL缺失異常
requests.TooManyRedirects 超過最大重定向次數(shù),產生重定向異常
requests.ConnectTimeout 連接遠程服務器超時異常
requests.Timeout 請求URL超時,產出超時異常
# 下面方法專門與異常打交道,能夠判斷返回的Response狀態(tài)是不是200,是200將表示返回內容正確,不是200就會產生一個requests.HTTPError
r.raise_for_status()
import requests

def getHTMLText(url):
    '''
    爬取網頁通用代碼框架
    '''
    # 涉及異常處理,用try-except語句
    try:
        # get方法請求url連接
        r = requests.get(url, timeout = 30)
        # 判斷返回內容是不是正常。如果狀態(tài)碼不是200就會產生一個requests.HTTPError
        r.raise_for_status() 
        # 用apparent_encoding替代encoding使得返回內容解碼是正確的
        r.encoding = r.apparent_encoding
        # 返回網頁的內容
        return r.text
    except:
        return '產生異常'
if __name__ == '__main__':
    url = 'https://www.baidu.com'
    print(getHTMLText(url))

1.4 HTTP協(xié)議

HTTP(Hypertext Transfer Protocol, 超文本傳輸協(xié)議)
HTTP基于“請求與相應”模式的、無狀態(tài)的應用層協(xié)議

“請求與相應”模式:用戶發(fā)起請求,服務器做相關相應
無狀態(tài):第一次請求與第二次請求之間并沒有相關的關聯(lián)
應用層協(xié)議:指該協(xié)議工作在THP協(xié)議之上

HTTP協(xié)議采用URL作為定位網絡資源的標識

URL格式:http://host [:port] [path]
host:合法的Internet主機域名或IP地址
:post:端口號,省略端口為80
path:資源在主機或IP地址的服務器上的內部路徑

URL是通過HTTP協(xié)議存取資源的Internet路徑

方法 HTTP協(xié)議對資源的操作
GET 請求獲取URL位置的資源
HEAD 請求獲取URL位置資源的相應消息報告,即獲得該資源的頭部信息
POST 請求向URL位置的資源后附加新的數(shù)據
PUT 請求向URL位置存儲一個資源,覆蓋原URL位置的資源
PATCH 請求局部更新URL位置的資源,即改變該處資源的部分內容
DELETE 請求刪除URL位置存儲的資源

假設URL位置有一組數(shù)據UserInfo,包括UserID、UserName等
需求:用戶修改UserName,其他不變
采用PATCH:僅向URL提交UserName的局部更新請求(節(jié)省網絡帶寬)
采用PUT:必須將所有UserInfo一并提交到URL,未提交字段被刪除

HTTP協(xié)議與Requests庫方法(見1.1)是一一對應的

import requests
# head方法向服務器獲得頭部信息
r = requests.head('http://httpbin.org/get_ipython')
r.headers #{'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 07 Nov 2019 08:44:16 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Connection': 'keep-alive'}
r.text # ''[內容為空,故head方法用很少的流量獲得網絡資源的概要信息]

import requests
# 用post方法向服務器提交新增數(shù)據(字典數(shù)據自動編碼為form(表單)格式)
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data = payload)
print(r.text) # (一些內容) "form": {"key1": "value1", "key2": "value2"(其他內容)
# 用post方法向服務器提交新增數(shù)據(字符串數(shù)據自動編碼為data)
r = requests.post('http://httpbin.org/post', data = 'ABC')
print(r.text) # (一些內容) "data": "ABC","files": {},"form": {},(其他內容)

put方法與post類似,只是會把原有數(shù)據覆蓋掉

1.5 Requests庫主要方法解析

1.5.1 request函數(shù):requests.request(method, url, **kwargs)

method:請求方式

對應GET、PUT、POST、HEAD、PATCH、delete、OPTIONS(向服務器獲取一些跟客戶端能夠打交道的參數(shù),與獲取資源不直接相關)等7種,例如r = requests.request('OPTIONS', url, **kwargs)

url:擬獲取頁面的url連接

**kwargs:13個控制訪問參數(shù)

import requests
payload = {'key1': 'value1', 'key2': 'value2'}

'''
1. params:字典或字節(jié)序列,作為參數(shù)增加到url中
使得再訪問時不止訪問資源,同時帶入了一些參數(shù),服務器可以接受這些參數(shù),并根據參數(shù)篩選部分資源返回回來
'''
# 用get方法向某個連接請求同時提供字典作為params相關參數(shù)
# 因為參數(shù)是可選的,所以要用賦值的方式調用具體參數(shù)
r = requests.request('GET', 'http://httpbin.org/post', params = payload)
# 打印url連接
print(r.url) # http://httpbin.org/post?key1=value1&key2=value2

'''
2. data:字典、字節(jié)序列或文件對象,作為Request的內容,向服務器提交資源時使用(見1.4)

'''
'''
3. json:JSON格式的數(shù)據,作為Request的內容想服務器提交
'''
r = requests.request('POST', 'heep://python123.io/wa', json = payload)

'''
4. headers:字典,定義了向url 訪問時所發(fā)起的HTTP的頭字段
'''
# 定義一個字典,用于修改HTTP協(xié)議中的user-agent字段,把user-agent變?yōu)镃hrome/10(Chrome/10:Chrome瀏覽器的第10個版本)
hd = {'user-agent': 'Chrome/10'}
# 把hd賦給header,此時再去向服務器訪問時服務器看到的user-agent變?yōu)镃hrome/10。即我們可以模擬任何我們想模擬的瀏覽器向服務器發(fā)起訪問
r = requests.request('POST', 'heep://python123.io/wa', header = hd)

'''
5. cookies:字典或者CookiesJar,從HTTP協(xié)議中解析cookies
6. auth:元組,支持HTTP認證功能
'''

'''
7. files:字典類型,向服務器傳輸文件
'''
# 定義一個字典,以file和對應文件作為鍵值對,用open方式打開這個文件
fs = {'file': open('data.xls', 'rb')}
# 文件與files做關聯(lián),同時對應到相關url上
r = requests.request('POST', 'heep://python123.io/wa', files = fs)

'''
8. timeout:設定超時時間,以秒為單位
'''
# 向服務器發(fā)起一個GET請求,如果在timeout時間內請求未返回,將產生一個timeout異常
r = requests.request('GET', 'heep://python123.io/wa', timeout = 10)

'''
9. proxies:字典類型,爬取網頁設定訪問代理服務器,可以增加登錄認證。防止對爬蟲的逆追蹤
'''
# 增加2個代理,一是http訪問時使用的代理,可以增加用戶名和密碼;二是增加https的訪問時使用的代理服務器
pxs = {'http': 'http://user:pass@10.10.10.1:1234'
      'heeps': 'https://10.10.10.1:4321'}
# 這樣我們訪問服務器時使用的IP地址就是代理服務器的IP地址
r = requests.request('GET', 'heep://www.baidu.com', proxies = pxs)

'''
10. allow_redirects:True/False,默認為True,重定向開關,表示允不允許對url進行重定向
11. stream:True/False,默認為True,獲取內容立即下載開關,表示是否對獲取內容進行立即下載
12. verify:True/False,默認為True,認證SSL證書開關
13. cert:本地的SSL證書路徑
'''

1.5.2 另外6種方法方法

requests.get(url, params = None, **kwargs)

**kwargs:12個控制訪問參數(shù)(就是request里面除了params以外對應的參數(shù))
下列如果設定參數(shù)了,那 **kwargs只表示剩下的參數(shù)

requests.head(url, **kwargs)
requests.post(url, data = None, json = None, **kwargs)
requests.put(url, data = None, **kwargs)
requests.patch(url, data = None, **kwargs)
requests.delete(url, **kwargs)

HTTP協(xié)議中,向服務器提交資源的功能在服務器上是嚴格控制

1.6 單元小結

1.6.1 requests庫7種方法

requests.request():基礎方法
requests.get()、requests.head():最常使用的就是get;對于特別大的網絡連接用head獲取資源概要(重點掌握)
requests.post()、requests.put()、requests.patch()、requests.delete():由于網絡安全的限制,很難向url去發(fā)起請求

1.6.2 爬取網頁的通用代碼框架

try:
    r = requests.get(url, timeout = 30)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    return r.text
except:
    return '產生異常'

2. 網絡爬蟲的“盜亦有道”

目的 爬蟲尺度 應用庫
爬取網頁 小規(guī)模,數(shù)據量小,爬取速度不敏感 Requests庫
爬取網站 中規(guī)模,數(shù)據量大,爬取速度敏感 Scrapy庫
爬取全網 大規(guī)模,搜索引擎,爬取速度關鍵 定制開發(fā)

2.1 網絡爬蟲引發(fā)的問題

1)“騷擾”問題:受限于編寫水平和目的,爬蟲將會給web服務器帶來巨大的資源開銷
2)法律風險:服務器上的數(shù)據有產權歸屬,獲得數(shù)據用于牟利將帶來法律風險
3)泄露隱私:具備突破簡單訪問控制的能力,獲得被保護數(shù)據從而泄露個人隱私

網絡爬蟲限制
1)來源審查:判斷User-Agent進行限制。檢查來訪HTTP協(xié)議頭的User-Agent域,只響應瀏覽器或友好爬蟲的訪問
2)發(fā)布公告:Robots協(xié)議。告知所有爬蟲,網址的爬取策略,要求爬蟲遵守
檢查來訪HTTP協(xié)議頭的User-Agent域,只響應瀏覽器或友好爬蟲的訪問

2.2 Robots協(xié)議

Robots協(xié)議(Robots Exclusion Standard):網絡爬蟲排除標準
作用:告知爬蟲哪些頁面可以爬取,哪些不行
形式:網址根目錄下的robots.txt文件

# 網址https://www.jd.com/robots.txt(京東的Robots協(xié)議)
User-agent: * # 表示所有的網絡爬蟲
Disallow: /?* # 不允許訪問以?開頭的路徑
Disallow: /pop/*.html 
Disallow: /pinpai/*.html?* 
User-agent: EtaoSpider # 這個爬蟲的協(xié)議頭不允許爬取京東的任何資源
Disallow: / 
User-agent: HuihuiSpider 
Disallow: / 
User-agent: GwdangSpider 
Disallow: / 
User-agent: WochachaSpider 
Disallow: /
# Robots協(xié)議基本語法,*代表所有,/代表根目錄
User-agent: *
Disallow: / 

Robots協(xié)議規(guī)定,如果一個網址不提robots.txt文件,說明這個網址允許所有爬蟲無限制的爬取其內容

目錄
Python網絡爬蟲與信息提取
一、Requests庫
二、Beautiful Soup庫
三、Re庫
四、Scrapy框架
匯總

python網絡爬蟲與信息提取.jpg

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容