Python爬虫類の基礎の簡単な理解(1)


urllibの使用
urllib pythonは、4つのモジュールを含むHTTPリクエストライブラリを内蔵しています.
  • request:送信要求をシミュレートするための最も基本的な要求モジュール.
  • error:異常処理、要求エラーが発生し、異常をキャプチャでき、プログラムがクラッシュしないことを保証する.
  • parse:ツールモジュール、URLの処理方法、マージ、分割などを提供します.
  • robotparser:ロボットプロトコルを識別し、爬取の規定を判断する.

  • 送信要求urllibを使用する.requestモジュールは、ブラウザが要求を送信し、応答を取得することをシミュレートします.
    import urllib.request
    response = urllib.request.urlopen(url)
    print(response.read().decode('utf-8'))
    

    応答が得られたらread()法を用いてコンテンツを読み出し、utf-8を復号してコンテンツを得ることができる.
    得られたresponseは、read()、readinto()、getheader(name)、getheaders()、fileno()などのメソッド、msg、version、status、reason、debuglevel、closedなどのプロパティを含むHTTPResponseタイプのオブジェクトです.status:応答のステータスコードが得られます.getheaders():応答ヘッダを取得します.getheader(‘Server’):レスポンスヘッダの値を取得します....
    urlopen()urlに加えて、他のパラメータ*data:オプションパラメータを渡すこともできます.このパラメータを追加すると、要求方式はPOSTで、dataは転送するデータで、bytes()メソッドを使用して転送するパラメータをバイトストリーム符号化フォーマットの内容に変換します.
    from urllib import request, parse
    data = bytes(parse.urlencode({'word': 'hello'}), encoding='utf-8')
    response = request.urlopen(url, data=data)
    print(response.read())
    

    *timeoutタイムアウト時間を設定します.単位は秒です.要求時間を超えても応答が得られない場合は例外を放出し、パラメータを指定しない場合はグローバルデフォルト時間を使用します.
    import urllib.request
    response = urllib.request.urlopen(url, timeout=1)
    print(response.read())
    

    タイムアウト時間の設定を使用して、長時間応答していないWebサイトのキャプチャをスキップできます.
    import socket
    from urllib import request, error
     try:
     	response = request.urlopen(url, timeout=1)
     except error.URLError as e:
     	if isintance(e.reason, socket.timeout):
     		print('TIME OUT')
    

    isinstance()はtype()に類似しており、オブジェクトが既知のタイプであるかどうかを判断すると、子クラスが親クラスであると考えられる継承関係が考慮されます.
    *その他のパラメータcontext:SSLContextタイプで、SSL設定を指定する必要があります.Cafile,capathの2つのパラメータはそれぞれCA証明書とそのパスを指定し,HTTPSリンクを要求するのに役立つ.
    Request
    urlopen()は、最も基本的なリクエストを実装することができ、より多くの情報を追加する場合はRequestクラスを使用することができます.urlopen()を使用してリクエストを送信しますが、パラメータはRequestクラスのオブジェクトであり、柔軟な構成情報で独立したリクエストオブジェクトを構成できます.
    from urllib import request
    request = request.Request(url)
    response = request.urlopen(request)
    print(response.resd().decode('utf-8'))
    

    class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:リンクを要求します.必須です.
  • data:転送されたデータは、bytes形式でなければなりません.辞書であればurllibを使用できます.parse.urlecode()符号化.
  • headers:これは辞書で、リクエストヘッダで、ブラウザを偽装するためにUser-Agentを変更するのによく使われています.直接追加したり、add_を使用したりすることができます.ヘッダー()追加.
  • origin_req_host:リクエスト元のhost名またはIPアドレス.
  • unverifiable:このリクエストが検証できないかどうかを示します.デフォルトのFalseは、ユーザーがこのリクエストを受け入れる結果を選択する権限がないことを意味します.
  • method:一連の文字列、要求の方法、GET、POSTなどを指定します.
  • from urllib import request, parse
    url = 'http://httpbin.org/post'
    headers = {
    	'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    	'Host': 'httpbin.org'
    }
    dict = {
    	'name': 'Germey'
    }
    data = bytes(parse.urlencode(dict), encoding='utf-8'))
    req = request.Request(url=url, headers=headers, data=data, method='POST')
    response = resquest.urlopen(req)
    print(response.read().decode('utf-8'))
    

    req = request.Request(url=url, data=data, method=‘POST’) req.add_header(‘User-Agent’: ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)’)
    Handler各種Handlerは各種プロセッサに似ており,異なることを処理することができる.urllib.requestの中のBaseHandlerは、他のすべてのHandlerの親であり、最も基本的な方法を提供しています.公式ドキュメント:https://docs.python.org/3/library/urllib.request.html#urllib.request.BaseHandler
    OpenerDirectorは、Openerとなり、urlopen()はurllibが提供するOpenerであり、Openerはより高度な機能を実現し、一層深く配置し、より下位のインスタンスを使用して操作を完了することができる.Openerはopen()メソッドを使用でき、戻りタイプはurlopen()と同じです.
    HandlerによるOpenerの構築
    エージェントの追加
    from urllib.error import URLError
    from urllib.request import ProxyHandler, build_opener
    #  proxy_handler    
    proxy_handler = ProxyHandler({
    	'http': 'http://  '
    	'https': 'https://  '
    })
    opener = build_opener(proxy_handler)
    try:
    	response = opener.open(url)
    	print(response.read().decode('utf-8'))
    except URLError as e:
    	print(e.reason)
    

    ここではProxy_を使いましたHandler、パラメータは辞書で、キー名はプロトコルタイプで、キー値はエージェントリンクです.
    CookiesはまずウェブサイトのCookiesを取得します:
    #   
    import http.cookiejar, urllib.request
    #    CookieJar  
    cookie = http.cookiejar.CookieJar()
    #  HTTPCooikeProcessor    Handler
    handler = urllib.request.HTTPCookieProcessor(cookie)
    #    opener
    opener = urllib.request.build_opener(handler)
    #  opener    
    response = opener.open(url)
    # cookies      
    for item in response:
    	print(item.name+"="+item.value)
    

    その結果、各Cookieの名前と値が出力され、ファイル形式に出力されます.
    filename = 'cookies.text'
    #    MozillaCookieJar  
    cookie = urllib.cookiejar.MozillaCookieJar(filename)
    #    Handler
    handler = urllib.request.HTTPCookieProcessor(cookie)
    #  opener()
    opener = urllib.request.build_opener(handler)
    response = opener.opern(url)
    #  ,        ,    
    cookie.save(ignore_discard=True, ignore_expires=True)
    

    宣言オブジェクトがMozillaCookieJarになり、ファイルを生成する際に使用されるCookieJarのサブクラスであり、Cookiesとファイルの関連イベントを処理することができます.LWPCookieJarはCookiesを保存して読み込むこともできますが、保存形式はtextではなくLWP形式のCookiesファイルです.
    保存後の読み込み
    cookie = http.cookiejar.LWPCookieJar()
    # load  
    cookie.load('cookies.text', ignore_discard=True, ignore_expires=True)
    #      cookie  handler
    handler = urllib.request.HTTPCookieProcessor(cookie)
    #  opener
    opener = urllib.request.build_opener(handler)
    #    opener  URL,      cookie
    response = opener.open(url)
    print(response.read().decode('utf-8')
    

    公式文書を参照:https://docs.python.org/3/library/urllib.request.html#basehandler-objects
    例外処理
  • URLError UrlError urllibライブラリからのerrorモジュールは、OSErrorクラスから継承され、error異常モジュールのベースクラスであり、requestモジュールによって発生した異常は、このクラスをキャプチャすることによって属性reasonを処理することができ、エラーの原因を返すことができる.
  • from urllib import request, error
    try:
    	response = request.urlopen(url)
    except error.URLError as e:
    	print(e.reason)
    
  • HTTPErrorはURLErrorのサブクラスであり、HTTP要求エラーを専門に処理し、例えば認証失敗など、3つの属性がある:code:HTTPステータスコードを返し、例えば:404、200、500などである.reason:エラーの原因を返します.headers:リクエストヘッダを返します.HTTPErrorはURLErrorのサブクラスであるため,まずサブクラスのエラーをキャプチャし,親クラスのエラーをキャプチャすることができる.
  • from urllib import request, error
    try:
    	response = request.urlopen(url)
    except error.HTTPError as e:
    	print(e.reason)
    except error.URLError as e:
    	print(e.reason)
    else:
    	print('error')
    

    より詳細なエラー情報を取得できます.
    解析リンクurllib.parse.urlparse()この方法はURLの識別とセグメント化を実現できる
    from urllib.parse import urlparse
    result = urlparse("http://www.baidu.com/index.html;user?id=5#comment")
    print(type(result), result)
    

    実行結果:
    
    ParseResult(scheme='http', netloc='www.baidu.com', path='index.html', params='user', query='id=5', fragment='comment')
    

    urlparse()を使用してURLを6つのセクションに分割します.
  • scheme:プロトコルを表します.
  • netloc:ドメイン名.
  • path:アクセスパス.
  • params:パラメータ.
  • query:クエリー条件.
  • #の後ろにアンカーポイントがあり、ページ内部のドロップダウン位置を直接位置決めします.次のようになります.scheme://netloc/path;params/?query#fragment規格のURLはいずれもこのルールに合致し、urlparse()メソッドで分割することができる.

  • API使用法:urllib.parse.urlparse(urlstring, scheme=’’, allow_fragment=True)
  • urlstring:解析対象URL
  • scheme:デフォルトのプロトコル、リンクがプロトコルを持っていない場合は、このパラメータで指定できます.リンクにプロトコルがある場合は、リンクに基づいてプロトコルが指定されます.
  • allow_fragment:allow_を無視するかどうかfragment.Falseに設定するとfragmentは無視され、path、parameters、queryの一部に分類されます.

  • urlunparse()urlparseの対立方法では、反復可能なオブジェクトをパラメータとして受け入れますが、長さは6:
    from urllib.parse import urlunparse
    data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
    print(urlunparse(data))
    

    結果:http://www.baidu.com/index.html;user?a=6#comment
    urlsplit()はurlparse()に似ていますが、paramsの部分を単独で解析するのではなく、値は5つの結果を返します.
    urlunsplit()はurlunparse()と同様に、リンクの各部分も5の長さで統合されています.
    urljoin()は、base_を提供する新しいリンクを生成するためにも使用されます.url(ベースリンク)は最初のパラメータとして、新しいリンクは2番目のパラメータとして、base_urlのscheme,netloc,pathの3つのコンテンツは,新しい接続の欠落部分を補完し,結果を返す.
    from urllib.parse import urljoin
    base_url = 'http://www.baidu.com'
    aim_url = 'FAQ.html'
    result = urljoin(base_url, aim_url)
    print(result)
    

    結果は次のとおりです.http://www.baidu.com/FAQ.html base_urlは3つの内容を提供します:scheme,netloc,path,新しい接続の中でもしないならば補充して、もし新しい接続があるならば、変わらない.
    urlencode()の一般的な方法の1つで、GETリクエストパラメータを構築する際に役立ちます.
    from urllib.parse import urlencode
    params = {
    	'name': 'germey',
    	'age': 22
    }
    base_url = 'http://www.baidu.com?'
    url = base_url + urlencode(params)
    print(url)
    

    結果:http://www.baidu.com?name=germey&age=22より便利な構造パラメータのために,あらかじめ辞書で示しておき,URLパラメータに変換する際に,このメソッドを呼び出せばよい.
    parse_qs()逆シーケンス化,urlencode()の対立
    from urllib.parse import parse_qs
    query = 'name=germey&age=22'
    print(parse_qs(query))
    

    結果:{‘name’:[‘germey’],‘age’:[‘22’]}
    parse_の使用qsl()がメタグループに変換された形式の結果は、[(‘name’:‘germey’),(‘age’:‘22’)]の結果がリストであり、各要素がメタグループである.
    quote()はコンテンツをURL符号化フォーマットに変換し、中国語のパラメータが付いている場合は文字化けしてしまう可能性があります.quote()メソッドを使用すると、中国語も符号化フォーマットに変換できます.
    from urllib.parse import quote
    keyword = "   "
    url = 'https://www.baidu.com/s?wd=' + quote(keyword)
    print(url)
    

    unquote()quote()メソッドの対立は,中国語を復号することができる.