lisz-works

技術と興味の集合体

Python3でのスクレイピングは最低限コレでいける

【スポンサーリンク】

Python3

Python3でのWebスクレイピングを実際やってみて

「コレがあれば基本的にはスクレイピングできる」

というものをまとめてみました!

使うライブラリ

最低限使うのは

import requests
from bs4 import BeautifulSoup

この2つをすごくザックリというと、

requestsは、Webのデータをやり取りするためのヤツ。

「このURLのデータをちょうだーい!」

ってことをしてくれます。

BeautifulSoupは、手に入れたデータを抽出したりするのに使います。

「このデータのこの要素がほしい!」

ってときに楽にピックアップする事ができます。

RequestsでページのHTMLを取得する

RequestsでHTMLを取得するには

url = 'https://www.google.com/'
response = requests.get(url)

のように書きます。

これでHTMlのソースが取得できます

成功したかチェック

requests.get()した結果は、「response.status_code」でチェックすることができます。

値が「200」だと成功なので

if response.status_code != 200:
  print('ERROR!!')

のようにすることで、エラーになったかどうか?をチェックする事ができます。

取得したHTMl

取得したHTMLは

html = response.text

のようにすることで取得する事ができます。

このHTMLを、BeautifulSoupで使用します。

soup = BeautifulSoup(html, 'html.parser')

取得したHTMLを整形した状態にする

よくエディタや、ソースを見たときのような「キレイな形のHTMLとして取得したい!」という場合は

formatHtml = soup.prettify() # 整形したHTMLをセット(str)

のようにすると、キレイに整形した状態のHTMLを取得する事ができます。

よく見るソースコードや自分で書くソースコードのように、改行やインデントで整形されたものを見たい場合は、コチラを使います。

HTMLから値を抽出

さて、この辺からが本題です。

HTMlを取得するのはともかくとして、そこから情報を取得するのが本題キモの部分ですよね。

BeautifulSoupオブジェクトから、HTMLタグやプロパティを指定して、要素を取得していきます。

1つの要素を取得する

1つしかない要素や、先頭要素を取得する場合は

content = soup.find('div', {'id': 'main_contents'})

のように指定します。

戻り値は、単一のBeautifulSoupオブジェクトです。

なのでこの要素を使って、そのままBeautifulSoupで処理していくことができます。

例えば更に要素を取得したりとか。

content = soup.find('div', {'id': 'main_contents'})
target = content.find('div', {'id': 'target_item'})

複数要素をまとめて取得する

要素が複数あり、それらをまとめて取得する場合は

contents = mainContent.find_all('div', {'class': 'sub_contents'})

のように指定します。

戻り値は、BeautifulSoupオブジェクトの配列となります。

なのでちゃんと配列要素を指定して上げれば、BeautifulSoupで処理していくことができます。

例えば、先頭要素を処理したい場合は

contents = mainContent.find_all('div', {'class': 'sub_contents'})
contents = contents[0].find_all('a', {'class': 'link'})

とか、ループを使ってまとめて処理したい場合は

contents = mainContent.find_all('div', {'class': 'sub_contents'})
for item in contents:
  target = content.find('div', {'class': 'target_item'})
  # targetを処理

みたいにすれば、まとめて処理することもできちゃいます。

タグのテキストを取得する

リンクのaタグや、テキストとかに使うpタグなど、

<a id="link_deathzo" href="https://www.exsample.com/">リンクですぞ</a>

のようなものがあったとき、「リンクですぞ」を取得するには

a =  soup.find('a', {'id': 'link_deathzo'})
print(a.string)

のようにすると取得できます。

プロパティを取得する

プロパティは、タグの中に含まれる要素。

aタグのhrefなんかですね。このhrefを取得したい場合、

<a id="link_deathzo" href="https://www.exsample.com/">リンクですぞ</a>

に対して

href = a.get('href')

のようにすることで、hrefの値を取得することができます。

リンクをたどる

ココまでのものを応用していくことで、リンクをたどっていくことができます。

例えば、「次へ」でページを進めていきたいとします。

まず、先頭ページを取得して処理します。

url = 'https://www.google.com/'
response = requests.get(url)
html = response.text
# 先頭ページを処理

次に「次へボタン」からリンク先を取得します。

next = soup.find('a', {'id': 'next'})
href = next.get('href')

リンク先のURLを取得できましたね。
ここで先頭の処理に戻ります。

response = requests.get(href)
html = response.text
# 処理

このような感じで繰り替えすことで、複数あるページも次々に処理していくことができます。

あとがき

ということで、Python3でのスクレイピングで最低限やるために必要なことでした!

実際この知識だけで、とりあえずスクレイピングはできたので

「とりあえずスクレイピングやってみたいんだよね」

という方は、試してみてはいかがでしょうかk?

ただしもっと効率的な方法とかはあるかも知れないので、気になったらそこは調べてみてください!

僕もなにかあったらまた記事として掲載しようと思います!