Python - 爬蟲-網頁抓取數據-庫urllib

urllib庫是Python內置的HTTP請求庫。無需額外安裝,可以直接使用。urllib庫包含以下四個模塊。

  • urllib.request?- 打開和讀取 URL。
  • urllib.error?- 包含 urllib.request 拋出的異常。
  • urllib.parse?- 解析 URL。
  • urllib.robotparser?- 解析 robots.txt 文件。

1、request:最基本的HTTP請求模塊,可以模擬請求的發送。只需給該庫方法傳入URL以及對應的參數,就可以模擬瀏覽器發送請求了

2、error:異常處理模塊。如果出現請求異常,我們可以捕獲這些異常,然后進行重試或其他操作保證程序運行不會意外終止

3、parse:一個工具模塊。提供了許多URL的處理方法,如拆分、解析、合并等

4、robotparser:主要用來識別網站的robot.txt文件,判斷哪些網站可以爬,哪些網站不可以,一般使用較少

一、urllib.request

urllib.request 定義了一些打開 URL 的函數和類,包含授權驗證、重定向、瀏覽器 cookies等。

urllib.request 可以模擬瀏覽器的一個請求發起過程。

使用 urllib.request 的 urlopen 方法來打開一個 URL,語法格式如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:url 地址。
  • data:發送到服務器的其他數據對象,默認為 None。
  • timeout:設置訪問超時時間。
  • cafile 和 capath:cafile 為 CA 證書, capath 為 CA 證書的路徑,使用 HTTPS 需要用到。
  • cadefault:已經被棄用。
  • context:ssl.SSLContext類型,用來指定 SSL 設置。

推薦一個測試網站,用于提交各種請求:http://httpbin.org/,該網站的更多的用法自行搜索

r = urllib.request.urlopen('http://httpbin.org/get')
# 讀取response內容
text = r.read()
# http返回狀態碼和msg
print("http返回狀態碼:%s;返回msg:%s"%(r.status,r.msg)) # http返回狀態碼:200;返回msg:OK
r.close()

read() 是讀取整個網頁內容?

除了 read() 函數外,還包含以下兩個讀取網頁內容的函數:

  • readline()?- 讀取文件的一行內容

from urllib.request import urlopenmyURL = urlopen("https://www.baidu.com/")
print(myURL.readline()) #讀取一行內容
  • readlines()?- 讀取文件的全部內容,它會把讀取的內容賦值給一個列表變量。

