1.例外処理
爬虫類では基本的なスキルを習得し、私たちは例外要求を送信した場合、ネットワークが良くないような、などの要求状況を拒否してきた、エラーが発生し、プログラムを終了することができます。
urllibはモジュールがエラーの例外が要求モジュールによって生成される定義します。問題がある場合、例外エラーモジュールは、モジュール内で定義された破裂する要求。今、さまざまな例外を処理するためにエラーモジュールを使用しています。
1.1URLErrror
基本クラス例外エラーモジュールでOSErrorのクラスから継承モジュールからのエラーのURLError urllibはクラスは、例外は、モジュールによって生成された要求によって、それによって捕捉することができます。
それは、私たちは、例外の種類を判断するのに役立ちます、間違った理由を返し、理由の重要な属性です。
from urllib import request,error
try:
request.urlopen('https://blog.csdn.net/Watson_Ashin/nothispage')
except error.URLError as e:
print(e.reason)
==>が見つかりません
私たちは、上記のアドレスが存在し、そして最終的に「見つかりません」を返し、プログラムおよびエラーは、我々は成功し、プログラムがまだ実行されている、例外を処理したこと、ありません訪問しました。
1.2HTTPERROR
それは、ハンドルHTTPリクエストエラーのために設計された、そのような認証要求の失敗などの問題URLErrorのサブクラスです。それは、次の3つのプロパティがあります。
- コード:例えば404のような戻りHETTPステータスコード、ページが存在しないことを示す、サーバ500は、内部エラーを表します。
- その理由は:エラーの原因を返します。
- ヘッダ:リターン要求されたヘッド
from urllib import request,error
try:
request.urlopen('https://blog.csdn.net/Watson_Ashin/nothispage')
except error.HTTPError as e:
print(e.reason,e.code,e.headers,sep='\n')
==>出力は次の
Not Found
404
Server: openresty
Date: Mon, 10 Feb 2020 07:36:31 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 15600
Connection: close
Vary: Accept-Encoding
Set-Cookie: uuid_tt_dd=10_18823982490-1581320191409-585554; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
Set-Cookie: dc_session_id=10_1581320191409.605227; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
ETag: "5e3b798b-3cf0"
上記の理由は、エラーコード、エラーコード、および要求ヘッダーを返しました。URLErrorがHTTPerror親であるので、最初の親を奪還、仕様サブクラスに従ってキャプチャするので、コードは以下の通りであります:
from urllib import request,error
try:
request.urlopen('https://blog.csdn.net/Watson_Ashin/nothispage')
except error.HTTPError as e:
print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:
print(e.reason)
else:
print('successful')
==>出力は次の
Not Found
404
Server: openresty
Date: Mon, 10 Feb 2020 07:40:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 15600
Connection: close
Vary: Accept-Encoding
Set-Cookie: uuid_tt_dd=10_18823982490-1581320400576-704001; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
Set-Cookie: dc_session_id=10_1581320400576.261739; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
ETag: "5e3b798b-3cf0"
これは、HTTPError取り込むように、それが間違ったステータスコード、理由、ヘッダとを得るために行うことができます。
HTTPError異常でない場合は、エラーのURLError異常出力の原因をキャプチャします。
最後に、それ以外の通常のロジックを処理します。これは、完全な例外処理文言です。
時々、その理由は、オブジェクトではなく、インスタンスの場合に返します。
import socket
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('https://www.baidu.com',timeout=0.01)
except urllib.error.URLError as e:
print(type(e))
if isinstance(e.reason,socket.timeout):
print('TIME OUT')
==>
<クラスのurllib.error.URLError '> タイムアウト
ここでは、直接スロータイムアウト例外を強制的にタイムアウトを設定します。
、プロパティはクラスsocket.timeoutである理由の結果を見つけることができます。だから、ここではその種類、より詳細な異常判定を決定するためでisinstance()メソッドを使用することができます。
エラーの様々な良い取引を必要とするプログラムをより強固にする爬虫類、!
2.リンク決意
カレーurllibは、解析モジュールはまた、各部分のURLの抽出を達成するために、例えば、URLを処理するための標準的なインタフェースを定義し、提供されるリンクの変換と組み合わされます。それは、次のプロトコルのURLの処理をサポートしていますファイル、FIP、ホリネズミ、HDL、HTTP、HTTPS、IMAP、MAILTO、MMS、ニュース、NNTP、プロスペロー、rsyncは、RTSP、RTSPU、SFTP、一口、一口、snewsは、SVN、SVN + SSH、Telnet、およびWAIS。、
実際には、URLを構築し、実際には、通常の文字列の連結も同じ効果を得ることができ、かつ効率的に解析モジュールは、他のコーディングの問題を解決することでパラメータを、交換された使用することができます。
2.1urlparse()
この方法は、URLを識別し、セグメントに実装することができます
from urllib.parse import urlparse
result = urlparse('https://www.baidu.com/index.htrp;user?id=5#comment ')
print(type(result),result,sep='\n')
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.baidu.com', path='/index.htrp', params='user', query='id=5', fragment='comment ')
見ることができる、結果は6つの部分、すなわちスキーム、netloc、経路、paramsは、含むオブジェクトParseResult型、あるクエリ、およびフラグメント。:インスタンスURLを見 http://www.baidu.com/index.html;user?id=S#comment 、6つの部分に分割されurlparse()メソッド。一般的な観察は、特定の区切り文字の解析を見つけることができます。://そのスキームの前で、合意に代わって、セミコロン;最初/シンボルは、アクセスパスであるパス、続いnetloc、すなわちドメイン名を、ある前のparamsの背後に、パラメータの代わりに、疑問符?クエリは、クエリ後に、(キーと値の形で)GETのURLなどの一般的なタイプです。うまく番号#の後ろには、位置を直接ページ内のプルダウン位置のアンカーです。
2.urlunparse()
urlunparse()が反対の()メソッドをurlparsedされ、彼が対象ですが、6でなければならない反復パラメータを受け取ります。実際には単純な文字ステッチは、URLを構築しました。
from urllib.parse import urlunparse
data = ['htttp','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
==> htttp://www.baidu.com/index.html;ユーザー= 6#コメント?
3.urlsplit()
この方法およびurlparse()メソッドだけでは、この部分に、彼はもはや解決のparamsは、唯一の5つの結果を返すことを除いて、非常によく似ています。そしてインデックスによって対応する値を得ることができます。
from urllib.parse import urlunparse
data = ['htttp','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
==> SplitResult(スキーム= 'HTTP'、netloc = 'www.baidu .COM'、パス= '/ index.htmlを、ユーザ、クエリ= 'idは= 5'、断片= 'コメント')
==> HTTP
4.urlunsplit()
そしてurlunparse()同様に、URLを構築し、また反復可能なパラメータを渡す必要はなく、長さは5でなければならないため、すなわちパラメータのparamsは渡されません。
5.urljoin()
urlunparse()とurlulisplit()メソッドで、我々はうまく組み合わせるのリンクを完了することができますが、前提は、特定の長さのオブジェクトは、各部分が明確に分離リンクされなければならないでなければなりません。また、urljoin()メソッドは、そのリンクを作成するための別の方法があります。我々は、この方法がBASE_URLスキーム、netlocとパスとこれら三つの新しいサプリメントミッシングリンクの内容の一部を解析して、最初のパラメータとして2番目のパラメータとして、新たなリンクをリンク(base_ur)の基礎を提供することができ、最後に、結果を返します。
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com','FAQ.html'))
print(urljoin('http://www.baidu.com ','https://cuiqingcai.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html','https://cuiqingcai.com/FAQ.html?question=2'))
print(urljoin('http://www.baidu.com?wd=abc','https://cuiqingcai.com/index.php'))
print(urljoin('http://www.baidu.com','?category=2#comment'))
print(urljoin('www.baidu.com','?category=2#comment'))
print(urljoin('www.baidu.com#comment','?category=2'))
http://www.baidu.com/FAQ.html
https://cuiqingcai.com/FAQ.html
https://cuiqingcai.com/FAQ.html
https://cuiqingcai.com/FAQ.html?question=2
https://cuiqingcai.com/index.php
http://www.baidu.com?category=2#comment
www.baidu.com?category=2#comment
www.baidu.com?category=2
BASE_URLは、3つの要素のスキーム、netlocパスを提供します。これら三つの新しいリンクに存在しない場合は、サプリメントになります。新しいリンク、新しいリンクの使用部分がある場合。paramsでBASE_URL、クエリーおよびフラグメントが非アクティブです。
6.urlencode()
GETリクエストパラメータを構築する際に非常に便利です一般的に使用される方法でurlencode()、ある絵に!!!フォーカス、。!!!
from urllib.parse import urlencode
params = { 'name':'watson',
'age' : 22}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)
==> http://www.baidu.com?name=watson&age=22
その後、複数ページに適したクロールされたURLを(GETは要求がここでしか使用することができます)、シリアライズされた。ここでurlencodeに辞書を通過するようにパラメータ()メソッドは、頻繁に使用されますが、基本的な事実は、単純な文字列です。またロジック。
7.parse_qs()与parse_qsl()
シリアライズを使用すると、直列化復元を持っている必要があります。我々はGETリクエストパラメータ、使用parse_qs()またはparse_qsl()メソッドの束を持っている場合は、あなたが戻って辞書やタプルからなるリストをそれを回すことができます。
from urllib.parse import parse_qs
query= 'name=germey&age=22'
print(parse_qs(query))
==> { '名前':[ 'germey']、 '年齢':[ '22']}
from urllib.parse import parse_qsl
query= 'name=germey&age=22'
print(parse_qsl(query))
==> [( '名前'、 'germey')、( '年齢'、 '22')]
8.quote()
方法は、コンテンツURLエンコードフォーマットに変換することができます。時々中国語、とURLのパラメータは文字化けの問題を引き起こす可能性があります場合は、この方法では、この時間は、URLエンコードされた中国人に変換することができます
from urllib.parse import quote
keyword ='哪吒'
url = 'https://www.baidu.com/s?wd='+ quote(keyword)
print(url)
==> https://www.baidu.com/s?wd=%E5%93%AA%E5%90%92
ここに戻って、多くの場合、ツーリストクラスでは、淘宝網に加えて、この方法のために使用される同様のクリープの検索では、多くの場合、文字変換を必要とされます。
9.unquote()
さて、符号化および復号化する必要があるため、にunquoteは、URLエンコードされた文字のデコードです。
from urllib.parse import unquote
print(unquote('%E5%93%AA%E5%90%92'))
==>反乱軍