Web サイトからデータを抽出するには主に 2 つの方法があります。
- Web サイトの API (存在する場合) を使用します。たとえば、Facebook には、Facebook に投稿されたデータを取得できる Facebook Graph API があります。
- Web ページの HTML にアクセスし、そこから有用な情報/データを抽出します。この手法は、Web スクレイピング、Web ハーベスティング、または Web データ抽出と呼ばれます。
この記事では、Beautiful Soup と呼ばれる Python の Web スクレイピング フレームワークの実装を使用した Web スクレイピングに関連する手順について説明します。 Web スクレイピングに含まれる手順:
- アクセスしたい Web ページの URL に HTTP リクエストを送信します。サーバーは、Web ページの HTML コンテンツを返すことによってリクエストに応答します。このタスクでは、Python リクエストにサードパーティの HTTP ライブラリを使用します。
- HTML コンテンツにアクセスしたら、データを解析するタスクが残ります。 HTML データのほとんどはネストされているため、文字列処理だけではデータを抽出できません。 HTML データのネスト/ツリー構造を作成できるパーサーが必要です。利用可能な HTML パーサー ライブラリは多数ありますが、最も高度なものは html5lib です。
- ここで、私たちがする必要があるのは、作成した解析ツリーをナビゲートして検索すること、つまりツリートラバーサルだけです。このタスクでは、別のサードパーティの Python ライブラリを使用します。 美しいスープ 。これは、HTML および XML ファイルからデータを取得するための Python ライブラリです。
ステップ 1: 必要なサードパーティ ライブラリをインストールする
- Python に外部ライブラリをインストールする最も簡単な方法は、pip を使用することです。 ピップ は、Python で書かれたソフトウェア パッケージのインストールと管理に使用されるパッケージ管理システムです。必要なのは次のことだけです。
pip install requests pip install html5lib pip install bs4>
ステップ 2: Web ページから HTML コンテンツにアクセスする
パイソン
import> requests> URL> => 'https:> /> /> www.techcodeview.com> /> data> -> structures> /> '> r> => requests.get(URL)> print> (r.content)> |
>
>
このコード部分を理解してみましょう。
- まず最初にリクエストライブラリをインポートします。
- 次に、スクレイピングする Web ページの URL を指定します。
- 指定された URL に HTTP リクエストを送信し、サーバーからの応答を r という応答オブジェクトに保存します。
- ここで、 print r.content として、 生の HTML コンテンツ ウェブページの。 「文字列」タイプです。
注: 場合によっては「受け入れられません」というエラーが発生する場合がありますので、以下のようにブラウザ ユーザー エージェントを追加してみてください。ここからデバイスとブラウザに基づいてユーザー エージェントを見つけます https://deviceatlas.com/blog/list-of-user-agent-strings
Python3
headers> => {> 'User-Agent'> :> 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'> }> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r> => requests.get(url> => URL, headers> => headers)> print> (r.content)> |
>
>
ステップ 3: HTML コンテンツを解析する
パイソン
#This will not run on online IDE> import> requests> from> bs4> import> BeautifulSoup> > URL> => 'http:> /> /> www.values.com> /> inspirational> -> quotes'> r> => requests.get(URL)> > soup> => BeautifulSoup(r.content,> 'html5lib'> )> # If this line causes an error, run 'pip install html5lib' or install html5lib> print> (soup.prettify())> |
>
>
BeautifulSoup ライブラリの本当に優れた点は、html5lib、lxml、html.parser などの HTML 解析ライブラリの上に構築されていることです。そのため、BeautifulSoup オブジェクトと指定されたパーサー ライブラリを同時に作成できます。上の例では、
soup = BeautifulSoup(r.content, 'html5lib')>
2 つの引数を渡して BeautifulSoup オブジェクトを作成します。
- r.content : 生の HTML コンテンツです。 html5lib : 使用する HTML パーサーを指定します。
今 スープ.prettify() 印刷されており、 これにより、生の HTML コンテンツから作成された解析ツリーが視覚的に表現されます。 ステップ 4: 解析ツリーを検索して移動する ここで、HTML コンテンツからいくつかの有用なデータを抽出したいと思います。スープ オブジェクトには、プログラムで抽出できる入れ子構造のすべてのデータが含まれています。この例では、いくつかの引用符で構成される Web ページをスクレイピングしています。そこで、これらの引用 (およびそれらに関するすべての関連情報) を保存するプログラムを作成したいと思います。
パイソン
#Python program to scrape website> #and save quotes from website> import> requests> from> bs4> import> BeautifulSoup> import> csv> > URL> => 'http:> /> /> www.values.com> /> inspirational> -> quotes'> r> => requests.get(URL)> > soup> => BeautifulSoup(r.content,> 'html5lib'> )> > quotes> => []> # a list to store quotes> > table> => soup.find(> 'div'> , attrs> => {> 'id'> :> 'all_quotes'> })> > for> row> in> table.findAll(> 'div'> ,> > attrs> => {> 'class'> :> 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'> }):> > quote> => {}> > quote[> 'theme'> ]> => row.h5.text> > quote[> 'url'> ]> => row.a[> 'href'> ]> > quote[> 'img'> ]> => row.img[> 'src'> ]> > quote[> 'lines'> ]> => row.img[> 'alt'> ].split('> #')[0]> > quote[> 'author'> ]> => row.img[> 'alt'> ].split('> #')[1]> > quotes.append(quote)> > filename> => 'inspirational_quotes.csv'> with> open> (filename,> 'w'> , newline> => '') as f:> > w> => csv.DictWriter(f,[> 'theme'> ,> 'url'> ,> 'img'> ,> 'lines'> ,> 'author'> ])> > w.writeheader()> > for> quote> in> quotes:> > w.writerow(quote)> |
>
ラテックス部分導関数
>
先に進む前に、soup.prettify() メソッドを使用して印刷した Web ページの HTML コンテンツを調べて、パターンや引用符に移動する方法を見つけてみることをお勧めします。
- すべての引用符が、ID が「all_quotes」である div コンテナー内にあることがわかります。したがって、次を使用して div 要素 (上記のコードでは table と呼ばれる) を見つけます。 探す() 方法 :
table = soup.find('div', attrs = {'id':'all_quotes'})>
- 最初の引数は検索する HTML タグで、2 番目の引数はそのタグに関連付けられた追加の属性を指定する辞書タイプの要素です。 探す() メソッドは最初に一致した要素を返します。印刷してみることもできます table.prettify() このコード部分が何をするのかを理解するために。
- ここで、table 要素では、各引用符がクラスが quote である div コンテナー内にあることがわかります。したがって、クラスが quote である各 div コンテナを反復処理します。ここでは、引数の点では find メソッドと似ていますが、一致するすべての要素のリストを返す findAll() メソッドを使用します。各引用符は、という変数を使用して反復されるようになりました。 行。 理解を深めるために、HTML コンテンツのサンプル行を 1 つ示します。
次に、次のコード部分について考えてみましょう。
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)>
- 引用に関するすべての情報を保存する辞書を作成します。ネストされた構造には、ドット表記を使用してアクセスできます。 HTML 要素内のテキストにアクセスするには、次を使用します。 。文章 :
quote['theme'] = row.h5.text>
- タグの属性を追加、削除、変更し、アクセスできます。これは、タグを辞書として扱うことによって行われます。
quote['url'] = row.a['href']>
- 最後に、すべての引用符が というリストに追加されます。 引用。
- 最後に、すべてのデータを CSV ファイルに保存したいと思います。
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
- ここでは、inspirational_quotes.csv という CSV ファイルを作成し、今後使用できるようにそのファイル内のすべての引用符を保存します。
以上、Python で Web スクレイパーを作成する方法の簡単な例でした。ここから、選択した他の Web サイトをスクラップしてみることができます。ご質問がある場合は、以下のコメント欄に投稿してください。
注記 : Web スクレイピングは多くの場合違法とみなされます。また、IP が Web サイトによって永久にブロックされる可能性もあります。このブログの寄稿者は、 ニキル・クマール 。