Pythonでスクレイピング
スクレイピングとは
インターネット上にある、HTMLをはじめとするさまざまなコンテンツを取得すること
(車のフロントガラスに積もった雪をこそげ落とすイメージ?)
ざっくりやってみる事
- HTMLを取得してみる
- 連続で取得してみる
- HTMLを解析してみる
HTMLを取得する
-
Requests
というライブラリを使ってやってみる - 取得するコンテンツに日本語等マルチバイト文字を含んでいる場合、文字化けしてしまうので呪文を唱える
$ pip install requests
import requests
# とりあえずgoogleのトップに殴り込む
url = 'https://www.google.com/?hl=ja'
response = requests.get(url) # ここまでだと文字化けの可能性が
response.encoding = response.apparent_encoding # 呪文
print(response.text) # textに入ってくる
encoding
プロパティーでサーバーからのレスポンスの文字エンコーディングを指定できる
ここで指定したapparent_encoding
はレスポンスの内容から文字エンコーディングを教えてくれるもので、こいつをencodingプロパティーに指定する事で無敵モードになれる
<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
<head>
<meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description">
...(割愛)...
※本当は1行で返ってきますが見やすいように体裁整えています
(結果を見た感想:googleトップってドシンプル、でもscriptがんがん仕込まれててなんかすごっ)
ちなみにHTML以外も
インターネット上のコンテンツであればcsv、画像、動画の取得等も可能
import requests
# フロリダ州立大学が後悔していたサンプルCSV URL以外は同じ
url = 'https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv'
response = requests.get(url)
response.encoding = response.apparent_encoding
print(response.text)
連続で行っちゃう
特に変わったことはしない、一目瞭然
import time
import requests
# 取得したいURL
url_html = "https://www.google.com/?hl=ja"
url_csv = "https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv"
# HTMLの取得と表示
response = requests.get(url_html)
response.encoding = response.apparent_encoding
print(response.text)
# 1秒スリープ
time.sleep(1)
# CSVの取得と表示
response = requests.get(url_csv)
response.encoding = response.apparent_encoding
print(response.text)
ただ2回やってるだけ
実際は取得に行くところはメソッドに切り出して引数だけでできるようにするのかな? まあいいや。
time.sleep(1)
今回は例としての記述だが、同じサイトに何度もリクエストする場合は、相手にご迷惑にならないように間隔あけるのがマナーって死んだトノサマバッタが言ってた
HTMLを解析する
-
BeautifulSoup
というライブラリを使う(名前イケすぎてる・・・) - aタグのテキストとリンク先URLを抜いてみる
$ pip install bs4
import requests
from bs4 import BeautifulSoup
url = "https://www.yahoo.co.jp/"
response = requests.get(url)
response.encoding = response.apparent_encoding
bs = BeautifulSoup(response.text, 'html.parser')
a_tag = bs.find('a') # 1つ目に見つかったやつ
# nobr_tag = bs.find_all('nobr') # 全部
# nobr_tag = bs.find_all('div', class_='item') # なんか条件指定できたりする classは予約語
# div_item_list = bs.select('div.item-list') # セレクタで指定
print(a_tag.text)
print(a_tag['href']) # a_tag内のhref属性にアクセス
html.parser
以外は別途公式ドキュメント等で調べる
ここまでやってから知った
Python - Scrapyを使ってクローラーを作る
RequestsとかBeautifulSoupとかより便利で実用的なやつあるやんか!
感想
スクレイピングするだけならあっという間にできますね。
この取ってきたデータをどう保存して、どう活用するか、DeepLearningにかけるかとかを考えるわけか。