欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python常用request庫與lxml庫操作方法整理總結(jié)

 更新時(shí)間:2021年08月18日 17:47:53   作者:夢(mèng)想橡皮擦  
一路學(xué)習(xí),一路總結(jié),技術(shù)就是這樣,應(yīng)用之后,在進(jìn)行整理,才可以加深印象。本篇文字為小節(jié)篇,核心總結(jié) requests 庫與 lxml 庫常用的操作

requests 庫最常見的操作

請(qǐng)求參數(shù)以及請(qǐng)求方法

導(dǎo)入 requests 庫之后,基本都在圍繞 requests.get 做文章,這里重點(diǎn)要回顧的是 get 方法的參數(shù),其中包含如下內(nèi)容,下述內(nèi)容在官方手冊(cè)沒有呈現(xiàn)清單,通過最新版源碼分析。

除 url 參數(shù)外,其余都為可選參數(shù),即非必選。

  • url:請(qǐng)求地址;
  • params:要發(fā)送的查詢字符串,可以為字典,列表,元組,字節(jié);
  • data:body 對(duì)象中要傳遞的參數(shù),可以為字段,列表,元組,字節(jié)或者文件對(duì)象;
  • json:JSON 序列化對(duì)象;
  • headers:請(qǐng)求頭,字典格式;
  • cookies:傳遞 cookie,字段或 CookieJar 類型;
  • files:最復(fù)雜的一個(gè)參數(shù),一般出現(xiàn)在 POST 請(qǐng)求中,格式舉例 "name":文件對(duì)象 或者 {'name':文件對(duì)象},還可以在一個(gè)請(qǐng)求中發(fā)送多個(gè)文件,不過一般爬蟲場景不會(huì)用到;
  • auth:指定身份驗(yàn)證機(jī)制;
  • timeout:服務(wù)器等待響應(yīng)時(shí)間,在源碼中檢索到可以為元組類型,這個(gè)之前沒有使用過,即 (connect timeout, read timeout);
  • allow_redirects:是否允許重定向;
  • proxies:代理;
  • verify:SSL 驗(yàn)證;
  • stream:流式請(qǐng)求,主要對(duì)接流式 API;
  • cert:證書。

以上內(nèi)容就是 GET 請(qǐng)求中可以配置的參數(shù),除了 GET 請(qǐng)求外,requests 還內(nèi)置了其他的服務(wù)器請(qǐng)求方式,如下所示,這些方法需要的參數(shù)與上述清單一致。

GET, OPTIONS, HEAD, POST, PUT, PATCH, or DELETE

在 Python 爬蟲的實(shí)戰(zhàn)當(dāng)中,主要以 GET 與 POST 為主,常用的參數(shù)為:

url,params,data,headers,cookies,timeout,proxies,verify。

響應(yīng)對(duì)象的屬性與方法

使用 requests 庫請(qǐng)求之后,會(huì)得到一個(gè) Response 對(duì)象,該對(duì)象最重要的內(nèi)容就是屬性與方法,通過 dir 函數(shù)可以獲取 Response 對(duì)象的屬性和方法。

    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)域,那上述屬性與方法中,比較常用的有:

屬性 property

  • ok:只要狀態(tài)碼 status_code 小于 400,都會(huì)返回 True;
  • is_redirect:重定向?qū)傩裕?/li>
  • content:響應(yīng)內(nèi)容,字節(jié)類型;
  • text:響應(yīng)內(nèi)容,Unicode 類型;
  • status_code:響應(yīng)狀態(tài)碼;
  • url:響應(yīng)的最終 URL 位置;
  • encoding:當(dāng)訪問 r.text 時(shí)的編碼;

方法

  • json:將響應(yīng)結(jié)果序列化為 JSON;

會(huì)話對(duì)象

在本專欄前面的文章中,存在一個(gè)被忽略的 requests 高級(jí)特性,即會(huì)話對(duì)象

該對(duì)象能夠在跨域請(qǐng)求的時(shí)候,保持住某些參數(shù),尤其是 cookie

如果你想向同一主機(jī)發(fā)送多個(gè)請(qǐng)求,使用會(huì)話對(duì)象可以將底層的 TCP 連接進(jìn)行重用,帶來顯著的性能提升。

  • 會(huì)話對(duì)象使用非常簡單,在發(fā)起 requests 對(duì)象之前,增加如下所示代碼即可。
# 建立會(huì)話對(duì)象
s = requests.Session()
# 后續(xù)都使用會(huì)話對(duì)象進(jìn)行進(jìn)行,而不是直接使用 requests 對(duì)象
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)

