PythonのrequestsモジュールとBeautiful Soupを使った
スクレイピングの基礎の基礎
Webからコンテンツ(主にHTML)を取得する
- URLのHTMLを全て取得して表示するコード:
import requests
url = "https://hogehoge12345.html"
response = requests.get(url)
response.encoding = response.apparent_encoding
print(response.text)
・requests.get()
で, 引数のURLに対してHTTPリクエストを送信し, サーバーから返されるHTTPレスポンスを戻り値にする.
・apparent_encodingで, 文字化けが極力起こらないようにする.
・response.textが、取得したコンテンツの中身
・URLでアクセスできるものなら, CSVや画像ファイル、動画ファイルなども取得できる(コードは上と変わらない).
import time
time.sleep(1)
・複数のURLから連続してHTTPを取得する際は, 相手のサイトに迷惑をかけないように最低1秒ずつ間隔を空けること.
・そもそもそのサイトにプログラムからアクセスしてもよいのか, 公開している内容をデータ化してといった利用制限を確認する必要がある.
response = requests.get(url)
response.encoding = response.apparent_encoding
exam_html = response.text
with open('exam.html', mode='w', encoding='utf-8') as fp:
fp.write(exam_html)
HTMLの解析
- Beautiful Soup というライブラリを使う.
- HTMLの字句解析をして, タグなどをデータ構造として取得するプログラムをHTMLパーサーという.
import requests
from bs4 import BeautifulSoup
url = "https://hogehoge12345.html"
response = requests.get(url)
response.encoding = response.apparent_encoding
# HTMLを解析する
bs = BeautifulSoup(response.text, 'html.parser')
# ulタグで囲まれた部分を抽出する
ul_tag = bs.find('ul')
# ulタグの中のaタグを抽出する
for a_tag in ul_tag.find_all('a'):
# aタグのテキストを取得
text = a_tag.text # => "クリックするとリンクに飛びます"
# aタグのhref属性を取得
link_url = a_tag['href'] # => "https://hogehoge12345.html/next"
print('{}: {}'.format(text, link_url))
・bs.find('ul')
で, <ul>から</ul>までのHTMLコードを取得
・findメソッドは先頭から辿って最初の要素だけ取り出すが, find_allメソッドは全ての要素をイテラブルに取り出す(= forループに使える). 詳しくはリンク.
CSSセレクター
- 特定のタグ(あるCSSクラスを持つタグなど)の抽出には, CSSセレクターを用いる
- タグとCSSクラスをドットで繋いで表現 <div class="exam_exam1"> -> div.exam1
# div.exam1で囲まれた部分を抽出する
div_exam1 = bs.select('div.exam1')
・select()は, 機能はfindやfind_allと同じようにHTML要素の取得してリストで返すことだが, 検索条件にCSSセレクタを指定できる(詳しくはリンク).