Python で仕事 スクレイピング編 〜その2:スクレイピング練習〜

プログラミング

仕事に取り掛かる前に簡単な練習から始めたいと思います。
Python でスクレイピングする際には、以下のモジュールを使うのが一般的なようです。

  • Requests … HTTP クライアント。ブラウザの代わりとして使用。Python 標準ライブラリの「urllib.request」を使いやすくしたもの(本家サイト
  • Beautiful Soup … XML、HTML のパーザ(解析する役割を担う)。Wikipedia のページでは “which is useful for web scraping” と紹介されている(本家サイト

どちらもサードパーティ製のライブラリなので、「pip」コマンドを用いてインストールしましょう。

pip install requests
pip install beautifulsoup4

HTTP リクエストについてもう少し勉強

HTML をサーバに要求(リクエスト)する際、そのリクエストの仕方には種類があります。こちらのページにその一覧がまとめられていますので、その中で特に重要なものを抜粋してご紹介いたします。

  • GET … 指定したリソース(HTML や、画像、音声データ)をリクエストします。リクエスト時にパラメータを指定したい場合は URL の一部として情報を記載します。スクレイピングで使用するのは、主にこの手法になります。
  • POST … 主に新しい情報を登録・更新したい場合に使用します。お問い合わせフォームの情報をサーバに送信する際などに使用します。サーバに情報を送信することを「ポストする」と表現することが多いです。
    HTML 中の <submit> タグに関連してサーバに情報を送信する際、ブラウザが勝手に使用します。
  • PUT … 登録済みの情報を更新する際に使用します。
  • DELETE … 登録済みの情報を削除する際に使用します。

ちなみに本当の決まりというものは、同ページ内の “仕様書” として載っているように RFC(Request for Comments)という形でまとめられております。この資料は素人にはとても読みづらいです。もっと勉強して、厳密な規格を知りたくなった際に利用するといいでしょう。

Requests の使い方

このブログのトップページをリクエストしてみましょう。

import requests

r = requests.get('https://akiblog.tech/')
print(r.text)
<!doctype html>
<html lang="ja"
...(略)...
<a href="https://akiblog.tech/?p=1224" class="entry-card-wrap a-wrap border-element cf" title="Python で仕事 スクレイピング編 〜その1:スクレイピングとは〜">
  <article id="post-1224" class="post-1224 entry-card e-card cf post type-post status-publish format-standard has-post-thumbnail hentry category-4-post category-5-post category-6-post tag-python-post tag-38-post">
    <figure class="entry-card-thumb card-thumb e-card-thumb">
              <img width="320" content/uploads/2020/06/shutters

続いてパラメータを指定(記事IDを指定)してリクエストしてみます。

import requests

payload = {'p': '1224'}
r = requests.get('https://akiblog.tech/', payload)
print(r.text)

# 上記は以下と全く同じ
# r = requests.get('https://akiblog.tech/?p=1224')
# print(r.text)
<!doctype html>
<html lang="ja"
...(略)...
      <header class="article-header entry-header">
        <h1 class="entry-title" itemprop="headline">
          Python で仕事 スクレイピング編 〜その1:スクレイピングとは〜        </h1>

Beautiful Soup の使い方

パース(解析)する対象が必要なので、先程 Requests を使って取得した HTML を使用します。
今回、情報の抽出には CSS セレクタを使用しております。CSS セレクタについては、ここでは細かくご紹介できません……申し訳ありませんがご自身でご確認をお願いいたします。

from bs4 import BeautifulSoup
import requests

payload = {'p': '1224'}
r = requests.get('https://akiblog.tech/', payload)

soup = BeautifulSoup(r.text)
headers = soup.select('h4 span')     # CSS セレクタを使用した要素の指定の仕方
for h in headers:
    print(h.text)
スクレイピングとクロール
HTML と HTTP
クライアントとサーバ、ブラウザ
対象要素の指定・抽出 CSS セレクタ、XPath
robots.txt
サーバ負荷

簡単に情報を抽出できました!

次回は案件の内容を参考にして、Python での実装の仕方を勉強したいと思います。

コメント

タイトルとURLをコピーしました