pythonネットワーク爬虫類と情報採取の異常処理


この文章はRyan Mitchellが書いたpythonから転じた:ネットワークデータ収集ネットワークは非常に複雑である.Webデータのフォーマットが友好的ではなく、Webサーバがダウンタイムし、ターゲットデータのラベルが見つからないのは面倒なことです.ネットデータ収集の最も苦痛な境遇の一つは、爬虫類が運行している間に洗濯して寝て、明日の朝早くデータを収集してデータベースに置くことを夢見ていたが、翌日目が覚めると、あるデータフォーマットの異常で運行が間違っている爬虫類が見え、前日にスクリーンを見つめて寝なくなった後、しばらくすると爬虫類は運行しなくなった.その时、あなたはインターネット(およびあれらの奇抜なネットデータフォーマット)を発明した人をののしりたいかもしれませんが、あなたが本当に叱るべき人はあなた自身で、どうして最初から現れる可能性のある異常を推定しません!爬虫類import文の後ろの最初の行のコードを見てみましょう.そこに発生する可能性のある異常をどのように処理するかを見てみましょう.html = urlopen("http://www.pythonscraping.com/pages/page1.html")この行のコードは主に2つの異常が発生する可能性があります.•ページがサーバに存在しない(またはページを取得したときにエラーが発生した)•サーバが最初の異常が発生しない場合、プログラムはHTTPエラーを返します.HTTPエラーは「404 Page Not Found」「500 Internal Server Error」などである可能性があります.同様の場合、urlopen関数はすべて「HTTPError」異常を放出します.この異常を次のように処理できます.
try: html =  urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
 print(e) #     ,    ,         
 else: #     。

注意:もしあなたがすでに上の異常にあの1段のコードの中で帰ってあるいは中断(break)を捉えているならば、#はelse文を使う必要はなくて、このコードも実行しませんもしプログラムがHTTPエラーコードを返すならば、プログラムはエラーの内容を表示して、else文の後面のコードを実行しません.サーバが存在しない場合(つまりリンクhttp://www.pythonscraping.com/開けられないか、URLリンクが間違っている)とurlopenはNoneオブジェクトを返します.このオブジェクトは他のプログラミング言語のnullと似ています.戻ってきたhtmlがNone:if html is None:print(「URL is not found」)else:#プログラム継続ページがサーバから正常に取得されたかどうかを判断する文を追加することができ、ページの内容が完全に私たちが望んでいるようにでなければ、依然として異常が発生する可能性があります.BeautifulSoupオブジェクトのラベルを呼び出すたびに、ラベルが確かに存在することを保証する検査条件を追加するのは賢い方法です.呼び出したいラベルが存在しない場合は、BeautifulSoupは初見ネットワーク爬虫類|9回Noneオブジェクトに戻ります.ただし、このNoneオブジェクトの下のサブラベルを呼び出すと、AttributeErrorエラーが発生します.次の行のコード(nonExistentTagは仮想ラベルで、BeautifulSoupオブジェクトには実際にはありません)print(bsObj.nonExistentTag)はNoneオブジェクトを返します.このオブジェクトを処理してチェックする必要があります.チェックしないで、このNoneオブジェクトのサブラベルを直接呼び出すと、面倒になります.以下に示す.print(bsObj.nonExistentTag.someTag) AttributeError: 'NoneType' object has no attribute 'someTag'私たちはどのようにしてこの2つの状況の異常を避けることができますか?最も簡単な方法は、2つの状況を検査することです.
try: badContent = bsObj.nonExistingTag.anotherTag
except AttributeError as e:
    print("Tag was not found")
else: 
     if badContent == None:
          print ("Tag was not found")
     else: print(badContent)
 `                      ,  ,              ,         (     ,     )。  ,                :
from urllib.request import urlopenfrom

urllib.error
import HTTPErrorfrom

bs4
import BeautifulSoup


def getTitle(url): try

    : html = urlopen(url) except HTTPError as e:
return None
try: bsObj = BeautifulSoup(html.read())
title = bsObj.body.h1 except AttributeError as e:
return None
return titletitle = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
    print("Title could not be found")else:
    print(title)

1章ではこの例でgetTitle関数を作成し,ページのタイトルを返すことができ,ページを取得する際に問題が発生した場合にNoneオブジェクトを返す.gettitle関数では,前のようにHTTPErrorをチェックし,2行のBeautifulSoupコードを1つのtry文にカプセル化した.この2行のいずれかに問題がある場合、AttributeErrorは投げ出される可能性があります(サーバが存在しない場合、htmlはNoneオブジェクトであり、html.read()はAttributeErrorを投げ出す).実際には、try文に任意のマルチラインコードを入れるか、任意の場所でAttributeErrorを投げ出すことができる関数を置くことができます.爬虫類を書くときは、コードの全体的な構造を考えて、コードが異常を捉えやすく、読みやすいようにすることが重要です.コードを大幅に再利用したい場合は、getSiteHTMLやgetTitleのような汎用関数(緻密な異常処理機能)を持つことで、迅速かつ安定したネットワークデータ収集が容易になります.