ホームページ  >  記事  >  バックエンド開発  >  Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

coldplay.xixi
coldplay.xixi転載
2021-03-21 15:15:584657ブラウズ

Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

#記事ディレクトリ

    urllib
  • リクエストモジュール
    • アクセス URL
    • リクエスト クラス
    • その他のクラス
  • 解析モジュール
    • 解析 URL
    • エスケープ URL
  • robots.txt ファイル

(無料学習の推奨事項: Python ビデオ チュートリアル

urllib


##urllib

は、Python で URL を処理するために使用されます。ツールキット、ソースコードは /Lib/ の下にあります。これには、URL を開いて読み書きするために使用される request モジュール、request モジュールによって引き起こされる例外を引き起こす error モジュール、および ## URL の解析に使用される #error モジュール。parse モジュール、応答処理用の response モジュール、および robots.txt ファイルの分析用の robotparser モジュール。

バージョンの違いに注意してください。

urllib には 3 つのバージョンがあります: Python2.X には urlliburllib2 モジュール、Python3 が含まれます。## と urlparse は ## に合成されます。 #urllib パッケージ、urllib3 は新しいサードパーティ ツール パッケージです。 「urllib2 という名前のモジュールがありません」などの問題が発生した場合、ほとんどの場合、Python のバージョンの違いが原因です。 urllib3 は、HTTP クライアント向けの強力な機能と明確な規制を備えた Python ライブラリです。圧縮エンコーディング、接続プーリング、スレッド セーフ、SSL/TLS 認証、HTTP および SCOCKS プロキシなど、Python 標準ライブラリにはない多くの機能が提供されます。 pip 経由でインストールできます: pip install urllib3

GitHub 経由で最新のコードをダウンロードすることもできます:

git clone git://github.com/shazow/urllib3.git
python setup.py install
urllib3
リファレンスドキュメント: https://urllib3.readthedocs.io/en/latest/Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明
request module

##urllib.request

モジュールは認証を定義します、リダイレクト、Cookie、および URL 関数とクラスを開くためのその他のアプリケーション。

request
パッケージを簡単に紹介します。このパッケージは、高度な非基盤 HTTP クライアント インターフェイスに使用され、

request モジュールよりも強力なフォールト トレランスを備えています。 request

は、urllib2 の機能を継承する urllib3 を使用します。これは、HTTP 接続の維持と接続プーリングをサポートし、セッション、ファイルのアップロード、自動解凍、Unicode 応答、HTTP(S) プロキシなどを維持するための Cookie の使用をサポートします。 。詳細については、ドキュメント http://requests.readthedocs.io を参照してください。

以下では、urllib.request モジュールの共通関数とクラスを紹介します。 アクセス URL

1.

urlopen()

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=false,context=None)
この関数は、URL データをキャプチャするために使用されます。とても重要です。上記のパラメータでは、URL パラメータ (文字列または

Request
オブジェクト) を除き、残りのパラメータにはデフォルト値があります。

①URL パラメータ

from urllib import requestwith request.urlopen("http://www.baidu.com") as f:
    print(f.status)
    print(f.getheaders())#运行结果如下200[('Bdpagetype', '1'), ('Bdqid', '0x8583c98f0000787e'), ('Cache-Control', 'private'), ('Content-Type', 'text/html;charset=utf-8'), ('Date', 'Fri, 19 Mar 2021 08:26:03 GMT'), ('Expires', 'Fri, 19 Mar 2021 08:25:27 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BAIDUID=B050D0981EE3A706D726852655C9FA21:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BIDUPSID=B050D0981EE3A706D726852655C9FA21; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1616142363; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BAIDUID=B050D0981EE3A706FA20DF440C89F27F:FG=1; max-age=31536000; expires=Sat, 19-Mar-22 08:26:03 GMT; domain=.baidu.com; path=/; version=1; comment=bd'), ('Set-Cookie', 'BDSVRTM=0; path=/'), ('Set-Cookie', 'BD_HOME=1; path=/'), ('Set-Cookie', 'H_PS_PSSID=33272_33710_33690_33594_33600_33624_33714_33265; path=/; domain=.baidu.com'), ('Traceid', '161614236308368819309620754845011048574'), ('Vary', 'Accept-Encoding'), ('Vary', 'Accept-Encoding'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close'), ('Transfer-Encoding', 'chunked')]
②データ パラメータ

データがサーバーに送信される場合、データ パラメータはデータを含む byes オブジェクトである必要があります。それ以外の場合は None です。 Python 3.2 以降では、反復可能なオブジェクトにすることができます。その場合、Content-Length パラメータを

