一路學習,一路總結,技術就是這樣,應用之后,在進行整理,才可以加深印象,
本篇博客為小節篇,核心總結 requests 庫與 lxml 庫
文章目錄
- requests 庫
- requests 庫最常見的操作
- 請求引數以及請求方法
- 回應物件的屬性與方法
- 會話物件
- SSL 證書驗證,客戶端證書,CA 證書
- 代理
- Cookie
- lxml 庫
- lxml.etree
- XPath
- lxml 其他說明
- 收藏時間
requests 庫
在《爬蟲 120 例》中,最先接觸的第三方庫就是 requests,該庫開源地址為:https://github.com/psf/requests,官方的 solgan 為 Requests is a simple, yet elegant, HTTP library,
日常在編碼程序中,最重要的行為就是查詢手冊,requests 庫提供了中文手冊 - https://docs.python-requests.org/zh_CN/latest/,大幅度降低了學習的難度,不過中文翻譯夾帶了不少翻譯者的情緒化文字,閱讀的時候忽略即可,
requests 庫最常見的操作
由于該專欄前面已經對 requests 庫進行了大量的使用,其常見操作我們也可以進行一些相應的總結了,
請求引數以及請求方法
匯入 requests 庫之后,基本都在圍繞 requests.get 做文章,這里重點要回顧的是 get 方法的引數,其中包含如下內容,下述內容在官方手冊沒有呈現清單,通過最新版原始碼分析,
除 url 引數外,其余都為可選引數,即非必選,
url:請求地址;params:要發送的查詢字串,可以為字典,串列,元組,位元組;data:body 物件中要傳遞的引數,可以為欄位,串列,元組,位元組或者檔案物件;json:JSON 序列化物件;headers:請求頭,字典格式;cookies:傳遞 cookie,欄位或CookieJar型別;files:最復雜的一個引數,一般出現在POST請求中,格式舉例"name":檔案物件或者{'name':檔案物件},還可以在一個請求中發送多個檔案,不過一般爬蟲場景不會用到;auth:指定身份驗證機制;timeout:服務器等待回應時間,在原始碼中檢索到可以為元組型別,這個之前沒有使用過,即(connect timeout, read timeout);allow_redirects:是否允許重定向;proxies:代理;verify:SSL 驗證;stream:流式請求,主要對接流式 API;cert:證書,
以上內容就是 GET 請求中可以配置的引數,除了 GET 請求外,requests 還內置了其他的服務器請求方式,如下所示,這些方法需要的引數與上述清單一致,
GET, OPTIONS, HEAD, POST, PUT, PATCH, or DELETE
在 Python 爬蟲的實戰當中,主要以 GET 與 POST 為主,常用的引數為:url,params,data,headers,cookies,timeout,proxies,verify,
回應物件的屬性與方法
使用 requests 庫請求之后,會得到一個 Response 物件,該物件最重要的內容就是屬性與方法,通過 dir 函式可以獲取 Response 物件的屬性和方法,
help(res)
print(dir(res))
獲取到的內容如下所示,其中有我們之前案例中常見的一些內容,
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'_content', '_content_consumed', '_next', 'apparent_encoding', 'close', 'connection',
'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect',
'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status',
'raw', 'reason', 'request', 'status_code', 'text', 'url']
如果只將 requests 庫應用在爬蟲采集領域,那上述屬性與方法中,比較常用的有:
屬性 property
ok:只要狀態碼status_code小于 400,都會回傳 True;is_redirect:重定向屬性;content:回應內容,位元組型別;text:回應內容,Unicode 型別;status_code:回應狀態碼;url:回應的最終 URL 位置;encoding:當訪問r.text時的編碼;
方法
json:將回應結果序列化為 JSON;
會話物件
在本專欄前面的文章中,存在一個被忽略的 requests 高級特性,即會話物件,該物件能夠在跨域請求的時候,保持住某些引數,尤其是 cookie,如果你想向同一主機發送多個請求,使用會話物件可以將底層的 TCP 連接進行重用,帶來顯著的性能提升,
會話物件使用非常簡單,在發起 requests 物件之前,增加如下所示代碼即可,
# 建立會話物件
s = requests.Session()
# 后續都使用會話物件進行進行,而不是直接使用 requests 物件
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
由于專欄前面并未涉及相關案例,故直接引入官方手冊案例說明,
下述代碼演示的是會話也可用來為請求方法提供預設資料,顧名思義就是直接給會話物件增加的請求引數,在后續代碼中默認可用,
import requests
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
print(r.text)
接下來官網案例還展示了 法級別的引數也不會被跨請求保持,即在 s.get() 方法中如果傳遞了 cookie,那不會被保持住,這兩個案例,從正面與反面為我們核心展示的就是,如何使用會話物件保持引數,通過會話物件的屬性設定的引數,能被保持,而通過會話物件方法傳遞的引數,不能被保持,
SSL 證書驗證,客戶端證書,CA 證書
在爬蟲采集資料的程序中,碰到 https 的網站在正常不過,requests 庫使用程序中 SSL 驗證是默認開啟的,如果證書驗證失敗,即拋出 SSLError錯誤,
不過更多的時候,我們通過設定 verify = False ,忽略對 SSL 證書的驗證,除非及其特殊的情況,必須增加相關證書邏輯,
代理
有的網站在采集程序中,會針對 IP 進行限制,此時就需要使用代理進行跳過操作,設定 proxies 引數即可,本部分內容比較簡單,后續很多案例還會復用到,
除了 HTTP 代理外, requests 2.10 版本之后,增加了 SOCKS 代理,如果你需要使用,需要通過 pip 安裝相應庫,
pip install requests[socks]
安裝完畢,出現新的第三方庫 PySocks,使用方式與 HTTP 代理一致,
Cookie
爬蟲采集程序會大量的與 cookie 打交道,獲取網站回應的 cookie,使用 response 物件的 cookies 屬性即可,如果希望向服務器傳遞 cookie,可以通過 cookies 引數,例如下述代碼:
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
如果你希望對 cookie 有更加細致的操作,重點研究 requests.cookies.RequestsCookieJar 物件即可,簡單的代碼使用如下所示:
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
print(r.text)
RequestsCookieJar 物件具備更加豐富的介面,適合跨域名跨路徑使用,相關介面可在 https://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar 查詢,
requests 非常適合作為 Python 爬蟲入門階段第一選擇,其簡單的介面與代碼封裝,能大幅度降低網路請求代碼撰寫難度,讓你專注與目標資料的提取,更有基于高級請求的封裝作為提高部分,該庫完全可以貫穿你的整個爬蟲工程師生涯,
lxml 庫
lxml 庫是一款 Python 資料決議庫,參考重要檔案在 https://lxml.de/,專案開源地址在:https://github.com/lxml/lxml,在一頓檢索之后,發現 lxml 沒有中文相關手冊,不過好在英文檔案閱讀難度不大,我們可以直接進行學習,
lxml.etree
縱覽之前的博客內容,出場率最高的就是 lxml.etree ,其次就是 Element 物件,我們在決議資料的時候,大量的代碼都是基于 Element 物件的 API 實作,
在爬蟲代碼采集程序中,通過 etree.HTML 直接將字串實體化為 element 物件,
import requests
from lxml import etree
res = requests.get("http://www.jsons.cn/zt/")
html = res.text
root_element = etree.HTML(html)
print(root_element)
print(root_element.tag)
上述代碼輸出內容如下所示:
<Element html at 0x3310508>
html
其中需要注意的是 Element 后面的 html,該字串表示物件的標簽名為 html,如果使用下述代碼:
print(root_element[1])
上述內容得到的是 <Element body at 0x356e248>,即 body 標簽,同樣的操作可以使用子元素獲取,
print("*"*100)
for child in root_element:
print(child.tag)
上述代碼輸出的內容為:
head
body
該輸出表示在 html 標簽中,只包含head 與 body 標簽,實際情況也確實如此,為了驗證,你可以在 回圈中繼續嵌套一層,
此時輸出的內容就變得豐富了需求,如下圖所示:

