Pythonは、ネットワークリソースを取得するための知識を強化しましたUrllib(1)

Urllibライブラリ

まず、Pythonの組み込みHTTPリクエストライブラリであるUrllibライブラリについて理解しましょう。これは、追加のインストールなしで使用できることを意味します。これには、次の4つのモジュールが含まれています。

  • 最初のモジュールであるrequestは、最も基本的なHTTPリクエストモジュールです。ブラウザにURLを入力してEnterキーを押すのと同じように、リクエストの送信をシミュレートするために使用できます。URLをライブラリメソッドに渡すだけです。追加のパラメーターを使用すると、このプロセスをシミュレートできます。
  • 2番目のエラーモジュールは例外処理モジュールです。要求エラーが発生した場合、これらの例外をキャッチし、プログラムが予期せず終了しないように、再試行またはその他の操作を行うことができます。
  • 3番目の解析モジュールは、分割、解析、マージなど、多くのURL処理方法を提供するツールモジュールです。
  • 4番目のモジュールはrobotparserで、主にWebサイトのrobots.txtファイルを識別し、クロールできるWebサイトとクロールできないWebサイトを判別するために使用されます。実用性は低くなります。
    ここでは、最初の3つのモジュールの説明に焦点を当てます。

1.リクエストテンプレート

urllibのリクエストモジュールは、URLコンテンツを簡単に取得できます。つまり、指定されたページにGETリクエストを送信し、HTTPレスポンスを返します。

たとえば、DoubanのURL https://api.douban.com/v2/book/2129650を取得して、応答を返します。

(1)指定されたページに従ってGET:データを返す

# data是入参
# timeout是超时时间
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None)
from urllib import request

with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', data.decode('utf-8'))

2)GETリクエストを送信するブラウザをシミュレートするには、Requestオブジェクトを使用する必要があります。RequestオブジェクトにHTTPヘッダーを追加することで、リクエストをブラウザに偽装できます。

herders = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,like GeCKO) Chrome/45.0.2454.85 Safari/537.36 115Broswer/6.0.3',
    'Referer': baseUrl,
    'Connection': 'keep-alive'}
req = request.Request(baseUrl, headers=herders)
r = request.urlopen(req)
print(r.read().decode('utf-8'))

(3)Post、POSTでリクエストを送信する場合は、パラメータデータをバイト単位で渡すだけです。

from urllib import request, parse

baseUrl = 'http://movie.douban.com/top250?start=0'
# data = bytes(parse.urlencode({"": ""}), encoding="utf-8")
login_data = parse.urlencode([
    ('username', "email"),
    ('password', "passwd"),
], encoding="utf-8")
req = request.Request(baseUrl)
response = request.urlopen(req, data = login_data )
print(response.data().decode("utf-8"))

2.エラーモジュール

  • (1)error.URLError:urlopenエラー
  • (2)error.HTTPError:HTTPエラー
  • (3)error.ContentTooShortError:ダウンロードサイズがcontent-lengthと一致しない場合に発生する例外
  • (4)error._ all _:3種類すべてのエラーがキャプチャされます
try:
    response = request.urlopen(req, data=data,timeout=0.01)
except error.URLError as e:
    print(e)

リクエスト。

より良い解決策は、リクエストを使用することです。これはPythonのサードパーティライブラリであり、URLリソースの処理に特に便利です。

Anacondaがインストールされている場合、リクエストはすでに利用可能です。それ以外の場合は、コマンドラインからpip経由でインストールする必要があります。

$ pip install requests

Permission deniedのインストールに失敗した場合は、sudoを追加して再試行してください。

使用リクエスト

(1)ページにアクセスするためのGET:

>>> import requests
>>> r = requests.get('https://www.douban.com/') # 豆瓣首页
>>> r.status_code
200
>>> r.text
r.text
'<!DOCTYPE HTML>\n<html>\n<head>\n<meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和...'

パラメータ付きのURLの場合、パラメータとしてdictを渡します。

>>> r = requests.get('https://www.douban.com/search', params={
    
    'q': 'python', 'cat': '1001'})
>>> r.url # 实际请求的URL
'https://www.douban.com/search?q=python&cat=1001'
requests自动检测编码,可以使用encoding属性查看:
>>> r.encoding
'utf-8'
无论响应是文本还是二进制内容,我们都可以用content属性获得bytes对象:
>>> r.content
b'<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n...'
requests的方便之处还在于,对于特定类型的响应,例如JSON,可以直接获取:
>>> r = requests.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json')
>>> r.json()
{
    
    'query': {
    
    'count': 1, 'created': '2017-11-17T07:14:12Z', ...

HTTPヘッダーを渡す必要がある場合は、ヘッダーパラメーターとしてdictを渡します。

>>> r = requests.get('https://www.douban.com/', headers={
    
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
>>> r.text
'<!DOCTYPE html>\n<html>\n<head>\n<meta charset="UTF-8">\n <title>豆瓣(手机版)</title>...'

POSTリクエストを送信するには、get()メソッドをpost()に変更してから、データパラメータをPOSTリクエストのデータとして渡します。

>>> r = requests.post('https://accounts.douban.com/login', data={
    
    'form_email': '[email protected]', 'form_password': '123456'})
requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传入json参数:
params = {
    
    'key': 'value'}
r = requests.post(url, json=params) # 内部自动序列化为JSON

同様に、ファイルのアップロードにはより複雑なエンコード形式が必要ですが、リクエストによってファイルパラメータになります。

>>> upload_files = {
    
    'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=upload_files)

ファイルを読み取るときは、必ず「rb」またはバイナリモードを使用して読み取り、取得されるバイト長がファイルの長さになるようにしてください。

post()メソッドをput()、delete()などに置き換えることで、PUTまたはDELETEモードでリソースをリクエストできます。

応答コンテンツを簡単に取得することに加えて、要求はHTTP応答に関する他の情報を取得することも非常に簡単です。

たとえば、応答ヘッダーを取得するには、次のようにします。

>>> r.headers
{
    
    Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
>>> r.headers['Content-Type']
'text/html; charset=utf-8'

RequestsはCookieに特別な処理を加えたため、Cookieを解析せずに、指定されたCookieを簡単に取得できます。

>>> r.cookies['ts']
'example_cookie_12345'

リクエストでCookieを渡すには、dictを準備し、Cookieパラメータを渡すだけです。

>>> cs = {
    
    'token': '12345', 'status': 'working'}
>>> r = requests.get(url, cookies=cs)

最後に、タイムアウトを指定するには、タイムアウトパラメータを秒単位で渡します。

>>> r = requests.get(url, timeout=2.5) # 2.5秒后超时

おすすめ

転載: blog.csdn.net/weixin_42272869/article/details/113742838