headers

に含める必要があります。 HTTP リクエストで

POST

メソッドを使用する場合、データにはデータが必要です。
GET メソッドを使用する場合、データは None として書き込むことができます。

from urllib import parsefrom urllib import request
data = bytes(parse.urlencode({"pro":"value"}),encoding="utf8")response = request.urlopen("http://httpbin.org/post",data=data)print(response.read())#运行结果如下b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "pro": "value"\n  }, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "9", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.9", \n    "X-Amzn-Trace-Id": "Root=1-60545f5e-7428b29435ce744004d98afa"\n  }, \n  "json": null, \n  "origin": "112.48.80.243", \n  "url": "http://httpbin.org/post"\n}\n'
データの POST リクエストを行うには、bytes タイプまたは iterable タイプをトランスコードする必要があります。ここでは、バイト変換は

bytes() によって実行されます。最初のパラメータが文字列であることを考慮すると、解析モジュールの urlencode() メソッドを使用する必要があります (後述)。データは文字列に変換され、エンコード形式は utf8 として指定されます。テスト Web サイト httpbin.org では HTTP テストを提供できます。返されたコンテンツから、送信ではフォームが属性として、辞書が属性値として使用されていることがわかります。 ③timeout パラメータ このパラメータはオプションです。タイムアウトを秒単位で指定します。この時間を超えると、すべての操作がブロックされます。指定しない場合、デフォルトは sock になります。対応する値は.GLOBAL_DEFAULT_TIMEOUT まで。このパラメータは、http、https、および ftp 接続でのみ有効です。 タイムアウト後、urllib.error.URLError: 例外がスローされます。この例外を処理するには、try...Except を使用できます。

from urllib import request
response = request.urlopen("http://httpbin.org/get",timeout=1)print(response.read())#运行结果如下b'{\n  "args": {}, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.9", \n    "X-Amzn-Trace-Id": "Root=1-605469dd-76a6d963171127c213d9a9ab"\n  }, \n  "origin": "112.48.80.243", \n  "url": "http://httpbin.org/get"\n}\n'

④オブジェクトの共通メソッドとプロパティを返します
最初の 3 つの urlopen()共通パラメータに加えて、この関数はコンテキスト マネージャー (コンテキスト) として使用されるクラス ファイルを返します。

geturl(): 要求された URL を返します。通常、リダイレクトされた URL は引き続き取得できます。


info(): httplib を返します。 HTTPMessage オブジェクト。リモート サーバーから返されたヘッダー情報を示します。 getcode(): 応答の後に HTTP ステータス コードを返します。

    status 属性: 応答の後に HTTP ステータス コードを返します。
  • msg属性:リクエスト結果
