Pytrchクローラーコンバットスタディノート_3ネットワークリクエストurllibモジュール:IPプロキシの設定+リクエスト例外の処理+URLの解析+デコード+エンコード+URLの結合+URL接続

1IPプロキシを設定します

1.1方法論

urllibモジュールを使用してプロキシIPを設定するのは比較的簡単です。最初に、パラメータがディクショナリタイプのプロキシIPであり、キー名がプロトコルタイプ(HTTPやHTTPSなど)であるProxyHandlerオブジェクトを作成する必要があります。 、および値はプロキシリンクです。次に、ProxyHandlerオブジェクトとbuildopener()メソッドを使用して、新しいオープナーオブジェクトを作成し、最後にネットワーク要求を送信します。

1.2コードの実装

import urllib.request  # 导入urllib.request模块
url= 'https://www.httpbin.org/get'   # 网络请求地址

# 创建代理IP
proxy_handler = urllib.request.ProxyHandler({
    'https':'58.220.95.114:10053'
})

# 创建opener对象
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url,timeout=2)        # 发送网络请求
print(response.read().decode('utf-8'))    # 打印返回内容

2リクエストの例外の処理

ネットワーク要求を実装する場合、多くの異常エラーが発生する可能性があります。ulibモジュールのurllib.errorモジュールには、URLErrorとHTTPErrorの2つの重要な例外クラスが含まれています。

2.1URLError例外の処理

URLErrorクラスのreason属性は、例外の理由をフィードバックできます

2.1.1存在しないアドレスにリクエストを送信する

import urllib.request    # 导入urllib.request模块
import urllib.error      # 导入urllib.error模块
try:
    # 向不存在的网络地址发送请求
    response = urllib.request.urlopen('http://www.52pojie.cn/4040.html')
except urllib.error.URLError as error:    # 捕获异常信息
    print(error.reason)                    # 打印异常原因
    print(error.code)                   # 打印HTTP状态码
    print(error.header)                 # 返回请求头

2.1.2二重例外キャッチ

import urllib.request    # 导入urllib.request模块
import urllib.error      # 导入urllib.error模块
try:
    # 向不存在的网络地址发送请求
    response = urllib.request.urlopen('https://www.python12.org/',timeout=0.1)
except urllib.error.HTTPError as error:    # HTTPError捕获异常信息
    print('状态码为:',error.code)                      # 打印状态码
    print('HTTPError异常信息为:',error.reason)         # 打印异常原因
    print('请求头信息如下:\n',error.headers)           # 打印请求头
except urllib.error.URLError as error:     # URLError捕获异常信息
    print('URLError异常信息为:',error.reason)
    # 输出 URLError异常信息为: [Errno 11001] getaddrinfo failed

3URLを解析します

解析サブモジュールは、主にURLの解析に使用されるurllibモジュールで提供され、URLの分割または組み合わせを実現できます。複数のプロトコルのURL処理をサポートします。

3.1 urlparse()

3.1.1 urlparse()の概要

urlparse()は、URLをさまざまな部分に分割するために使用されます

3.1.2 urlparse()関数の合成

 urllib.parse.urlparse (urlstring,scheme ='',allow_fragments=True)
  • urlstring:分割されるURL。このパラメーターは必須パラメーターです。
  • スキーム:オプションのパラメーター。設定するデフォルトのプロトコルを示します。分割するURLにプロトコルがない場合は、このパラメータでデフォルトのプロトコルを設定できます。このパラメータのデフォルト値は空の文字列です。
  • allow_fragments:オプションのパラメーター。このパラメーターがFalseに設定されている場合、フラグメントのコンテンツが無視されることを意味します。デフォルトはTnueです。

3.1.3 urlparse()を使用してURLを分解する

import urllib.parse    #导入urllib.parse模块
parse_result = urllib.parse.urlparse('https://www.baidu.com/doc/library/urllib.parse.html')
print(type(parse_result))    # 打印类型
print(parse_result)          # 打印拆分后的结果
### 也可以拆分打印
print(parse_result.scheme)          # 打印拆分后的结果
print(parse_result.netloc)          # 打印拆分后的结果
print(parse_result.path)          # 打印拆分后的结果
print(parse_result.params)          # 打印拆分后的结果
print(parse_result.query)          # 打印拆分后的结果
print(parse_result.fragment)          # 打印拆分后的结果

<class'urllib.parse.ParseResult'>
ParseResult(scheme ='https'、netloc ='www.baidu.com'、path ='/doc/library/urllib.parse.html'、params =''、query = ''、fragment ='')
https
www.baidu.com
/doc/library/urllib.parse.html

3.2 urlsplit()

3.2.1 urlsplit()の概要

urlsplit()メソッドの使用は、URL分割を実現できるurlparse()メソッドに似ていますが、urlsplit()メソッドは、コンテンツのparams部分を個別に分割するのではなく、paramsをパスにマージするため、返される結果の5。コンテンツの一部であり、データ型はSplitResultです。サンプルコードは次のとおりです。

3.2.2 urlsplit()コードの実装

import urllib.parse    #导入urllib.parse模块
# 需要拆分的URL
url = 'https://www.baidu.com/doc/library/urllib.parse.html'
print(urllib.parse.urlsplit(url))     # 使用urlsplit()方法拆分URL
# 输出: SplitResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', query='', fragment='')
print(urllib.parse.urlparse(url))     # 使用urlparse()方法拆分URL
# 输出:ParseResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', params='', query='', fragment='')