由于專欄前面并未涉及相關(guān)案例,故直接引入官方手冊(cè)案例說明。

  • 下述代碼演示的是會(huì)話也可用來為請(qǐng)求方法提供缺省數(shù)據(jù),顧名思義就是直接給會(huì)話對(duì)象增加的請(qǐng)求參數(shù),在后續(xù)代碼中默認(rè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)案例還展示了 法級(jí)別的參數(shù)也不會(huì)被跨請(qǐng)求保持,即在 s.get() 方法中如果傳遞了 cookie,那不會(huì)被保持住,這兩個(gè)案例,從正面與反面為我們核心展示的就是,如何使用會(huì)話對(duì)象保持參數(shù)

  • 通過會(huì)話對(duì)象的屬性設(shè)置的參數(shù),能被保持,
  • 而通過會(huì)話對(duì)象方法傳遞的參數(shù),不能被保持。

SSL 證書驗(yàn)證,客戶端證書,CA 證書

在爬蟲采集數(shù)據(jù)的過程中,碰到 https 的網(wǎng)站在正常不過,requests 庫使用過程中 SSL 驗(yàn)證是默認(rèn)開啟的,如果證書驗(yàn)證失敗,即拋出 SSLError錯(cuò)誤。

不過更多的時(shí)候,我們通過設(shè)置 verify = False ,忽略對(duì) SSL 證書的驗(yàn)證,除非及其特殊的情況,必須增加相關(guān)證書邏輯。

代理

有的網(wǎng)站在采集過程中,會(huì)針對(duì) IP 進(jìn)行限制,此時(shí)就需要使用代理進(jìn)行跳過操作,設(shè)置 proxies 參數(shù)即可,本部分內(nèi)容比較簡單,后續(xù)很多案例還會(huì)復(fù)用到。

除了 HTTP 代理外, requests 2.10 版本之后,增加了 SOCKS 代理,如果你需要使用,需要通過 pip 安裝相應(yīng)庫。

pip install requests[socks]

安裝完畢,出現(xiàn)新的第三方庫 PySocks,使用方式與 HTTP 代理一致。

Cookie

爬蟲采集過程會(huì)大量的與 cookie 打交道,

獲取網(wǎng)站響應(yīng)的 cookie,使用 response 對(duì)象的 cookies 屬性即可。

  • 如果希望向服務(wù)器傳遞 cookie,可以通過 cookies 參數(shù),例如下述代碼:
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
  • 如果你希望對(duì) cookie 有更加細(xì)致的操作,重點(diǎn)研究 requests.cookies.RequestsCookieJar 對(duì)象即可,簡單的代碼使用如下所示:
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 對(duì)象具備更加豐富的接口,適合跨域名跨路徑使用,相關(guān)接口查詢:

https://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar

requests 非常適合作為 Python 爬蟲入門階段第一選擇,其簡單的接口與代碼封裝

  • 能大幅度降低網(wǎng)絡(luò)請(qǐng)求代碼編寫難度,讓你專注與目標(biāo)數(shù)據(jù)的提取,
  • 更有基于高級(jí)請(qǐng)求的封裝作為提高部分,該庫完全可以貫穿你的整個(gè)爬蟲工程師生涯。

lxml 庫

lxml 庫是一款 Python 數(shù)據(jù)解析庫,參考重要文檔在 https://lxml.de/,項(xiàng)目開源地址在:https://github.com/lxml/lxml,在一頓檢索之后,發(fā)現(xiàn) lxml 沒有中文相關(guān)手冊(cè),不過好在英文文檔閱讀難度不大,我們可以直接進(jìn)行學(xué)習(xí)。

lxml.etree

縱覽之前的博客內(nèi)容,出場率最高的就是 lxml.etree ,其次就是 Element 對(duì)象,我們?cè)诮馕鰯?shù)據(jù)的時(shí)候,大量的代碼都是基于 Element 對(duì)象的 API 實(shí)現(xiàn)。

  • 在爬蟲代碼采集過程中,通過 etree.HTML 直接將字符串實(shí)例化為 element 對(duì)象。
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

  • 其中需要注意的是 Element 后面的 html,該字符串表示對(duì)象的標(biāo)簽名為 html,如果使用下述代碼:
print(root_element[1])
  • 上述內(nèi)容得到的是 <Element body at 0x356e248>,即 body 標(biāo)簽,同樣的操作可以使用子元素獲取。
print("*"*100)
for child in root_element:
    print(child.tag)

上述代碼輸出的內(nèi)容為:

head
body

該輸出表示在 html 標(biāo)簽中,只包含head 與 body 標(biāo)簽,實(shí)際情況也確實(shí)如此,為了驗(yàn)證,你可以在 循環(huán)中繼續(xù)嵌套一層。

此時(shí)輸出的內(nèi)容就變得豐富了需求,如下圖所示:

requests庫與 lxml 庫常用操作整理+總結(jié),爬蟲120例階段整理篇

你也可以通過 etree.tostring(element對(duì)象) 直接將該對(duì)象轉(zhuǎn)換為字符串進(jìn)行輸出。

for child in root_element:
    for item in child:
        print(item.tag)
        print(etree.tostring(item))

XPath

