導(dǎo)入 requests 庫之后,基本都在圍繞 requests.get 做文章,這里重點要回顧的是 get 方法的參數(shù),其中包含如下內(nèi)容,下述內(nèi)容在官方手冊沒有呈現(xiàn)清單,通過最新版源碼分析。
除 url 參數(shù)外,其余都為可選參數(shù),即非必選。
以上內(nèi)容就是 GET 請求中可以配置的參數(shù),除了 GET 請求外,requests 還內(nèi)置了其他的服務(wù)器請求方式,如下所示,這些方法需要的參數(shù)與上述清單一致。
GET, OPTIONS, HEAD, POST, PUT, PATCH, or DELETE
在 Python 爬蟲的實戰(zhàn)當(dāng)中,主要以 GET 與 POST 為主,常用的參數(shù)為:
url,params,data,headers,cookies,timeout,proxies,verify。
使用 requests 庫請求之后,會得到一個 Response 對象,該對象最重要的內(nèi)容就是屬性與方法,通過 dir 函數(shù)可以獲取 Response 對象的屬性和方法。
help(res) print(dir(res))
獲取到的內(nèi)容如下所示,其中有我們之前案例中常見的一些內(nèi)容。
['__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 庫應(yīng)用在爬蟲采集領(lǐng)域,那上述屬性與方法中,比較常用的有:
在本專欄前面的文章中,存在一個被忽略的 requests 高級特性,即會話對象
該對象能夠在跨域請求的時候,保持住某些參數(shù),尤其是 cookie
如果你想向同一主機發(fā)送多個請求,使用會話對象可以將底層的 TCP 連接進行重用,帶來顯著的性能提升。
# 建立會話對象 s = requests.Session() # 后續(xù)都使用會話對象進行進行,而不是直接使用 requests 對象 s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') r = s.get("http://httpbin.org/cookies") print(r.text)
由于專欄前面并未涉及相關(guān)案例,故直接引入官方手冊案例說明。
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)
接下來官網(wǎng)案例還展示了 法級別的參數(shù)也不會被跨請求保持,即在 s.get() 方法中如果傳遞了 cookie,那不會被保持住,這兩個案例,從正面與反面為我們核心展示的就是,如何使用會話對象保持參數(shù)
在爬蟲采集數(shù)據(jù)的過程中,碰到 https 的網(wǎng)站在正常不過,requests 庫使用過程中 SSL 驗證是默認開啟的,如果證書驗證失敗,即拋出 SSLError錯誤。
不過更多的時候,我們通過設(shè)置 verify = False ,忽略對 SSL 證書的驗證,除非及其特殊的情況,必須增加相關(guān)證書邏輯。
有的網(wǎng)站在采集過程中,會針對 IP 進行限制,此時就需要使用代理進行跳過操作,設(shè)置 proxies 參數(shù)即可,本部分內(nèi)容比較簡單,后續(xù)很多案例還會復(fù)用到。
除了 HTTP 代理外, requests 2.10 版本之后,增加了 SOCKS 代理,如果你需要使用,需要通過 pip 安裝相應(yīng)庫。
pip install requests[socks]
安裝完畢,出現(xiàn)新的第三方庫 PySocks,使用方式與 HTTP 代理一致。
爬蟲采集過程會大量的與 cookie 打交道,
獲取網(wǎng)站響應(yīng)的 cookie,使用 response 對象的 cookies 屬性即可。
url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies)
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 對象具備更加豐富的接口,適合跨域名跨路徑使用,相關(guān)接口查詢:
https://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar
requests 非常適合作為 Python 爬蟲入門階段第一選擇,其簡單的接口與代碼封裝
lxml 庫是一款 Python 數(shù)據(jù)解析庫,參考重要文檔在 https://lxml.de/,項目開源地址在:https://github.com/lxml/lxml,在一頓檢索之后,發(fā)現(xiàn) lxml 沒有中文相關(guān)手冊,不過好在英文文檔閱讀難度不大,我們可以直接進行學(xué)習(xí)。
縱覽之前的博客內(nèi)容,出場率最高的就是 lxml.etree ,其次就是 Element 對象,我們在解析數(shù)據(jù)的時候,大量的代碼都是基于 Element 對象的 API 實現(xiàn)。
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)
上述代碼輸出內(nèi)容如下所示:
Element html at 0x3310508>
html
print(root_element[1])
print("*"*100) for child in root_element: print(child.tag)
上述代碼輸出的內(nèi)容為:
head
body
該輸出表示在 html 標(biāo)簽中,只包含head 與 body 標(biāo)簽,實際情況也確實如此,為了驗證,你可以在 循環(huán)中繼續(xù)嵌套一層。
此時輸出的內(nèi)容就變得豐富了需求,如下圖所示:
你也可以通過 etree.tostring(element對象) 直接將該對象轉(zhuǎn)換為字符串進行輸出。
for child in root_element: for item in child: print(item.tag) print(etree.tostring(item))
lxml 庫可以配合其他的解析引擎進行工作,首次接觸的就是 XPath,關(guān)于 XPath 相關(guān)的知識,我們后續(xù)會細化學(xué)習(xí),本節(jié)課依舊從 lxml 的角度出發(fā),為你介紹。
在爬蟲代碼編寫中,直接使用 html.xpath("xpath表達式") 即可獲取目標(biāo)數(shù)據(jù),例如獲取網(wǎng)頁 title。
print(root_element.xpath('//title'))
獲取網(wǎng)頁所有文本:
print(root_element.xpath('string()'))
獲取到 element 對象之后,可調(diào)用 text 屬性,獲取對應(yīng)文本,在使用的時候,需要注意使用 XPath 獲取到的 element 對象,都是列表。
title_element = root_element.xpath('//title') print(title_element[0].text)
在 lxml 中,還內(nèi)置了一款 簡單的類似 XPath 的路徑語言,稱為 ElementPath,例如查詢 title,需要從 head 開始檢索,否則返回 None。
print(root_element[0].find("title"))
官方提供的方法如下:
lxml 除了可以配合 XPath 實現(xiàn)數(shù)據(jù)解析外,還可以與 cssselect ,BeautifulSoup,html5lib 配合使用,這部分在后續(xù)的案例中,將逐步進行展開。
lxml 在爬蟲領(lǐng)域,更多的是在提取數(shù)據(jù),因此較于該庫本身,掌握 XPath 等解析表達式的寫法更加重要。
鑒于該庫手冊沒有被翻譯,后期可以嘗試將其翻譯為中文。
到此這篇關(guān)于總結(jié)python常用request庫與lxml庫常用操作的文章就介紹到這了,更多相關(guān)python中request庫與lxml庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:海南 漯河 盤錦 寧夏 南平 林芝 大同 普洱
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python常用request庫與lxml庫操作方法整理總結(jié)》,本文關(guān)鍵詞 python,常用,request,庫與,lxml,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。