スポンサーリンク
スポンサーリンク

スクレイピングを行う際によく使う技術

プログラミング

こんにちは!sho44(twitter:sho4485935826)です。

今回はスクレイピングを行う際によく使う技術についてまとめました。

技術は大別して正規表現、デバッグ、スクレイピング実装の観点から紹介しています。

知識の共有と自身のメモ用のためにこの記事を書きました。

僕はpythonを使ってスクレイピングをしているので、他の言語を使ってスクレイピングを行っている人には一部参考にならない箇所があるかと思います。特にデバッグ編ではそう。

それではみていきましょ〜

スポンサーリンク

正規表現編

電話番号を取得したい時に使う正規表現

'\d{1,5}-\d{1,5}-\d{1,5}'

※もっと厳密に書けると思いますが、これで取れます

正規表現を用いた文字列の取得(python)

import re

hoge1 = '文字列'
regix_pattern = 正規表現パターン
regix_object = re.compile(regex_pattern)
regex_search_result = regix_object.search(hoge1)
if regex_search_result is not None:
    result = regex_search_result.group()

文字列は例えば、’アイウエオ000-0000-0000かきくけこ’

正規表現パターンは例えば、’\d{1,5}-\d{1,5}-\d{1,5}’

この条件の実行結果: 000-0000-0000

文字列の中から任意の漢字を取得したい時

import regex
 
regex.findall(r'\p{Han}+', '私は一時に帰ります')

実行結果: [‘私’, ‘一時‘, ‘帰’]

※pythonをインストールした際に自動でインストールされていないので使用する際には

pip install regex

を実行してインストールしてから使ってください。

文字列の中の複数の単語を一括で同じ単語に変えたいとき(置換)

re.sub(‘文字列の中の変えたい元単語, ‘文字列の中の変えたい先文字列‘, ‘文字列‘)

例)

import re

re.sub('鳥', 'ワニ', '鳥かと思ったら鳥みたいな蛙だった')

実行結果:ワニかと思ったらワニみたいな蛙だった

記号を正規表現のパターンの中に入れる場合

エスケープする。

以下の記事が参考になります。

【保存版】正規表現でエスケープが必要な文字一覧表 - Qiita
エスケープ前 エスケープ後 注意点 \ \ エスケープを行う文字そのものなので、\ だけの記述はできません。\ にマッチングさせたい場合は \ と記述してください。 * \* + \+ . \. ...

デバッグ編

ソースコード内の不具合が起きている箇所を見つけたい時

ソースコードの任意の位置に

pdb.set_trace()

を書く。

プログラムを実行するとpdb.set_trace()を書いた位置までプログラムが動き、コマンドプロンプトに(pdb)と表示される。

‘n’キーを入力して、‘enter’キーを押すとソースコードが一行ずつ実行される。

不具合の箇所まで実行されるとエラーが出るので不具合の起きている場所がわかる。

もしループの処理がある場合、二度目のpdb.set_trace()が読み込まれた時は‘n’キーを押して‘enter’を押すことで再びpdb.set_trace()以下の処理を一行ずつ走らせることができる。

エラーが発生した時の処理を確認したい時

ソースコード内のエラーを起こしたい位置に

raise Exception

を書く。書いた位置でエラーを起こしてくれる。

情報取得編

セレクターのパスは合っているけど情報取得できない時

1.パスを省略してみる

パスが長い時は取得できない場合がある。

よくあるのはテーブルのデータを取得する時。tbodyやtableのセレクター名を省略することで取れることがある。

例)

#main > div > div.class_name_1 > div.class_name_2 > div > div > p > table > tbody > tl > td > span > p

で取れないけど、

#main > div > tl > td > span > p

と省略することで取得できることがある。

2.諦める(使う技術を変える)

フレームワークによっては取れないことがあるので諦めて違うフレームワークやライブラリを使うことで取得できる。

例えば、scrapyではjsで動的にDOMを変更しているwebサイトのスクレイピングを行うことはできない。

そんな時は僕はseleniumというライブラリを使って実装することで解決しています。

scrapyで重複を許してリクエストを送る場合

yield scrapy.Request(リクエストを送りたいURL, 関数, dont_filter=True)

さいごに

書き足すことが思いつき次第、本記事を更新して行こうと思います。

こんな情報を知りたい、どうやったら実装できるか分からなくて困っているなどの相談は僕にDM頂ければ嬉しいです!

twitter:sho4485935826

また、スクレイピングを行なって欲しい、リスト購入したいというご相談もDM頂ければお話させて頂けます。

次の記事ではデータ整形をする際によく使う式をまとめようかと思います。

それでは!

関連記事