from urllib import request
response = request.urlopen("http://httpbin.org/get")print(response.geturl())print("===========")print(response.info())print("===========")print(response.getcode())print("===========")print(response.status)print("===========")print(response.msg)
  • 実行結果:
  • 添付ファイル:ステータスに対応するステータスコード
    • 1xx(informational):请求已经收到,正在进行中。
    • 2xx(successful):请求成功接收,解析,完成。
    • 3xx(Redirection):需要重定向。
    • 4xx(Client Error):客户端问题,请求存在语法错误,网址未找到。
    • 5xx(Server Error):服务器问题。

    二、build_opener()

    urllib.request.build_opener([handler1 [handler2, ...]])

    该函数不支持验证、cookie及其他HTTP高级功能。要支持这些功能必须使用build_opener()函数自定义OpenerDirector对象,称之为Opener。

    build_opener()函数返回的是OpenerDirector实例,而且是按给定的顺序链接处理程序的。作为OpenerDirector实例,可以从OpenerDirector类的定义看出他具有addheaders、handlers、handle_open、add_handler()、open()、close()等属性或方法。open()方法与urlopen()函数的功能相同。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明
    上述代码通过修改http报头进行HTTP高级功能操作,然后利用返回对象open()进行请求,返回结果与urlopen()一样,只是内存位置不同而已。

    实际上urllib.request.urlopen()方法只是一个Opener,如果安装启动器没有使用urlopen启动,调用的就是OpenerDirector.open()方法。那么如何设置默认全局启动器呢?就涉及下面的install_opener函数。

    三、install_opener()

    urllib.request.install_opener(opener)

    安装OpenerDirector实例作为默认全局启动器。
    首先导入request模块,实例化一个HTTPBasicAuthHandler对象,然后通过利用add_password()添加用户名和密码来创建一个认证处理器,利用urllib.request.build_opener()方法来调用该处理器以构建Opener,并使其作为默认全局启动器,这样Opener在发生请求时具备了认证功能。通过Opener的open()方法打开链接完成认证。

    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明
    当然了,CSDN不需要账号密码也可以访问,读者还可以在其他网站上用自己的账号进行测试。

    除了上述方法外,还有将路径转换为URL的pathname2url(path)、将URL转换为路径的url2pathname(path),以及返回方案至代理服务器URL映射字典的getproxies()等方法。

    Request类


    前面介绍的urlopen()方法可以满足一般基本URL请求,如果需要添加headers信息,就要考虑更为强大的Request类了。Request类是URL请求的抽象,包含了许多参数,并定义了一系列属性和方法。

    一、定义

    class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
    • 参数url是有效网址的字符串,同urlopen()方法中一样,data参数也是。
    • headers是一个字典,可以通过add_header()以键值进行调用。通常用于爬虫爬取数据时或者Web请求时更改User-Agent标头值参数来进行请求。
    • origin_req_host是原始请求主机,比如请求的是针对HTML文档中的图像的,则该请求主机是包含图像页面所在的主机。
    • Unverifiable指示请求是否是无法验证的。
    • method指示使用的是HTTP请求方法。常用的有GET、POST、PUT、DELETE等,

    代码示例:

    from urllib import requestfrom urllib import parse
    data = parse.urlencode({"name":"baidu"}).encode('utf-8')headers = {'User-Agent':'wzlodq'}req = request.Request(url="http://httpbin.org/post",data=data,headers=headers,method="POST")response = request.urlopen(req)print(response.read())#运行结果如下b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "name": "baidu"\n  }, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "10", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "httpbin.org", \n    "User-Agent": "wzlodq", \n    "X-Amzn-Trace-Id": "Root=1-605491a4-1fcf3df01a8b3c3e22b5edce"\n  }, \n  "json": null, \n  "origin": "112.48.80.34", \n  "url": "http://httpbin.org/post"\n}\n'

    注意data参数和前面一样需是字节流类型的,不同的是调用Request类进行请求。

    二、属性方法

    ①Request.full_url
    full_url属性包含setter、getter和deleter。如果原始请求URL片段存在,那么得到的full_url将返回原始请求的URL片段,通过添加修饰器@property将原始URL传递给构造函数。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    ②Request.type:获取请求对象的协议类型。
    ③Request.host:获取URL主机,可能含有端口的主机。
    ④Request.origin_req_host:发出请求的原始主机,没有端口。
    ⑤Request.get_method():返回显示HTTP请求方法的字符串。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

    ⑥Request.add_header(key,val):向请求中添加标头。

    from urllib import requestfrom urllib import parse
    data = bytes(parse.urlencode({'name':'baidu'}),encoding='utf-8')req = request.Request('http://httpbin.org/post',data,method='POST')req.add_header('User-agent','test')response = request.urlopen(req)print(response.read().decode('utf-8'))

    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明
    上述代码中,通过add_header()传入了User-Agent,在爬虫过程中,常常通过循环调用该方法来添加不同的User-Agent进行请求,避免服务器针对某一User-Agent的禁用。

    其他类


    BaseHandler为所有注册处理程序的基类,并且只处理注册的简单机制,从定义上看,BaseHandler提供了一个添加基类的add_parent()方法,后面介绍的类都是继承该类操作的。

    • HTTPErrorProcessor:用于HTTP错误响应过程。
    • HTTPDefaultErrorHandler:用于处理HTTP响应错误。
    • ProxyHandler:用于设置代理。
    • HTTPRedirectHandler:用于设置重定向。
    • HTTPCookieProcessor:用于处理cookie。
    • HEEPBasicAuthHandler:用于管理认证。

    parse模块


    parse模块用于分解URL字符串为各个组成部分,包括寻址方案、网络位置、路径等,也可将这些部分组成URL字符串,同时可以对“相对URL"进行转换等。

    解析URL


    一、urllib.parse.urlparse(urlstring,scheme=’’,allow_fragments=True)
    解析URL为6个部分,即返回一个6元组(tuple子类的实例),tuple类具有下标所示的属性:

    属性 说明 对应下标指数 不存在时的取值
    scheme URL方案说明符 0 scheme参数
    netloc 网络位置部分 1 空字符串
    path 分层路径 2 空字符串
    params 最后路径元素的参数 3 空字符串
    query 查询组件 4 空字符串
    fragment 片段标识符 5 空字符串
    username 用户名
    None
    password 密码
    None
    hostname 主机名
    None
    port 端口号
    None

    最后组成的URL结构为scheme://netloc/path;parameters?query#fragment
    举个栗子:

    from urllib.parse import *res = urlparse('https://wzlodq.blog.csdn.net/article/details/113597816')print(res)print(res.scheme)print(res.netloc)print(res.path)print(res.params)print(res.query)print(res.username)print(res.password)print(res.hostname)print(res.port)print(res.geturl())print(tuple(res))print(res[0])print(res[1])print(res[2])

    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明
    需要注意的是urlparse有时并不能很好地识别netloc,它会假定相对URL以路径分量开始,将其取值放在path中。

    二、urllib.parse.urlunparse(parts)
    urlparse()的逆操作,即将urlparse()返回的原则构建一个URL。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    三、urllib.parse.urlsplit(urlstring,scheme=’’.allow_fragments=True)
    类似urlparse(),但不会分离参数,即返回的元组对象没有params元素,是一个五元组,对应下标指数也发生了改变。

    from urllib.parse import *sp = urlsplit('https://wzlodq.blog.csdn.net/article/details/113597816')print(sp)#运行结果如下SplitResult(scheme='https', netloc='wzlodq.blog.csdn.net', path='/article/details/113597816', query='', fragment='')

    四、urllib.parse.urlunsplit(parts)
    类似urlunparse(),是urlsplit()的逆操作,不再赘述。

    五、urllib.parse.urljoin(base,url,allow_fragments=True)
    该函数主要组合基本网址(base)与另一个网址(url)以构建新的完整网址。
    相对路径和绝对路径的url组合是不同的,而且相对路径是以最后部分路径进行替换处理的:
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    六、urllib.parse.urldefrag(url)
    根据url进行分割,如果url包含片段标识符,就返回url对应片段标识符前的网址,fragment取片段标识符后的值。如果url没有片段标识符,那么fragment为空字符串。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    转义URL


    URL转义可以避免某些字符引起歧义,通过引用特殊字符并适当编排非ASCII文本使其作为URL组件安全使用。同时也支持反转这些操作,以便从URL组件内容重新创建原始数据。

    一、urllib.parse.quote(string,safe=’/’,encoding=None,errors=None)
    使用%xx转义替换string中的特殊字符,其中字母、数字和字符’_.-‘不会进行转义。默认情况下,此函数用于转义URL的路径部分,可选的safe参数指定不应转义的其他ASCII字符——其默认值为’/’。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明
    特别注意的是若string是bytes,encoding和errors就无法指定,否则报错TypeError。

    二、urllib.parse.unquote(string,encoding=‘utf-8’,errors=‘replace’)
    该函数时quote()的逆操作,即将%xx转义为等效的单字符。参数encoding和errors用来指定%xx编码序列解码为Unicode字符,同bytes.decode()方法。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    三、urllib.parse.quote_plus(string,safe=’’,encoding=None,errors=None)
    该函数时quote()的增强版,与之不同的是用+替换空格,而且如果原始URL有字符,那么+将被转义。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    四、urllib.parse.unquote_plus(string,encoding=‘utf-8’,errors=‘replace’)
    类似unquote(),不再赘述。

    五、urllib.parse.urlencode(query,doseq=False,safe=’’,encoding=None,errors=None,quote_via=quote_plus)
    该函数前面提到过,通常在使用HTTP进行POST请求传递的数据进行编码时使用。
    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    robots.txt文件


    robotparser模块很简单,仅定义了3个类(RobotFileParserRuleLineEntry)。从__all__属性来看也就RobotFileParser一个类(用于处理有关特定用户代理是否可以发布robots.txt文件的网站上提前网址内容)。

    robots文件类似一个协议文件,搜索引擎访问网站时查看的第一个文件,会告诉爬虫或者蜘蛛程序在服务器上可以查看什么文件。

    RobotFileParser类有一个url参数,常用以下方法:

    • set_url(): robots.txt ファイルを指す URL を設定するために使用されます。
    • read(): robots.txt URL を読み取り、パーサーに提供します。
    • parse(): robots.txt ファイルを解析するために使用されます。
    • can_fetch(): URL を拡張できるかどうかを判断するために使用されます。
    • mtime(): robots.txt ファイルが最後にクロールされた時刻を返します。
    • modified(): robots.txt ファイルが最後にクロールされた時刻を現在時刻に設定します。

    Pythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明

    無料の学習に関する推奨事項が多数あります。Python チュートリアル をご覧ください。 #(ビデオ)#########

  • 以上がPythonのurllibクローラ、リクエストモジュール、解析モジュールの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。