Python
スクレイピング
JSON
python3

Python3 の Scraping 基礎(JSON)

今回は,Python3を使ってWebスクレイピングの基礎について触れ合いたいと思います.また,スクレイピングするデータ形式はJSONとします.

ライブラリインストール

スクレイピングするためのライブラリ:

  • requests: HTTP ライブラリ
  • beautifulsoup4: htmlパーサー(pythonから呼び出し)
pip3 install requests
pip3 install beautifulsoup4
pip3 install lxml

ライブラリの確認

pip3 freeze | grep -e request -e beautiful

   or

pip3 freeze 

JSONについて

今回は,JSON形式のデータをスクレイピングしたいため.ここで,JSONについて簡単に説明を行います.
JSON は「JavaScript Object Notation」の略で、「JavaScript 言語の表記法をベースにしたデータ形式」と言えます。しかし、表記が JavaScript ベースなだけで、それ以外のさまざまな言語で利用できます。JSON では、ある数値と、その数値の名前であるキーのペアをコロンで対にして、それらをコンマで区切り、全体を波かっこで括って表現します。

[{
 "@type" : "LocalBusiness",
 "name" : "東京ディズニーランド(R)"
},
{
 "@type" : "LocalBusiness",
 "name" : "東京ディズニーシー(R)"
},
{
 "@type" : "LocalBusiness",
 "name" : "草津温泉"
},
{
 "@type" : "LocalBusiness",
 "name" : "みなとみらい21"
},
{
 "@type" : "LocalBusiness",
 "name" : "あしかがフラワーパーク"
}]

使用方法

まずライブラリのインポートを行います.

import requests  ##スクレイピング用
from bs4 import BeautifulSoup  ##スクレイピング用
import json  ##Python3 で JSON 形式のデータを扱う方法

HTMLの内容の取得を行います.

target_url = 'www.*****.com'
r = requests.get(target_url)         #requestsを使って、webから取得

htmlパース用のオブジェクト作成します。内部で利用するパーサーを指定する場合は、"html.parser"の部分を"lxml"などに変更します。

soup = BeautifulSoup(r.text "html.parser")
 or
soup = BeautifulSoup(r.content, 'lxml') ##要素の抽出

lxmlは速度が早いのでおすすめです.

ここで,注意すべきことは,文字化けです.
Requestsのr.encodingやr.textをそのまま使うと、文字化けしやすくなります。 回避できる方法は以下2つです.

  • Chardetをインストールしておく
  • BeautifulSoup()にr.contentを渡してBeautiful Soup側でデコードする

Chardetをインストールすると,大体の場合文字化けを回避できます。シンプルなのでオススメです。

サンプルコード

min_page = 1
max_page = 550


while min_page <= max_page:
    target_url = "https://www.***/page_" + str(min_page) + ".com"
    print(target_url)  ## url表示

    r = requests.get(target_url)         ## requestsを使って、webから取得
    soup = BeautifulSoup(r.content, "lxml") ## 要素の抽出

    ## 特定のタグの取得 (scriptタグのtypeのapplication/ld+jsonを指定)
    title_part = soup.find_all("script", {"type": "application/ld+json"})

    for i in title_part:
        title = i.get_text() ##タグの中のtext部分のみを指定

        ## JSON ファイルを load 関数で読み込むと、Python で扱いやすいように辞書型で保存されます。
        ## 辞書型なら要素の取り出しなどが容易に出来て便利です.

        a = json.loads(title)
        print(a) ## titleを表示

    min_page += 1 ##ページ数を1追加