[PHP]Goutteを使ってQuizletの単語帳をtsvファイルに出力する

カテゴリ: PHP

Quizletで管理されている単語帳をExcelに出力したかったため、PHPのGoutteパッケージを使用してtsv形式に変換するスクリプトを作成しました。

※PHPでGoutteパッケージの使い方自体は、こちらの記事を参考にしてください。

スクレイピングのスクリプト

phpのスクリプトは以下の通りです。

<?php
require_once("vendor/autoload.php");

use Goutte\Client;

/**
 * 指定されたデッキの単語帳を取得する
 * @param $deckId 単語帳のデッキID
 */
function scrapeFlashCard($deckId)
{
    $url = "https://quizlet.com/" . intval($deckId) . "/flash-cards/";

    $client = new Client();
    $crawler = $client->request('GET', $url);

    // デッキ内のすべてのカードを取得
    $crawler->filter('.SetPageTerm')->each(function ($flashCard) {
        // カード表、カード裏のテキストを取得
        $front = $flashCard->filter('.SetPageTerm-wordText')->text() ;
        $back  = $flashCard->filter('.SetPageTerm-definitionText')->text();

        // 取得したカードを出力
        outputCard($front, $back);
    });
}

/**
 * 取得されたカードの情報を出力
 * @param $front カード表面のテキスト
 * @param $back  カード裏面のテキスト
 */
function outputCard($front, $back)
{
    // ダブルクォート付きのtsvに変換
    $line = sprintf('"%s"%s"%s"', $front, "\t", $back);

    // 文字コードを(excelで開けるよう)sjisに変換
    $line = mb_convert_encoding($line, "SJIS", "UTF-8");

    // 変換結果を出力
    echo $line . PHP_EOL;
}

function main($argc, $argv)
{
    // 取得するデッキIDを決定する
    if ($argc <= 1) {
        echo "too few argument.";
        return;
    }
    $deckId = $argv[1];

    // 指定されたデッキIDの単語帳を取得する
    scrapeFlashCard($deckId);
}

main($argc, $argv);

実行方法

始めて実行する時は、まずcomposerでfabpot/goutteパッケージを取得します。

$ composer require  fabpot/goutte

次に、取得したい単語帳のIDを確認します。IDはURLに記載されています(下記の画像の赤枠のところです)。

前述のphpスクリプトに単語帳のIDパラメータとして指定して、コマンドラインから実行します。
すると、単語帳の内容が画面に出力されます。

C:\work> php scrape.php 213766740
"on the way"    "途中で"
"awful" "恐ろしい"
"persistent"    "しつこい"
"pavimenti"     "床"
"detergent"     "洗剤"
"Publish"       "出版"

Excelで開きたい場合は、以下のようにいったんファイルに出力します。

C:\work> php scrape.php 213766740 > result.tsv

出力したresult.tsvをExcelで開けば、以下のように表示されるはずです。
もし文字化けする場合は、ファイルの中身がShift-JISになっているか確認してください。

こちらもおススメ
カテゴリ: PHP

コメントを残す

メールアドレスが公開されることはありません。