from urllib.request import urlopenurl= urlopen("https://www.baidu.com/")
lines = url.readlines()
for line in lines:print(line) 
import urllib
import json
from urllib import robotparser'''
urllib使用
Python urllib 庫用于操作網頁 URL,并對網頁的內容進行抓取處理
'''print('--------返回狀態碼和msg---------')
r = urllib.request.urlopen('http://httpbin.org/get')
# 讀取response內容
text = r.read()
# http返回狀態碼和msg
print("http返回狀態碼:%s;返回msg:%s"%(r.status,r.msg)) # http返回狀態碼:200;返回msg:OK
r.close()print('--------error---------')
url = urllib.request.urlopen("https://www.baidu.com/")
print(url.getcode())   # 200try:url = urllib.request.urlopen("https://www.baidu.com/index11.html")
except urllib.error.HTTPError as e:if e.code == 404:print(404)   # 404print('--------load函數加載的Json內容---------')
# load函數加載json格式內容
obj = json.loads(text)
print(f"load函數加載的Json內容: {obj}") # load函數加載的Json內容: {'args': {}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6a7-273842674fbc43b01cdc3fba'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get'}print('--------headers參數---------')
# r.headers是一個HTTPMessage對象
print(r.headers)
# Date: Sat, 08 Feb 2025 02:51:19 GMT
# Content-Type: application/json
# Content-Length: 274
# Connection: close
# Server: gunicorn/19.9.0
# Access-Control-Allow-Origin: *
# Access-Control-Allow-Credentials: true
for key,value in r.headers._headers:print('header每行參數-%s:%s' %(key,value))# header每行參數-Date:Sat, 08 Feb 2025 02:51:19 GMT# header每行參數 - Content - Type: application / json# header每行參數 - Content - Length: 274# header每行參數 - Connection: close# header每行參數 - Server: gunicorn / 19.9.0# header每行參數 - Access - Control - Allow - Origin: *# header每行參數 - Access - Control - Allow - Credentials: trueprint('--------headers參數---------')
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
# 添加自定義的頭信息
req = urllib.request.Request('http://httpbin.org/user-agent')
req.add_header('User-Agent', ua)
# 接受一個urllib.request.Request對象
r = urllib.request.urlopen(req)
resp = json.loads(r.read())
# 打印httpbin網站返回信息里的user-agent
print('網站返回的user-agent:', resp["user-agent"]) # 網站返回的user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3print('--------auth驗證登錄---------')
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='httpbin auth',uri='/basic-auth/admin/admin123',user='admin',passwd='admin123')
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
r = urllib.request.urlopen('http://httpbin.org')
print(r.read().decode('utf-8'))print('--------GET參數---------')
params = urllib.parse.urlencode({'name': 'admin', 'password': 'admin123'})
url = 'http://httpbin.org/get?%s'%params
with urllib.request.urlopen(url) as r:print(json.load(r)) # {'args': {'name': 'admin', 'password': 'admin123'}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6a9-78e0111069464ef205e85476'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get?name=admin&password=admin123'}print('--------POST參數---------')
data = urllib.parse.urlencode({'name': 'admin', 'password': 'admin123'})
data = data.encode()
with urllib.request.urlopen('http://httpbin.org/post', data) as r:print(json.load(r)) # {'args': {}, 'data': '', 'files': {}, 'form': {'name': 'admin', 'password': 'admin123'}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '28', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6aa-3d49564d145ee67e2d47dd95'}, 'json': None, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/post'}print('--------代理IP請求遠程URL---------')
proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080'})
# proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
opener = urllib.request.build_opener(proxy_handler)
# r = opener.open('http://httpbin.org/ip')
# print(r.read())print('--------urlparse模塊---------')
o = urllib.parse.urlparse('http://httpbin.org/get')
print(o) # ParseResult(scheme='http', netloc='httpbin.org', path='/get', params='', query='', fragment='')print('--------robotparser模塊---------')
# 在 Python 3 中,robotparser 是一個獨立的模塊,而不是 urllib 的一個屬性
# 使用 import robotparser 來直接導入 robotparser 模塊。
# 或者使用 from urllib import robotparser 來從 urllib 包中導入 robotparser
rp = robotparser.RobotFileParser()
rp.set_url("http://httpbin.org/robots.txt")
print(rp.read())

二、urllib.error

urllib.error 模塊為 urllib.request 所引發的異常定義了異常類,基礎異常類是 URLError。

urllib.error 包含了兩個方法,URLError 和 HTTPError。

URLError 是 OSError 的一個子類,用于處理程序在遇到問題時會引發此異常(或其派生的異常),包含的屬性 reason 為引發異常的原因。

HTTPError 是 URLError 的一個子類,用于處理特殊 HTTP 錯誤例如作為認證請求的時候,包含的屬性?code?為 HTTP 的狀態碼,?reason?為引發異常的原因,headers?為導致 HTTPError 的特定 HTTP 請求的 HTTP 響應頭。

url = urllib.request.urlopen("https://www.baidu.com/")
print(url.getcode())   # 200try:url = urllib.request.urlopen("https://www.baidu.com/index11.html")
except urllib.error.HTTPError as e:if e.code == 404:print(404)   # 404

三、urllib.parse

urllib.parse 用于解析 URL,格式如下:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

urlstring 為 字符串的 url 地址,scheme 為協議類型

o = urllib.parse.urlparse('http://httpbin.org/get')
print(o) # ParseResult(scheme='http', netloc='httpbin.org', path='/get', params='', query='', fragment='')

完整內容如下:

屬性

索引

值(如果不存在)

scheme

0

URL協議

scheme?參數

netloc

1

網絡位置部分

空字符串

path

2

分層路徑

空字符串

params

3

最后路徑元素的參數

空字符串

query

4

查詢組件

空字符串

fragment

5

片段識別

空字符串

username

用戶名

None

password

密碼

None

hostname

主機名(小寫)

None

port

端口號為整數(如果存在)

None

四、urllib.robotparser

urllib.robotparser 用于解析 robots.txt 文件。

robots.txt(統一小寫)是一種存放于網站根目錄下的 robots 協議,它通常用于告訴搜索引擎對網站的抓取規則。

urllib.robotparser 提供了 RobotFileParser 類,語法如下:

class urllib.robotparser.RobotFileParser(url='')

這個類提供了一些可以讀取、解析 robots.txt 文件的方法:

  • set_url(url) - 設置 robots.txt 文件的 URL。

  • read() - 讀取 robots.txt URL 并將其輸入解析器。

  • parse(lines) - 解析行參數。

  • can_fetch(useragent, url) - 如果允許 useragent 按照被解析 robots.txt 文件中的規則來獲取 url 則返回 True。

  • mtime() -返回最近一次獲取 robots.txt 文件的時間。 這適用于需要定期檢查 robots.txt 文件更新情況的長時間運行的網頁爬蟲。

  • modified() - 將最近一次獲取 robots.txt 文件的時間設置為當前時間。

  • crawl_delay(useragent) -為指定的 useragent 從 robots.txt 返回 Crawl-delay 形參。 如果此形參不存在或不適用于指定的 useragent 或者此形參的 robots.txt 條目存在語法錯誤,則返回 None。

  • request_rate(useragent) -以 named tuple RequestRate(requests, seconds) 的形式從 robots.txt 返回 Request-rate 形參的內容。 如果此形參不存在或不適用于指定的 useragent 或者此形參的 robots.txt 條目存在語法錯誤,則返回 None。

  • site_maps() - 以 list() 的形式從 robots.txt 返回 Sitemap 形參的內容。 如果此形參不存在或者此形參的 robots.txt 條目存在語法錯誤,則返回 None

在 Python 3 中,robotparser 是一個獨立的模塊,而不是 urllib 的一個屬性;

使用 import robotparser 來直接導入 robotparser 模塊;

或者使用 from urllib import robotparser 來從 urllib 包中導入 robotparser

# 在 Python 3 中,robotparser 是一個獨立的模塊,而不是 urllib 的一個屬性
# 使用 import robotparser 來直接導入 robotparser 模塊。
# 或者使用 from urllib import robotparser 來從 urllib 包中導入 robotparser
rp = robotparser.RobotFileParser()
rp.set_url("http://httpbin.org/robots.txt")
print(rp.read())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74208.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++進階知識復習 1~15

C 進階總復習 (1~15) 目的1. 介紹下程序從編寫到可執行的整個過程2. C中的auto和decltype的區別3. 介紹下多態的實現原理4. C中的new[] 和delete[] 為什么一定要配對使用?5. C中malloc申請的內存 可以使用delete釋放嘛6. 什么情況下會出現內存…

輸電線路航空標志球:低空飛行的安全路標 / 恒峰智慧科技

在現代社會,隨著航空業的快速發展,低空飛行活動日益頻繁。為了確保飛行安全,避免飛機與高壓電線等障礙物發生碰撞,輸電線路航空標志球應運而生。這種裝置被廣泛應用于高壓輸電線路上,尤其是超高壓和跨江輸電線&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件詳解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件詳解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件詳解 在 Debian/Ubuntu 系統中,/etc/network/interfaces 是傳統網絡接口配置文件,用于定義網絡接口的靜態/動態配置。以下是逐項解…

OpenCV 圖形API(或稱G-API)(1)

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 引言 OpenCV 圖形API(或稱G-API)是一個新的OpenCV模塊,旨在使常規圖像處理更快且更便攜。通過引入一種新的基于圖的執行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路2. 代碼實現 題目鏈接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路 這一題大的思路上不難想到就是一個動態規劃的思路。我們分別…

win10之mysql server 8.0.41安裝

一 mysql server 下載 官網下載地址頁面 https://dev.mysql.com/downloads/mysql/二 免裝版使用步驟 1 解壓 下載完成后,解壓文件夾,如下所示: 2 執行安裝命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二屆藍橋杯省賽軟件類(cc++組)

第一題&#xff08;空間&#xff09; 解題思路 答案 #include <stdio.h>int main() {// 計算256MB對應的字節數&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每個32位二進制整數占4個字節&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移動語義

文章目錄 一、移動語義1、為什么需要移動語義&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何實現移動語義&#xff1f;——移動構造函數/賦值4、什么時候觸發移動&#xff1f;5、移動 vs 拷貝 一、移動語義 1、為什么需要移動語…

wsl下ubuntu安裝寶塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安裝寶塔面板的步驟如下&#xff1a; 1. 確保 WSL 環境正常 已安裝 WSL 2 并啟用 Ubuntu 發行版&#xff08;推薦 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中檢查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP網絡通信

UDP網絡通信&#xff1a; 步驟1 創建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);參數一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA節點探測是干什么用的?

想象一個大城市被劃分成幾個區&#xff08;比如東區、西區&#xff09;。每個區有自己的超市&#xff08;內存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本區的超市買東西最快&#xff0c;去其他區的超市會慢一些。 NUMA節點探測&#xff0c;就是Linux系統在…

使用 Less 實現 PC 和移動端樣式適配

&#x1f310; 使用 Less 實現 PC 和移動端樣式適配 —— 以 position 屬性為例 在前端開發中&#xff0c;我們常常會遇到這樣一個場景&#xff1a; 在 PC 頁面中需要某個元素是 position: relative;&#xff0c;但在移動端卻希望它是 position: inherit;&#xff0c;以便更靈…

企業戰略管理(設計與工程師類)-2-戰略規劃及管理過程-1-概述

戰略管理過程 參考資料&#xff1a; 戰略管理 - 清華大學- 蔡臨寧公司戰略與風險管理 - 華中科技大學 - 賀遠瓊戰略管理 - 北京理工大學 - 楊萬榮DeepSeek - 深度思考與聯網檢索 AFI框架 戰略管理最典型的就是采用傳統的AFI通用戰略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并發原理以及技術實現對比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架雖然都支持高并發&#xff0c;但它們的實現原理、底層機制和適用場景有顯著差異。以下從 高并發原理、技術實現區別、優缺點 三個方面詳細分析&#xff1a; 一、高并發實現原理 1. Hyperf (PHP Swoole) Hyperf 的高并發能力基于 Swoo…

【教程】如何利用bbbrisk一步一步實現評分卡

利用bbbrisk一步一步實現評分卡 一、什么是評分卡1.1.什么是評分卡1.2.評分卡有哪些 二、評分卡怎么弄出來的2.1.如何制作評分卡2.2.制作評分卡的流程 三、變量的分箱3.1.數據介紹3.2.變量自動分箱3.3.變量的篩選 四、構建評分卡4.1.評分卡實現代碼4.2.評分卡表4.3.閾值表與分數…

AI日報 - 2025年4月2日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL訓練可誘發模型頓悟&#xff0c;Anthropic發布Claude 3.5內部機制研究&#xff0c;簡化語言模型推理優化新方法提出。 DeepSeek-R1無需額外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 網絡穿透:如何從外部訪問 K8s Pod 地址

文章目錄 探索 Kubernetes 網絡穿透&#xff1a;如何從外部訪問 K8s Pod 地址為什么需要外部訪問 Pod 地址&#xff1f;常見的網絡穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;為開發調試提供便捷穿透 實踐建議與注意事項各方案對比表總…

深入理解 Apache Dagster:數據管道編排實戰指南

本文系統介紹了 Apache Dagster 的核心概念與實踐方法&#xff0c;涵蓋環境搭建、管道定義、運行調試及高級功能&#xff0c;幫助開發者快速掌握這一現代化數據編排工具&#xff0c;提升數據工程效率。 1. 背景與核心優勢 隨著數據驅動應用的復雜化&#xff0c;傳統工具在可維…

Minio集群部署

Minio集群部署 資源規劃 IP服務規劃配置192.168.116.138minio-116核32G磁盤10T192.168.116.139minio-216核32G磁盤10T192.168.116.140minio-316核32G磁盤10T192.168.116.141minio-416核32G磁盤10T192.168.116.128nginx代理8核16G磁盤500G 基本環境配置 下面命令minio4臺設備…

操作系統高頻(六)linux內核

操作系統高頻&#xff08;六&#xff09;linux內核 1.內核態&#xff0c;用戶態的區別??? 內核態和用戶態的區別主要在于權限和安全性。 權限&#xff1a;內核態擁有最高的權限&#xff0c;可以訪問和執行所有的系統指令和資源&#xff0c;而用戶態的權限相對較低&#x…