你也可以通過 etree.tostring(element物件) 直接將該物件轉換為字串進行輸出,
for child in root_element:
for item in child:
print(item.tag)
print(etree.tostring(item))
XPath
lxml 庫可以配合其他的決議引擎進行作業,首次接觸的就是 XPath,關于 XPath 相關的知識,我們后續博客會細化學習,本節課依舊從 lxml 的角度出發,為你介紹,
在爬蟲代碼撰寫中,直接使用 html.xpath("xpath運算式") 即可獲取目標資料,例如獲取網頁 title,
print(root_element.xpath('//title'))
獲取網頁所有文本:
print(root_element.xpath('string()'))
獲取到 element 物件之后,可呼叫 text 屬性,獲取對應文本,在使用的時候,需要注意使用 XPath 獲取到的 element 物件,都是串列,
title_element = root_element.xpath('//title')
print(title_element[0].text)
在 lxml 中,還內置了一款 簡單的類似 XPath 的路徑語言,稱為 ElementPath,例如查詢 title,需要從 head 開始檢索,否則回傳 None,
print(root_element[0].find("title"))
官方提供的方法如下:
iterfind(): 回傳查找到的資料,迭代器形式回傳;findall(): 回傳匹配到的串列;find(): 回傳第一個匹配到的資料;findtext(): 回傳匹配到的文本資料,第一個,
lxml 其他說明
lxml 除了可以配合 XPath 實作資料決議外,還可以與 cssselect ,BeautifulSoup,html5lib 配合使用,這部分在后續的案例中,將逐步進行展開,
lxml 在爬蟲領域,更多的是在提取資料,因此較于該庫本身,掌握 XPath 等決議運算式的寫法更加重要,
鑒于該庫手冊沒有被翻譯,后期可以嘗試將其翻譯為中文,
收藏時間
爬蟲120例代碼下載地址:https://codechina.csdn.net/hihell/python120,可否給個 Star,
來都來了,不發個評論,點個贊,收個藏嗎?
今天是持續寫作的第 197 / 200 天,
可以關注我,點贊我、評論我、收藏我啦,
更多精彩
《Python 爬蟲 100 例》只需要 39.9 元,即可享受 100+篇博客閱讀權,每篇不到 4 毛錢,
- Python 爬蟲 100 例教程導航帖(已完結)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/294480.html
標籤:python
