主頁 > 後端開發 > requests庫與 lxml 庫常用操作整理+總結,爬蟲120例階段整理篇

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

2021-08-18 08:05:04 後端開發

一路學習,一路總結,技術就是這樣,應用之后,在進行整理,才可以加深印象,
本篇博客為小節篇,核心總結 requests 庫與 lxml 庫

文章目錄

    • requests 庫
    • requests 庫最常見的操作
      • 請求引數以及請求方法
      • 回應物件的屬性與方法
      • 會話物件
      • SSL 證書驗證,客戶端證書,CA 證書
      • 代理
      • Cookie
    • lxml 庫
      • lxml.etree
      • XPath
      • lxml 其他說明
    • 收藏時間

requests 庫

在《爬蟲 120 例》中,最先接觸的第三方庫就是 requests,該庫開源地址為:https://github.com/psf/requests,官方的 solganRequests 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 爬蟲的實戰當中,主要以 GETPOST 為主,常用的引數為:urlparamsdataheaderscookiestimeoutproxiesverify

回應物件的屬性與方法

使用 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 標簽中,只包含headbody 標簽,實際情況也確實如此,為了驗證,你可以在 回圈中繼續嵌套一層,

此時輸出的內容就變得豐富了需求,如下圖所示:

requests庫與 lxml 庫常用操作整理+總結,爬蟲120例階段整理篇
你也可以通過 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 實作資料決議外,還可以與 cssselectBeautifulSouphtml5lib 配合使用,這部分在后續的案例中,將逐步進行展開,

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

上一篇:Python基礎專案:超市商品銷售管理系統

下一篇:震驚!!!史上最強 python 智能問答系統現世

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more