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?
ただしもっと効率的な方法とかはあるかも知れないので、気になったらそこは調べてみてください!
僕もなにかあったらまた記事として掲載しようと思います!