人間っぽいふるまいをするスクレイピングを検討した話

前提:利用規約に違反しないこと 前提として利用規約に違反する行為はやめたほうが良いと考えています。 法的に訴えられても文句は言えないですし。 多くの人が利用しているamazonなども利用規約で禁止しているので、スクレイピングをする際はしっかりと利用規約を読んだうえで行ってください。許可が下りれば問題ないとは思いますが。 サイト側のスクレイピング対策 本題に入ります。 サイト側でスクレイピングを弾く設定がいくつか存在します。例えばユーザーっぽくないふるまいでサイトにアクセスした場合。あるいは特定のサイトを経由しないと見れないURLに直接アクセスした場合。ゆうまでもなく連続でいろんなURLにアクセスした場合。 連続でアクセスされるとサーバーに負荷がかかるので、これが弾かれるのは想像に難くないと思います。 スクレイピング対策を避ける方法 ただ、スクレイピングするされた場合、上記のような特徴が存在します。 この辺はアクセスログを監視すると見れるかと思います。おそらくですが。 では人間っぽくふるまうにはどうしたらよいか調べた中で書いてみます。 一応言語はpythonを使います。他の言語でもできるかと思うので参考程度にはなるかと思います。 Pythonでのスクレイピング基礎 一般的にpythonでのスクレイピングではrequestsモジュールを使います。他にもseleniumやpyppeteerなどがありますが、一旦requestsを使っていきます。 インストールはpipを使います。 pip install requests もしpythonのバージョンなどで分けてる場合はこちら py -3.12 -m pip install requests インストールが終わったらアクセスしてみましょう。今回は私のサイトにアクセスしてみます。 import requests response = requests.get('https://xainome.blog/’) print(response.text) こうするとHTMLの中身を取得することができます。 そこから取得したい情報があればBeautifulSoupを使って要素を取り出してみましょう。まずはインストール pip install beautifulsoup4 実際のアクセスとHTMLの解析 インストールができたらHTMLを解析します。 from bs4 import BeautifulSoup soup = BeautifulSoup(html_parse, 'html.parser') これで解析の準備ができました。解析の話は本題とそれますのでここまでにしようと思います。 解析やHTMLの情報取得に興味があれば調べてもいいですし、生成AIに聞いてみるでもいいと思います。このようなコード、銘柄、市場などが一覧で取得することができます。もちろんAPIを使うという手もありますが。 リクエストヘッダーの設定 実は通常のリクエストを送る場合ユーザーではなく、言語別のリクエストを送っていることになります。 リクエストにはRequests Headersというものが設定できます。これは私たちがPCやスマホでサイトにアクセスするときも送信されています。 まずは設定してみます。 headers = { 'User-agent' = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36' } response = requests.get(search_url, headers=headers) こんな感じで設定します。特に何も設定しなかった場合、‘python-requests/2.25.1’という設定で送られるみたいです。恐らくjsやGoとかでも似たような設定になるかと思います。 ...

2024年8月30日

pythonの仮想環境構築をいくつかやったので使ってみた感想を書く

