Beautiful Soup を使用した Python による Web スクレイピング ガイド

公開: 2020-06-23
目次を見る
Python を使用した Web スクレイピングの概要:
BeautifulSoup はどのように機能しますか?
BeautifulSoup を使用して Web ページからデータをスクレイピングする方法
ウェブスクレイピングプロセス:
結論:

Python を使用した Web スクレイピングの概要:

Web スクレイピングに関しては、一部のプログラミング言語が他の言語よりも優先されます。 これらの中で最も人気のあるものの 1 つが Python です。 学習曲線が穏やかなため、最も簡単に学習できる言語の 1 つであることに加えて、大規模な開発者サポートを備えた言語であるという利点もあります。これにより、多数のサードパーティ パッケージが生まれました。 これらのパッケージは複数の機能に使用できますが、コア Python では実行が難しい場合があります。 一般的な例としては、画像処理やコンピューター ビジョンには OpenCV を使用し、機械学習には TensorFlow を使用し、グラフのプロットには MatplotLib を使用します。 Web スクレイピングに関しては、最も一般的に使用されるライブラリの 1 つが BeautifulSoup です。 このライブラリは特にインターネットからデータをスクレイピングするわけではありませんが、Web ページの HTML ファイルを取得できる場合は、そこから特定のデータ ポイントを抽出するのに役立ちます。 一般に、ライブラリは XML および HTML ドキュメントからデータ ポイントを抽出するために使用されます。

BeautifulSoup はどのように機能しますか?

Python でコードを書き始める前に、BeautifulSoup がどのように機能するかを理解する必要があります。 Web ページの HTML コンテンツを抽出し、html_obj などの変数に格納したら、コードを 1 行だけ記述して BeautifulSoup オブジェクトに変換できます。

スープ_obj = BeautifulSoup(html_obj, 'html.parser')

html_obj は HTML データ、soup_obj は取得した bs オブジェクト、「html.parser」は変換に使用されたパーサーです。 bs オブジェクト (soup_obj と呼ばれる) を取得すると、それをトラバースするのは非常に簡単です。トラバースするのは簡単なので、データの抽出も簡単になります。 例を挙げてみましょう。 e コマース Web サイトのすべてのページに存在する、製品タイトルと呼ばれるデータ ポイントを取得する必要があるとします。 ここで、その Web サイトから 1 つの HTML 製品ページをダウンロードし、各ページの製品名が、productTitle として ID を持つスパン タイプの要素に記載されていることに気付きました。 では、たとえば 1000 個の製品ページからこのデータを取得するにはどうすればよいでしょうか? さて、各ページの HTML データを取得し、この方法でデータ ポイントをフェッチします。

スパンの場合はsoup.findAll('span', attrs={'id': 'productTitle'}):
name_of_product = spans.text.strip()

これは、特定のタグ要素の間に存在するテキスト データを取得する方法ですが、タグの属性からデータを取得することもできます。

ウェブスクレイピング

BeautifulSoup を使用して Web ページからデータをスクレイピングする方法

bs オブジェクトがどのようにトラバースされるかについて基本的な理解が得られたので、コードを書いて、それがどのように機能するかを見てみましょう。 以下のコード スニペットを使用すると、米国を拠点とする主要な不動産市場である Zillow からデータを非常に簡単に取得できます。 このコードを実行してリストの URL を入力すると、出力データを JSON 形式で取得できます。 コードを1行ずつ理解しましょう。 まず最初に、マシンに Python 3.7 以降がインストールされていることを確認してください。 pip を使用して BeautifulSoup をインストールします。 他のすべてのパッケージは Python にあらかじめバンドルされているため、インストールする必要はありません。 完了したら、Atom や VS Code などのコード エディターをインストールすれば、準備完了です。 コードを理解することは重要であるため、最初の行から始めます。 特定の機能を使用するには、4 つのインポート ステートメントが必要です。 次に、「ctx」で始まる 3 つの行があります。 これらは、コードを介して Web サイトにアクセスするときに直面する可能性のある SSL 証明書エラーを無視するためのものです。 次に、ユーザーからの入力として Web サイトの URL を取得します。 ここでは、URL をハードコードすることも、複数の URL の配列を持つこともできます。

ウェブスクレイピングプロセス:

