1. 基本モジュール
urllib ライブラリは、Python の組み込み HTTP リクエスト ライブラリです。追加のインストールは必要なく、直接使用できます。 urllib ライブラリには、次の 4 つのモジュールが含まれています。
- request: 最も基本的な HTTP リクエスト モジュール。リクエストの送信をシミュレートできます。 URL と対応するパラメーターをライブラリ メソッドに渡すだけで、ブラウザーをシミュレートしてリクエストを送信できます。
- エラー: 例外処理モジュール。リクエスト例外が発生した場合は、これらの例外をキャプチャして再試行するか、他の操作を実行して、プログラムが予期せず終了しないようにします。
- parse: ツール モジュール。分割、解析、結合など、多くの URL 処理方法を提供します。
- robotparser: 主に Web サイトの robot.txt ファイルを識別し、どの Web サイトがクロール可能でどの Web サイトがクロールできないかを判断するために使用されます。一般的にはあまり使用されません。
2. リクエストを送る(リクエスト)
休日
request は、HTTP リクエストを構築する最も基本的なメソッドを提供します。urlopen を使用して、ブラウザがリクエストを開始するプロセスをシミュレートできます。
from urllib import request
response = request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))
実行結果は以下の通りです
type メソッドを使用して応答のタイプを確認できます
from urllib import request
response = request.urlopen('https://www.python.org')
print(type(response))
出力は次のとおりです。
<クラス「http.client.HTTPResponse」>
応答が HTTPResponse タイプのオブジェクトであることがわかります。
HTTPResponse には主に、read、readinto、getheader、getheaders、fileno などのメソッドと、msg、version、status、reason、debuglevel、closed などの属性が含まれます。
from urllib import request
response = request.urlopen('https://www.python.org')
print(response.status)#status属性,输出响应状态码
print(response.getheaders())#调用getheaders方法,输出响应头信息
出力結果:
200
[('Connection', 'close'), ('Content-Length', '49948') , ('サーバー', 'nginx'), ('Content-Type', 'text/html; charset=utf-8'), ('X-Frame-Options', 'SAMEORIGIN'), ('Via', '1.1 vegur, 1.1 varnish, 1.1 varnish'), ('Accept-Ranges', 'bytes'), ('Date', '火曜日, 27 Jun 2023 13:08:24 GMT'), ('Age', ' 3329')、('X-Served-By'、'cache-iad-kiad7000025-IAD、cache-nrt-rjtf7700041-NRT')、('X-キャッシュ'、'HIT、HIT')、('X-キャッシュ ヒット', '57, 1722'), ('X-Timer', 'S1687871304.488935,VS0,VE0'), ('Vary', 'Cookie'), ('Strict-Transport-Security', ' max-age=63072000; includeSubDomains; preload')]
urlopen メソッドに他のパラメータを渡すこともできます。urlopen メソッドの API は次のとおりです。
request.urlopen( url , data=None , [timeout]* , cafile=None , capath=None , cadefault=False , context=None)
- データパラメータ
data パラメーターを使用する場合は、bytes メソッドを使用してパラメーターをバイト ストリーム エンコード形式 (つまり、bytes タイプ) のコンテンツに変換する必要があります。このパラメータが渡されると、リクエストメソッドが GET から POST に変更されます。ここではいくつかの例を示します。
from urllib import request, parse
data = bytes(parse.urlencode({
'name': 'python'}), encoding='utf-8')
#使用bytes方法将参数转化为字节流编码格式的内容(即bytes类型)
#传入第一个参数name,值为python,用urlencode方法将字典参数转换为符合URL规范的查询字符串
#第二个参数encoding用于指定编码格式
response = request.urlopen('https://www.httpbin.org/post', data=data)
print(response.read().decode('utf-8'))
今回のリクエスト サイトは、HTTP リクエストのテストを提供できる www.httpbin.org です。 /post をその後に追加すると、投稿リクエストをテストするために使用できます。出力情報には、渡したデータ パラメーターが含まれます。
実行結果は次のとおりです。
- タイムアウトパラメータ
timeout パラメータは、タイムアウトを秒単位で設定するために使用されます。リクエストが設定時間を超えても応答が受信されない場合、例外がスローされます。パラメータが指定されていない場合は、グローバルなデフォルト時間が使用されます。タイムアウトを使用すると、Web ページが長時間応答しない場合に、Web ページのクロールをスキップできます。
from urllib import request
response = request.urlopen('https://www.httpbin.org', timeout=0.1)
#0.1秒几乎不可能得到服务器的响应
print(response.read())
タイムアウトによる実行エラー:
- その他のパラメータ
cafile と capath は、それぞれ CA 証明書とそのパスを指定するために使用されます。 cadefault は現在非推奨であり、そのデフォルト値は False です。 context パラメーターは、SSL 設定の指定に使用される ssl.SSLContext タイプである必要があります。
リクエスト
Request を通じて Request タイプのオブジェクトを作成し、そのオブジェクトをパラメータとして urlopen メソッドに渡すことで、urlopen メソッドのパラメータを柔軟に設定できます。 Requestクラスの構築方法は以下のとおりです。
class request.Request(url , data = None , headers = { } ,origin_req_host = None , unverifiable = False , Method = None)
-
url
リクエストに使用される URL は必須パラメータであり、その他はオプションのパラメータです。 -
data
はバイト型に変換する必要があります。データが辞書の場合、urllib.parse モジュールの urlencode メソッドを使用して、辞書パラメータを URL 仕様に準拠するクエリ文字列に変換できます。 -
ヘッダー
リクエスト ヘッダー。辞書です。リクエスト ヘッダーを構築するときは、headers パラメーターを使用して直接構築することも、リクエスト インスタンスの add_headers メソッドを呼び出して追加することもできます。リクエスト ヘッダーを追加する最も一般的な方法は、User_Agent を変更してブラウザを偽装することです。デフォルトの User_Agent は Python-urllib です。たとえば、Google Chrome に偽装したい場合は、User_Agent を次のように設定できます。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Gecko などの KHTML) Chrome /114.0 .0.0 Safari/537.36
開発者ツールの [ネットワーク] パネルの [ヘッダー] オプションからブラウザの User_Agent を表示できます。
-
origin_req_host
リクエスターのホスト名または IP アドレス。 -
unverifiable
は、ユーザーがこのリクエストの結果を受信するための十分な権限を持っているかどうかを示すために使用されます。デフォルト値は False です。 -
method
は、GET、POST など、リクエストに使用されるメソッドを示します。
次に、特定のパラメーターを使用して Request クラスを構築します。
from urllib import request, parse
url = 'https://www.httpbin.org/post'
data = bytes(parse.urlencode({
'name': 'python'}), encoding='utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 '
'Safari/537.36'
}
method = 'POST'
req = request.Request(url=url, data=data, headers=headers, method=method)
response = request.urlopen(req)
print(response.read().decode('utf-8'))
実行結果は次のとおりです。
3. 例外処理(エラー)
リクエストを送信すると例外が発生する場合があり、これを処理しないとエラーでプログラムが停止してしまう可能性があります。 urllib ライブラリのエラー モジュールは、リクエスト モジュールによって生成される例外を定義します。問題が発生すると、リクエスト モジュールはエラー モジュールで定義された例外をスローします。
URLエラー
リクエストモジュールによって生成された例外は、このクラスをキャッチすることで処理できます。その属性reasonを使用して、エラーの理由を返すことができます。ここではいくつかの例を示します。
from urllib import request, error
try:
res = request.urlopen('https://xiaohui.com/403')
except error.URLError as e:
print(e.reason)
実行結果は次のとおりです:
見つかりません
HTTPエラー
HTTPError は URLError のサブクラスであり、認証要求の失敗などの HTTP エラー要求を要求するために特に使用されます。次の 3 つのプロパティがあります。
- code: HTTP ステータス コードを返します。
- reason:返回错误原因。
- headers: リクエスト ヘッダーを返します。
ここではいくつかの例を示します。
from urllib import request, error
try:
res = request.urlopen('https://helloword.com/404')
except error.HTTPError as e:
print(e.code, e.reason, e.headers, sep='\n')
実行結果は次のとおりです。
4. リンクを解析する(解析)
URL解析
この方法により、URLの識別とセグメンテーションが実現できます。例は次のとおりです。
from urllib.parse import urlparse
res = urlparse('https://editor.csdn.net/md?articleId=131423019')
print(type(res))
print(res)
実行結果は次のとおりです。
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc=' editor.csdn.net'、path='/md'、params=''、query='articleId=131423019'、fragment='')
実行結果から、解析結果は、Scheme、netloc、path、params、query、fragment の 6 つの部分を含む ParseResult 型のオブジェクトであることがわかります。
返された ParseResult は実際にはタプルであり、その内容はプロパティ名またはインデックス順序を使用して取得できます。例は次のとおりです。
from urllib.parse import urlparse
res = urlparse('https://editor.csdn.net/md?articleId=131423019')
print(res.scheme, res[0], res.netloc, res[-1], sep='\n')
运行结果如下:
https
https
editor.csdn.net
urlunparse
これは、URL を構築するために使用される urlparse の逆の方法として理解できます。このメソッドで受け取るパラメータの長さは 6 でなければなりません。それ以外の場合はエラーが報告されます。例は次のとおりです。
from urllib.parse import urlunparse
data = ['https', 'www.baidu.com', 'index.html', 'user', 'id=8', 'comment ']
print(urlunparse(data))
実行結果は次のとおりです。
https://www.baidu.com/index.html;user?id=8#comment
URL分割
このメソッドは urlparse に似ていますが、urlsplit メソッドは params 部分を個別に解析せず、この部分をパスにマージするため、5 つの結果のみが返される点が異なります。例は次のとおりです。
from urllib.parse import urlsplit
res = urlsplit('https://www.baidu.com/index.html;user?id=8#comment')
print(type(res))
print(res)
実行結果は次のとおりです。
<class 'urllib.parse.SplitResult'>
SplitResult(scheme='https', netloc=' www.baidu.com'、path='/index.html;user'、query='id=8'、fragment='comment')
分割されていない
同様に、このメソッドは urrunparse に似ていますが、唯一の違いは、このメソッドのパラメータの長さが 5 であることです。
URL参加
urljoin は、ベース URL と相対 URL を結合して完全な URL を生成するために使用されます。
具体的な使用方法は次のとおりです。
- 絶対 URL に結合: 受信した相対 URL が絶対 URL (たとえば、「http」または「https」で始まる) の場合、urljoin() 関数は直接戻り値を返します。相対 URL。ベース URL と連結する代わりの URL。例は次のとおりです。
from urllib.parse import urljoin
base_url = 'https://baidu.com'
relative_url = 'https://www.python.org'
print(urljoin(base_url, relative_url))
実行結果: https://www.python.org
- 相対パスを解決する: 受信した相対 URL が相対パス (絶対 URL ではない) の場合、urljoin() 関数はそれをベース URL と結合して完全な URL を生成します。 URL。
from urllib.parse import urljoin
base_url = 'https://baidu.com'
relative_url = '/about.html'
print(urljoin(base_url, relative_url))
実行結果: https://baidu.com/about.html
- パス記号の解決: urljoin() 関数は、相対 URL 内のパス記号 (「...」や「.」など) を解析し、次の情報に基づいて適切な分析を実行します。ベース URL のパス。これにより、生成された完全な URL が正しいことが保証されます。
from urllib.parse import urljoin
base_url = 'https://baidu.com/default/html/'
relative_url_1 = '../about.html'#返回上一级目录
relative_url_2 = './about.html'#当前目录
print(urljoin(base_url, relative_url_1))
print(urljoin(base_url, relative_url_2))
运行结果:
https://baidu.com/default/about.html
https://baidu.com/default/html/about.html
- クエリ パラメータの結合: ベース URL と相対 URL の両方にクエリ パラメータが含まれている場合、urljoin() 関数は相対 URL のクエリ パラメータをベースのクエリ パラメータと結合します。 URL クエリパラメータの結合。クエリ パラメータ名が重複している場合、相対 URL のクエリ パラメータがベース URL のクエリ パラメータをオーバーライドします。
from urllib.parse import urljoin
base_url_1 = 'https://baidu.com/default/html/'
relative_url_1 = '?id=8'
base_url_2='https://baidu.com/default/html/?catagorg=2'
relative_url_2 = '?id=6'
print(urljoin(base_url_1, relative_url_1))
print(urljoin(base_url_2, relative_url_2))
运行结果:
https://baidu.com/default/html/?id=8
https://baidu.com/default/html/?id=6
これらの機能により、urljoin() 関数は URL スプライシングを処理する際に非常に便利で信頼性の高いものになります。さまざまな種類の URL を正しく処理し、生成される完全な URL が期待どおりであることを保証します。
URLコード
urlencode メソッドは、params シーケンスを GET リクエストのパラメーターに変換できます。例は次のとおりです。
from urllib.parse import urlencode
params = {
'name': 'xiaohui',
'age': 19
}
base_url = 'https://www.vonphy.love?'
url = base_url + urlencode(params)
print(url)
実行結果: https://www.vonphy.love?name=xiaohui&age=19
parse_qs
parse_qs メソッドは urlencode メソッドの逆で、GET リクエスト パラメータを辞書に変換するために使用されます。例は次のとおりです。
from urllib.parse import parse_qs
query = 'name=xiaohui&age=19'
print(parse_qs(query))
実行結果: {'name': ['xiaohui'], 'age': ['19']}
parse_qsl
parse_qsl はパラメータをタプルのリストに変換するために使用されます。例は次のとおりです。
from urllib.parse import parse_qsl
query = 'name=xiaohui&age=19'
print(parse_qsl(query))
実行結果: [('name', 'xiaohui'), ('age', '19')]
引用
このメソッドは、コンテンツを URL エンコード形式に変換します。 URLに中国語のパラメータが含まれている場合、文字化けが発生する可能性があります。この問題を回避するには、quote メソッドを使用して中国語の文字を URL エンコードに変換します。例は次のとおりです。
from urllib.parse import quote
keyword = '你好'
url = 'https://www.baidu.com' + quote(keyword)
print(url)
実行結果: https://www.baidu.com%E4%BD%A0%E5%A5%BD
引用を解除する
quote メソッドとは対照的に、このメソッドは URL デコードに使用されます。例は次のとおりです。
from urllib.parse import unquote
url = 'https://www.baidu.com?wd=%E4%BD%A0%E5%A5%BD'
print(unquote(url))
実行結果: https://www.baidu.com?wd=Hello