お久しぶりです【Scraping高速化】
又もご無沙汰ですね。
中々更新できず、すみません<(_ _)>
現在、NARレース情報スクレイピングのデバックに励んでおります。
しかし問題が多いこと。。。
先ずpd.read_htmlの採取方法として、Butifulsoupを使用するにあたり
もっとも簡単オプションとして"lxml"が良いか?
時間が掛かっても"html5lib"が良いのか?
果て又、デファクトな"html.parser"が良いのか??
などなどをしていたらトンデモなく時間が掛かってしまいました。
これはスクレイピング高速化に対する受け売りな、"lxml"使用だと必要なテーブル情報取得がすっ飛ばされたりして、言うほど使用に堪えられなかったという肌感があります。
まぁ"lxml"では少なくともNAR版にて、せっかくのスクレイプしたデータに欠損が出るという事です(苦笑)
何だかんだで速ければ良いってものじゃない訳です。
なら、"html5lib"か?というとこれも逆に難解になって、タプルポイントがズレたりするなど、使用に堪えられませんでした。
残ったのが、最も初歩的な"html.parser"で、結局これが一択でした。
これで欠損せずにテーブル情報取得ができるようです。
それよりも問題であったのが、NARのスクレイピングってデータが多すぎて本当に実行中で処理落ちが多発することでした。。。
処理落ちするというのは、即ちスクレイピングが失敗するという事です。
これじゃ幾ら時間を掛けてデータ取得に努力していようが意味がありません。。。
そのため、以下スクレイプ方法で様々な対応策を施行しました。
・負荷に対するtimewaitを長くする→結果的には失敗で堂々巡り。
・採取期間を細切れに短くする→ある程度は有効、しかし時間掛かる
根本原因は修正不可能。
・DNSの変更→これは効果絶大、リクエストに対して1/2程度にレスポンスが
短縮。
それでもスクレイピングに対する終了時間は泣きたくなるほどの時間が掛かってしまいます。
恐らく処理落ちはリクエストタイムアウトが原因であると思った(ホストのポリシーにもよるけどDDoSに間違われるとかの節もある)ので、DNS変更はかなりの時短となった模様です。
さて、次に構造的な時短策について。
pythonはそもそもインタプリタ言語ですしね。
ソースコード中のループを含めたアノテーションを改変する必要もありますが、今後そういったボトルネックへの施策(Numpyは元より、C/C++にコンパイルできるCythonを使うなど)をするべきかもしれません。
pandas使用のスクレイピングには、時短やタイムアウト対策のために予めhtmlデータ丸っと保存してそれをスクレイピングする手段を取っております。
→他の方もこの手法を使用しているようですね。
ここで処理落ち多発で前述の施策を使ったという事です。
もう一つのスクレイピングでは、htmlは取らず使い捨てでrequestsなどを利用してurlからスクレイプする手段も併用していますが、、これも時機に変更しようと思っています。
今現在は複合作戦を活かすしかないのですけどね。
後はデータ編集のソースコードを追加したりとか。
そんな感じです。
今の所、処理落ちさえ気にしていれば何とか必要なデータを取得することは出来そうな感じです。
こんな試行錯誤をしつつ、解りにくい専門用語列挙で申し訳ありません。
けれど、これだけの問題が噴出するわけです。
既存コードをそのまま流用・使用して行き詰って放置するなど、とてもとてもするべきでないです。
処理落ちして、結局行き詰まり諦めてスクレイピングするのを止めたなんてことも多いのではないでしょうか?
従って、決して諦めずに勉強するのは大事なことだと改めて思いました。
あと、使用するDNSって本当に大事です!!!(苦笑)
ここで一つご注意です。
正解となる設定やコードを表記することについて、申し訳ありませんが私は公表致しません<(_ _)>
前の投稿で申している通り、ヒントのみの提起となります。
試行錯誤と言うのはコード構造を理解するには必須事項だと経験上思いますので、それには一番に「検索力を養う」事が重要なのです。
あくまでも今後にも長く使えるスキルとするには、という仮定に基づいての私的な意見です。
意地悪やケチ臭いと思われると思いますが、ここは大変でしょうけど検索力を頑張りましょう。
コーディングに対する理解力が無い状態で、無償で知見が一瞬で手に入るというのは、今後に起こるであろうトラブルシュートになりません。。。
表現の仕方が難しいので文言が足りないところもあると思いますが、叩かれたり炎上は仕方ないと思いつつ、ここは敢えて。
因みにJRA版はNAR版の下位互換と言っていいので、ここをクリアすれば導入が物凄く楽なのです!!
あとは、、Windowsは最近AI実装が烈しいのでCopilot使っていこうかな?何か面白そうです。
それでは、データ揃い次第で又です!!