4URLの組み合わせ

4.1 urlunparse()

urlunpare()メソッドを使用してURLを組み合わせる場合、iterableパラメーターの要素は6でなければならないことに注意してください。

import urllib.parse    #导入urllib.parse模块
list_url = ['https','baidu.org','/3/library/urllib.parse.html','','','']
tuple_url = ('https','baidu.org','/3/library/urllib.parse.html','','','')
dict_url = {'scheme':'https','netloc':'docs.baidu.org','path':'/baidu/library/urllib.parse.html','params':'','query':'','fragment':''}
print('组合列表类型的URL:',urllib.parse.urlunparse(list_url))
print('组合元组类型的URL:',urllib.parse.urlunparse(tuple_url))
print('组合字典类型的URL:',urllib.parse.urlunparse(dict_url.values()))

出力:

結合リストタイプのURL:https
://baidu.org/3/library/urllib.parse.html結合タプルタイプのURL:https://baidu.org/3/library/urllib.parse.html
結合辞書タイプURL :https://docs.baidu.org/baidu/library/urllib.parse.html

4.2 urlunsplit()

import urllib.parse    #导入urllib.parse模块
list_url = ['https','docs.python.org','/3/library/urllib.parse.html','','']
tuple_url = ('https','docs.python.org','/3/library/urllib.parse.html','','')
dict_url = {'scheme':'https','netloc':'docs.python.org','path':'/3/library/urllib.parse.html','query':'','fragment':''}
print('组合列表类型的URL:',urllib.parse.urlunsplit(list_url))
print('组合元组类型的URL:',urllib.parse.urlunsplit(tuple_url))
print('组合字典类型的URL:',urllib.parse.urlunsplit(dict_url.values()))

出力:

リストタイプを組み合わせたURL:https
://docs.python.org/3/library/urllib.parse.htmlタプルタイプを組み合わせたURL:https://docs.python.org/3/library/urllib.parse.html
結合された辞書タイプのURL:https://docs.python.org/3/library/urllib.parse.html
 

5 URL接続urllib.parse.urljoin()

5.1関数プロトタイプ

urllib.parse.urljoin(base,url,allow_fragments = True)
  • base:ベースリンクを示します
  • url:新しいリンクを示します
  • allow_fragments:オプションのパラメーター。デフォルトはTrueです。

5.2 urllib.parse.urljoin()の使用例

import urllib.parse    #导入urllib.parse模块
base_url = 'https://tet.baidu.org'   # 定义基础链接
# 第二参数不完整时,合并返回
print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html'))
# 第二参数完成时,不合并直接返回第二参数的链接
print(urllib.parse.urljoin(base_url,'https://docs.tet.baidu.org/3/library/urllib.parse.html#url-parsing'))

出力:

https://tet.baidu.org/3/library/urllib.parse.html


https://docs.tet.baidu.org/3/library/urllib.parse.html#url-parsing
 

6URLのデコードとエンコード

quote()メソッドの関数はurlencode()メソッドの関数と似ていますが、urlencode()メソッドは辞書タイプのパラメーターのみを受け入れ、quote()メソッドは文字列をエンコードできます。

6.1 urlcode()メソッドを使用したリクエストパラメータのエンコード

import urllib.parse    #导入urllib.parse模块
base_url = 'http://baidu.org/get?'    # 定义基础链接
params = {'name':'Jack','country':'中国','age':30}  # 定义字典类型的请求参数
url = base_url+urllib.parse.urlencode(params)       # 连接请求地址
print('编码后的请求地址为:',url)

エンコードされたリクエストアドレスは次のとおりです。http://baidu.org/get?name = Jack&country =%E4%B8%AD%E5%9B%BD&age = 30

6.2quote()メソッドを使用して文字列引数をエンコードする

import urllib.parse    #导入urllib.parse模块
base_url = 'http://baidu.org/get?country='    # 定义基础链接
url = base_url+urllib.parse.quote('中国')        # 字符串编码
print('编码后的请求地址为:',url)

エンコードされたリクエストアドレスは次のとおりです。http://baidu.org/get?country =%E4%B8%AD%E5%9B%BD

7デコード

7.1コード1

import urllib.parse    #导入urllib.parse模块
u = urllib.parse.urlencode({'country':'中国'})  # 使用urlencode编码
q=urllib.parse.quote('country=中国')              # 使用quote编码
print('urlencode编码后结果为:',u)
print('quote编码后结果为:',q)
print('对urlencode解码:',urllib.parse.unquote(u))
print('对quote解码:',urllib.parse.unquote(q))

7.2コード2 

import urllib.parse    #导入urllib.parse模块
# 定义一个请求地址
url = 'http://httpbin.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30'
q = urllib.parse.urlsplit(url).query   # 获取需要的参数
q_dict = urllib.parse.parse_qs(q)      # 将参数转换为字典类型的数据
print('数据类型为:',type(q_dict))
print('转换后的数据:',q_dict)

7.3コード3

import urllib.parse    #导入urllib.parse模块
str_params = 'name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30'  # 字符串参数
list_params = urllib.parse.parse_qsl(str_params)   # 将字符串参数转为元组所组成的列表
print('数据类型为:',type(list_params))
print('转换后的数据:',list_params)

おすすめ

転載: blog.csdn.net/qq_39237205/article/details/123408876