次に、urllib の Request 関数を使用して Web ページにアクセスします。 ヘッダーに User-Agent を追加して、ブラウザを使用していると Web サイトに認識させるようにしてください。 これを行う理由は、ウェブサイトはコードではなくブラウザによってアクセスされることを意図しているためです。したがって、ウェブサイトがあなたを見つけた場合、あなたの IP をブロックする可能性があります。 これが完了すると、すべての基本的な手順が完了します。次に、HTML オブジェクトを bs オブジェクトに変換し、それを utf-8 形式に整形して、Web ページ内の特殊文字と記号を処理します。 これが完了したら、bs オブジェクトを解析して、タイトル、短い詳細、およびその他のプロパティを抽出します。 ご覧のとおり、属性 type = application/ld+json のスクリプト タグには、複数のデータ ポイントがすべて JSON 形式で格納されています。 また、i==0 および i==1 チェックを使用していることがわかります。 これは、ページ内にこのような 2 つのスクリプト タグ (同じ属性を持つ) があるためです。 最初のタグはいくつかのデータ ポイントを提供し、2 番目のタグは残りを提供します。 すべてのデータ ポイントを抽出したら、それを JSON ファイルに保存して、そのまま保存できます。 必要に応じて、データを保存したり、サイトにアップロードしたり、データを使用して API をヒットしたりすることもできます。

json をインポート
SSL のインポート
from urllib.request import リクエスト、urlopen
from bs4 import BeautifulSoup

# SSL 証明書エラーを無視する
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

# Zillow のリスティング URL を入力として受け取る
url = input('Zillow HouseリスティングURLを入力してください-')

#ブラウザを使用しているとウェブサイトに信じ込ませる
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
ウェブページ = urlopen(req).read()

# HTML ページ -> BeautifulSoup オブジェクトのスープ = BeautifulSoup(webpage, 'html.parser')
html = スープ.prettify('utf-8')
property_details = {'details_long': {}, 'アドレス': {}}

# プロパティ リストのさまざまなデータ ポイントを抽出する
soup.findAll('title') のタイトル:
property_details['Title'] = title.text.strip()
壊す

soup.findAll('meta', attrs={'name': 'description'}) のメタの場合:
property_details['details_short'] = meta['content'].strip()

soup.findAll('div', attrs={'class': 'character-count-truncated'}) の div の場合:
property_details['details_long']['説明'] = div.text.strip()

for (i, script) in enumerate(soup.findAll('script',
attrs={'type': 'application/ld+json'})):
i == 0 の場合:
json_data = json.loads(スクリプト.テキスト)
property_details['details_long']['no_of_rooms'] = json_data['numberOfRooms']
property_details['details_long']['floor_size_in_sqrft'] = json_data['floorSize']['value']
property_details['address']['street'] = json_data['address']['streetAddress']
property_details['住所']['地方'] = json_data['住所']['住所地方']
property_details['address']['region'] = json_data['address']['addressRegion']
property_details['住所']['郵便番号'] = json_data['住所']['郵便番号']
i == 1 の場合:
json_data = json.loads(スクリプト.テキスト)
property_details['price_in_dollars'] = json_data['offers']['price']
property_details['inage'] = json_data['image']
壊す

出力ファイルとして open('house_listing_data.json', 'w') を使用:
json.dump(property_details, outfile, indent=4)

open('house_listing_data.html', 'wb') をファイルとして使用:
ファイル.書き込み(html)

print('————-データの抽出が完了しました.jsonファイルを確認してください.————-')

出力 JSON は次のようになります。

{
“details_long”: {
「no_of_rooms」: 3,
“floor_size_in_sqrft”: “1,392”
}、
"住所": {
“通り”: “22516 ジョアン博士”,
「地域」:「カリフォルニア」、
「地域」:「MD」、
「郵便番号」:「20619」
}、
「タイトル」:「22516 ジョアン博士、カリフォルニア州、MD 20619 | MLS #MDSM167670」、
“details_short”: “22516 Joan Dr , California, MD 20619-3175 は、150,000 ドルで売りに出されている一戸建て住宅です。 1,392 平方フィートの家は 3 ベッド、2.0 バスのプロパティです。 Zillow で 22516 Joan Dr の家の 40 枚の写真を見つけてください。 Zillow で物件の詳細、販売履歴、Zestimate データをご覧ください。 MLS # MDSM167670」、
“price_in_dollars”: 150000,
「稲毛」:「https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg」
}

結論:

最初にHTMLページを手動で分析し、ターゲットにする必要があるタグを決定できる限り、WebスクレイピングのニーズにBeautifulSoupを使用するのは簡単です. 動的コンテンツがなく、ログイン ページの背後にないページでも機能します。 より複雑な Web ページには、より複雑なツールが必要になります。 PromptCloud のチームは、データを活用し、データに基づく意思決定を行うことを検討している企業を支援します。 クラウド上で頻繁に実行される完全に自動化された Web スクレイピング エンジンのセットアップを支援するだけでなく、企業がデータを分析して傾向やその他の有用な情報を抽出するのを支援します。