LoginSignup
12
12

More than 5 years have passed since last update.

Pythonでスクレイピング

Last updated at Posted at 2019-05-28

Pythonでスクレイピング

スクレイピングとは

インターネット上にある、HTMLをはじめとするさまざまなコンテンツを取得すること
(車のフロントガラスに積もった雪をこそげ落とすイメージ?)

ざっくりやってみる事

  • HTMLを取得してみる
  • 連続で取得してみる
  • HTMLを解析してみる

HTMLを取得する

  • Requestsというライブラリを使ってやってみる
  • 取得するコンテンツに日本語等マルチバイト文字を含んでいる場合、文字化けしてしまうので呪文を唱える
$ pip install requests
sample.py
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、画像、動画の取得等も可能

csv_sample.py
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)

連続で行っちゃう

特に変わったことはしない、一目瞭然

sample.py
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
sample.py
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にかけるかとかを考えるわけか。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12