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

      網友投稿 950 2025-03-31

      一路學習,一路總結,技術就是這樣,應用之后,在進行整理,才可以加深印象。

      本篇博客為小節篇,核心總結 requests 庫與 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:請求頭,字典格式;

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

      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)

      上述代碼輸出內容如下所示:

      html

      其中需要注意的是 Element 后面的 html,該字符串表示對象的標簽名為 html,如果使用下述代碼:

      print(root_element[1])

      上述內容得到的是 ,即 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 等解析表達式的寫法更加重要。

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

      HTML

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:編輯時標記修訂(書稿修改標記)
      下一篇:git message規范
      相關文章
      亚洲麻豆精品国偷自产在线91| 亚洲午夜AV无码专区在线播放| 亚洲人成色777777精品| 国产AV无码专区亚洲AV毛网站| 亚洲午夜爱爱香蕉片| 亚洲а∨天堂久久精品| 亚洲爆乳大丰满无码专区 | 亚洲AV无码成人专区| 亚洲国产精品综合久久久| 亚洲国产精品美女| 亚洲精品视频在线播放| 亚洲午夜电影一区二区三区| 亚洲婷婷在线视频| 亚洲色图古典武侠| 中文字幕亚洲精品资源网| 中文字幕亚洲精品| 亚洲av产在线精品亚洲第一站| 亚洲成av人片不卡无码| 国产成人精品亚洲日本在线| 亚洲中文精品久久久久久不卡| 亚洲欧美黑人猛交群| 国产精品自拍亚洲| 亚洲区日韩区无码区| 亚洲永久无码3D动漫一区| 亚洲精品无码不卡在线播放HE| 亚洲VA中文字幕不卡无码| 亚洲乱亚洲乱淫久久| 亚洲国产成人久久精品app| 亚洲综合久久精品无码色欲| 亚洲av无码一区二区三区人妖| 亚洲成A人片在线观看无码3D | 91亚洲国产成人久久精品| 亚洲入口无毒网址你懂的| 亚洲日本VA午夜在线影院| 国产精品亚洲lv粉色| 亚洲日本一区二区三区在线不卡| 亚洲日韩精品一区二区三区无码| 久久久综合亚洲色一区二区三区 | 亚洲av网址在线观看| 91精品国产亚洲爽啪在线影院| 亚洲一卡2卡4卡5卡6卡在线99|