LoginSignup
1
3

More than 3 years have passed since last update.

Pythonスクレイピングの基礎の基礎

Posted at

PythonのrequestsモジュールとBeautiful Soupを使った
スクレイピングの基礎の基礎

Webからコンテンツ(主にHTML)を取得する

  • URLのHTMLを全て取得して表示するコード:
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や画像ファイル、動画ファイルなども取得できる(コードは上と変わらない).

1秒の間隔を空ける
import time

time.sleep(1)

・複数のURLから連続してHTTPを取得する際は, 相手のサイトに迷惑をかけないように最低1秒ずつ間隔を空けること.
・そもそもそのサイトにプログラムからアクセスしてもよいのか, 公開している内容をデータ化してといった利用制限を確認する必要がある.

取得したWebコンテンツをファイルに保存する
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

selectメソッド
# div.exam1で囲まれた部分を抽出する
div_exam1 = bs.select('div.exam1')

・select()は, 機能はfindやfind_allと同じようにHTML要素の取得してリストで返すことだが, 検索条件にCSSセレクタを指定できる(詳しくはリンク).

1
3
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
1
3