MAGAZINE

ルーターマガジン

クローリング/スクレイピング

データチェックに便利なSQL

2025.02.14
Pocket

スクレイピング業務で一番使うのはSQL

スクレイピング業務で一番使うのは実はSQLです。プログラムを作った後にまともにデータが入っているかどうか、ゴミデータなどが混じってないかどうかを確認します。

期待通りのデータかどうかは目視でないと確認できませんが全量チェックはできません。

エクセルで開けるデータの規模であれば、フィルタをかけてデータのグループ化ができますが、エクセルで開けない規模では見落としがちです。

エクセルでできることはSQLでもできますので、やってみましょう。

サンプルとして、国税庁が公開している法人番号リストをみてみましょう。

MariaDBに取り込んだ全国の法人番号リストをサンプルに解説します。 まずは件数をみて、社会常識と照らし合わせて妥当かどうかを確認します。 500万件あるので一旦よしとします(数年前のデータなので今はもっと多いはず)。

MariaDB [to_csv_test]> select count(*) from companies;
+----------+
| count(*) |
+----------+
|  5015295 |
+----------+

まずは一行目をみます。

MariaDB [to_csv_test]> select * from companies limit 1\G
*************************** 1. row ***************************
                        id: 1
          corporate_number: 1000012160153
                   process: 01
                   correct: 1
               update_date: 2018-04-02
               change_date: 2015-10-05
                      name: 釧路検察審査会
             name_image_id:
                      kind: 101
           prefecture_name: 北海道
                 city_name: 釧路市
             street_number: 柏木町4-7
          address_image_id:
           prefecture_code: 01
                 city_code: 206
                 post_code: 0850824
           address_outside:
  address_outside_image_id:
                close_date: 0000-00-00
               close_cause:
successor_corporate_number: 0
              change_cause:
           assignment_date: 2015-10-05
                    latest: 1
                   en_name: Kushiro Committee for the Inquest of Prosecution
        en_prefecture_name: Hokkaido
              en_city_name: 4-7, Kashiwagicho, Kushiro shi
        en_address_outside:
                  furigana: クシロケンサツシンサカイ
                   hihyoji: 0
                created_at: 2021-05-30 13:23:15
                updated_at: 2021-05-30 13:23:15
1 row in set (0.00 sec)

こういうデータが入ってるということは分かりました。次にゴミデータが入ってないかどうかを一発のSQLで確認します。

各フールドごとに上位5件と下位5件をピックアップします。一個のSQLでは表現できないので、UNION句を使って、一個の出力にまとめます。

MariaDB [to_csv_test]> (select '> corporate_number' as label , corporate_number from companies order by corporate_number limit 5) union all
    -> (select '< corporate_number' as label , corporate_number from companies order by corporate_number desc limit 5) union  all
    -> (select '> name' as label , name from companies order by name limit 5) union  all
    -> (select '< name' as label , name from companies order by name  desc limit 5) union  all
    -> (select '> prefecture_name' as label , prefecture_name from companies order by prefecture_name limit 5) union  all
    -> (select '< prefecture_name' as label , prefecture_name from companies order by prefecture_name  desc limit 5)  ;
+--------------------+----------------------------------------------+
| label              | corporate_number                             |
+--------------------+----------------------------------------------+
| > corporate_number | 1000011000005                                |
| > corporate_number | 1000012010003                                |
| > corporate_number | 1000012010011                                |
| > corporate_number | 1000012010028                                |
| > corporate_number | 1000012010036                                |
| < corporate_number | 9700150102995                                |
| < corporate_number | 9700150102938                                |
| < corporate_number | 9700150102847                                |
| < corporate_number | 9700150102839                                |
| < corporate_number | 9700150102723                                |
| > name             | Κmワークス株式会社                          |
| > name             | М’s OFFICE株式会社                   |
| > name             | М fоr win株式会社                     |
| > name             | М&М TRADING株式会社                 |
| > name             | МTCホールディングス合同会社                |
| < name             | ?足院                                        |
| < name             | ?山英産業有限会社                            |
| < name             | ?形水産有限会社                              |
| < name             | ?川生産森林組合                              |
| < name             | ?川牧野農業協同組合                          |
| > prefecture_name  |                                              |
| > prefecture_name  |                                              |
| > prefecture_name  |                                              |
| > prefecture_name  |                                              |
| > prefecture_name  |                                              |
| < prefecture_name  | 鹿児島県                                     |
| < prefecture_name  | 鹿児島県                                     |
| < prefecture_name  | 鹿児島県                                     |
| < prefecture_name  | 鹿児島県                                     |
| < prefecture_name  | 鹿児島県                                     |
+--------------------+----------------------------------------------+

はい。早速おかしなデータがみつかりました。社名欄で上位と下位で並び替えると、文字化けをしている箇所が見つかりました。必ずしも文字化けしたコードが並び替えで見つかるとは限ららないのですが、それでも見つかりやすくはなりました。

また、都道府県が入ってないレコードも存在しました。ここから先は本当に都道府県がない法人などいるのか(海外法人などはないかもしれない)というのを確認して、システム上の異常なのか、「そういうデータ」なのかを切り分けます。

シンプルですが、上位下位を眺めるだけでもそのデータ処理のミスを発見することの助けにはなります。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから