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になっているか確認してください。
こちらもおススメ