前回の続きになります。 前回は仮想環境が必要なの?というテーマで書いてみましたが、とはいえ使えるに越したことはないので実際に試してみて使った感想を残そうと思います。 今回仮想環境を構築するにあたって試してみたのは以下 pip venv pyenv(環境的に使えなかった) pipenv poetry docker(環境的に使えなかった) Rye(環境的に使えなかった) 一応ざっくりと説明すると ライブラリのインストール:pip、pipenv、poetry 仮想環境の構築:venv、pipenv、poetry、docker pythonのバージョン管理:pyenv、docker 一般的に組み合わせとしては pip + venv + pyenv pipenv + pyenv poetry + pyenv docker + pipenv あたりだと思います。私も依存関係とかは詳しくないのでそうなんだという認識ですが… まずは “pip” 、pythonユーザーであれば皆さん使用してるので説明は省きますが、標準ライブラリで馴染みがあるものですね。 次は “venv” 、昔はvertialenvが使われていたみたいですがそれが標準ライブラリになったものです。vertialenvとは別物ですが使い方は同じですね。 仮想環境の作成や有効化ができ、標準ライブラリなので様々な教材でも使用されると思います。有効化に面倒な設定があったり、自動化やライブラリ一覧の出力にも手間がかかるので少し使いにくいですが、覚えておいた方がいいですね。vscode使うならインタープリターの選択で有効化できますが… 次は “pyenv” です。私の環境ではシステム環境変数をいじれないので使えませんでした。 pythonのバージョンがインストールできず、localやglobalの設定もできない状況でした。使えなくて残念ですが、vscodeのインタープリターで選択すれば問題ないのでいいかと あるいはユーザー環境変数で任意のpythonバージョンのPATHを上に移動させるとかですかね。 次は “pipenv"です。こちらはライブラリのインストールと環境変数の作成が一体化した便利なライブラリになっています。 個人的には一番使いやすく感じました。仮想環境構築のしやすさ、ライブラリ一覧の自動化は便利だなと感じました。制限がなければ “pipenv + pythonのバージョン管理” が一番楽な気はします。 ただ、インストールの遅さや抱えてる問題もあるみたいなのでpipenvさえあればいいとは思いませんが、優先度は高いというイメージですね。 次は “poetry” です。使う用途としては"pipenv"と同じですが、異なる点で言うとPyPIにビルド・公開ができるという点になります。 PyPIにビルド・公開することはあまりないので、そうなるとpipenvとの使いやすさを比べてどうか?ということになりますが、使いやすさはpipenvに軍配が上がります。 まず、poetryはpython3.9以上でしか使用できません。今の現場はpython3.7(いつか3.11になる予定)なので使えなかったりします。また、ライブラリのバージョンでも同様に使えないものがあります。 他にも仮想環境の有効化がvenvと同様手間がかかったり、vscodeのインタープリター選択画面に出なかったのでパスを通す設定をしないといけないなどがあったりして使いにくさを感じました。私の環境構築方法に問題があるかもしれませんが… おまけとしてRyeはチームよりも個人開発向けなのでやろうとしたのですが、客先PCでは使わないほうがよさそうです。個人で触ってみようとは思います。 それからDockerです。Desktop版をインストールしようとしましたがダメでした。とはいえAWSの実行ではdockerコンテナを利用しているので、ローカルでは使えませんが開発や本番環境では使われているのでdockerfileの中身やdocker-composeをチェックしてみます。ローカルだとどんな使いやすさなんですかね? 前にも話したんですが、pythonやライブラリのバージョンが固定されているような現場では正直不要だとは思いますが、知っておいて損はないかと思いますし、知識はどこかで役立つと思います。 手軽で使いやすいという点では “pipenv” > “poetry” >= “pip + venv"に"pyenv"を足したものかと思いますが、覚え順としては"pip + venv” > “pipenv” > “poetry” がいいと思います。ついでにDockerまで使えればほぼ問題ないという印象です。 ...

2024年3月8日

常駐先のPCでPythonの仮想環境構築って必要なの?

たまには自身の仕事の環境のことでも話をしてみるのもいいかと思って記事にしました。ただ自身の疑問や考えを整理するために書いてるので、大したことは書かないかと思います。人間っぽくていいなと思います。 大前提としてpythonの仮想環境構築について知っておくに越したことはないと思います。客先に派遣される業態ではいつ使うかわかりませんし、自社開発でもライブラリの更新をした方がセキュリティ面でも安心できると思うので、安定板と更新版で使い分けができそうです。 さて、最近新PCに移行することになりました。前のPCでは仮想環境を使ってこなかったので、これを機に仮想環境について調べこの記事を書くことにしました。仮想環境で何を使ったかはあまり触れないと思います。 私の現場では客先常駐ではないですが、お客様先から配布されたPCを使って開発を行います。スペックは特段低いわけではないので、重たい処理や大量のデータを扱わなければ問題ない程度です。ちなみにWindowsです。 ただお客様先から配布されたPCなのでセキュリティは固めです。実はpyenvを使おうとしたのですがインストールがうまくいかずpythonバージョンの使い分けができませんでした。 他にもDocker Desktopをインストールしようとしましたがこちらも無理でした。申請すれば通るかもしれないですが、他にも方法はありますので一旦諦めました。ちなみにWinMerge(ファイル同士の比較)もインストールできませんでした。前のPCは標準搭載だったのですが… ここから本題なのですが、仮想環境を作る必要があるのか?ライブラリの管理をする必要があるのか?という問題です。もちろん客先によっては自由度が高いところもあるので一概には不要だとは思いません。 私の話になりますが、本番環境ではAWSを使っています。開発環境もありますがスコアリングのみであればローカルでvscodeを使用しています。 AWSではDockerfileでpythonとライブラリのバージョンを指定して実行しているのですが、そのバージョンが全てのプロジェクトで統一されています。pythonのバージョンであれば3.7.12、pandasであれば1.12.0という具合です。 こうなるとローカルでも使用するpythonやライブラリのバージョンは固定されるので、仮想環境の構築は不要でとりあえずpipでインストールしてしまえばいい気もします。requirements.txtに吐き出していまえば他の人にも共有できて同じ環境が作れますし… 整理してみましたがやはり不要な気がします。とは言え仮想環境構築で使ったvenvとpyenv(ほぼインストールのみですが…)の使い方もわかりましたし、他のライブラリであるpipenvやPoetryも触ってみようと思います。 次に話すとしたら実際に仮想環境構築したことかAWSについてですかね?ではでは

2024年3月6日