lxml 庫可以配合其他的解析引擎進(jìn)行工作,首次接觸的就是 XPath,關(guān)于 XPath 相關(guān)的知識(shí),我們后續(xù)會(huì)細(xì)化學(xué)習(xí),本節(jié)課依舊從 lxml 的角度出發(fā),為你介紹。

在爬蟲代碼編寫中,直接使用 html.xpath("xpath表達(dá)式") 即可獲取目標(biāo)數(shù)據(jù),例如獲取網(wǎng)頁 title。

print(root_element.xpath('//title'))

獲取網(wǎng)頁所有文本:

print(root_element.xpath('string()'))

獲取到 element 對(duì)象之后,可調(diào)用 text 屬性,獲取對(duì)應(yīng)文本,在使用的時(shí)候,需要注意使用 XPath 獲取到的 element 對(duì)象,都是列表。

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"))

官方提供的方法如下:

  • iterfind(): 返回查找到的數(shù)據(jù),迭代器形式返回;
  • findall(): 返回匹配到的列表;
  • find(): 返回第一個(gè)匹配到的數(shù)據(jù);
  • findtext(): 返回匹配到的文本數(shù)據(jù),第一個(gè)。

lxml 其他說明

lxml 除了可以配合 XPath 實(shí)現(xiàn)數(shù)據(jù)解析外,還可以與 cssselect ,BeautifulSoup,html5lib 配合使用,這部分在后續(xù)的案例中,將逐步進(jìn)行展開。

lxml 在爬蟲領(lǐng)域,更多的是在提取數(shù)據(jù),因此較于該庫本身,掌握 XPath 等解析表達(dá)式的寫法更加重要。

鑒于該庫手冊(cè)沒有被翻譯,后期可以嘗試將其翻譯為中文。

到此這篇關(guān)于總結(jié)python常用request庫與lxml庫常用操作的文章就介紹到這了,更多相關(guān)python中request庫與lxml庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Windows中安裝使用Virtualenv來創(chuàng)建獨(dú)立Python環(huán)境

    Windows中安裝使用Virtualenv來創(chuàng)建獨(dú)立Python環(huán)境

    有時(shí)我們的程序中需要調(diào)用不同版本的Python包和模塊,那么借助Virtualenv的虛擬環(huán)境就可以幫助我們隔離使用,接下來我們就來看一下在Windows中安裝使用Virtualenv來創(chuàng)建獨(dú)立Python環(huán)境的方法
    2016-05-05
  • pycharm出現(xiàn)了pytest模式下如何改回run模式

    pycharm出現(xiàn)了pytest模式下如何改回run模式

    這篇文章主要介紹了pycharm出現(xiàn)了pytest模式下如何改回run模式問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL Prepared語句的具體使用

    MySQL Prepared語句的具體使用

    本文主要介紹了MySQL Prepared語句的具體使用,可以利用prepared語句來避免重復(fù)解析SQL的開銷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • 深入理解Python虛擬機(jī)中整型(int)的實(shí)現(xiàn)原理及源碼剖析

    深入理解Python虛擬機(jī)中整型(int)的實(shí)現(xiàn)原理及源碼剖析

    在本篇文章當(dāng)中主要給大家介紹在 cpython 內(nèi)部是如何實(shí)現(xiàn)整型數(shù)據(jù) int 的,主要是分析 int 類型的表示方式,分析 int 類型的巧妙設(shè)計(jì)
    2023-03-03
  • 基于Python實(shí)現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)導(dǎo)出工具

    基于Python實(shí)現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)導(dǎo)出工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)將數(shù)據(jù)庫表結(jié)構(gòu)導(dǎo)出到 Word 文檔的實(shí)用工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Python?statistics模塊示例詳解

    Python?statistics模塊示例詳解

    這篇文章主要介紹了Python?statistics模塊示例詳解,本文總結(jié)了 statistics 模塊的常規(guī)操作,對(duì)于數(shù)據(jù)分析還是非常有益處的,需要的朋友可以參考下
    2023-05-05
  • Python全棧之學(xué)習(xí)CSS(1)

    Python全棧之學(xué)習(xí)CSS(1)

    這篇文章主要為大家介紹了Python全棧之CSS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • python記錄程序運(yùn)行時(shí)間的三種方法

    python記錄程序運(yùn)行時(shí)間的三種方法

    這篇文章主要介紹了python記錄程序運(yùn)行時(shí)間的三種方法的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Sublime Text v4.0(4143)安裝方法

    Sublime Text v4.0(4143)安裝方法

    這篇文章主要介紹了Sublime Text v4.0(4143)安裝破解方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • python用什么編輯器進(jìn)行項(xiàng)目開發(fā)

    python用什么編輯器進(jìn)行項(xiàng)目開發(fā)

    在本篇文章里小編給大家整理的是一篇關(guān)于python開發(fā)用的編輯器詳細(xì)介紹,有需要的朋友們可以參考下哎。
    2020-06-06

最新評(píng)論