
カスタムSelenium Chromedriver | ゼロコンフィグ | すべてのボット対策システムを突破 (Distil / Imperva/ Datadome / CloudFlare IUAMなど)
https://github.com/ultrafunkamsterdam/undetected-chromedriver
Distill Network / Imperva / DataDome / Botprotect.io などのアンチボットサービスを作動させない、最適化された Selenium Chromedriver パッチ ドライバのバイナリを自動的にダウンロードしてパッチを適用します。
pip install undetected-chromedriver
または、冒険心があるなら、github 経由で直接インストールしてください。```
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
イシュートラッカーに制限をかけます。長い間悪用されすぎてきました。
何か良い知らせはありますか?
はい、Undetected-Discussions を開設しました。長い目で見れば、より役立つと思います。
このパッケージはIPアドレスを隠しません。繰り返しますが、隠しません。したがって、データセンター(小規模なものでも)から実行する場合、パスできない可能性が高いです!また、自宅のIPレピュテーションが低い場合も、パスしません!
以下のコードを自宅とデータセンターから実行します。```python import undetected_chromedriver as uc driver = uc.Chrome(headless=True,use_subprocess=False) driver.get('https://nowsecure.nl') driver.save_screenshot('nowsecure.png')
<div style="display:flex;flex-direction:row">
<img src="https://assets.kitploit.com/production/public/readmes/50956/c1bde1e3621f106c2504cf4ecb9cc9015b23340c7a9bd5f20364c27016b2dd40/4f02747809c3b183c8af8238f6858540057402adfe0f26d4fa9d646091fa5781-display-v1.webp" width="720"/>
<img src="https://assets.kitploit.com/production/public/readmes/50956/ac44f4c3d408a07f4a0b96b2eb37ecc58f3a9711f32b31a642c27e96ad2ab767/c94f4da9c540b7890c9350605f085bddc730ed40073c886ff94a2475bdfe806a-display-v1.webp" width="720"/>
</div>
<!--  -->
<!--  -->
## 3.5.0 ##
- selenium 4.10 がいくつかの問題を引き起こしました。3.5.0 は互換性があり、selenium 4.9 以上に固定されています。4.9 未満はもうサポートできません。
- コンストラクタからいくつかの kwargs(service_args、service_creationflags、service_log_path)を削除しました。
- find_elements_recursive ジェネレータ関数を追加しました。これはどちらかと言えば便利関数です。多くのウェブサイトが異なるフレームから異なるコンテンツを配信しているように見えるため、find_elements を使うのが難しくなっている場合に役立ちます。
## 3.4.5 ##
- なんと一週間でした。3.4.0 で(私の考えでは)最近の自動化検出アルゴリズムの進歩にやられたと思いましたが、どうやら一部の OS では要素との対話時にエラーが発生することが判明しました。別の方法を使うために元に戻し、バグを修正し、最終的には当初のアイデアを貫くことができました(そしてバグも修正しました)
- Chrome 110 へのアップデートがまた別の驚きを引き起こしました。今回は HEADLESS ユーザー向けです。
- ヘッドレスは公式にはサポートされていませんが、パッチを適用しました!
- 嬉しいことに、ヘッドレスも現在は undetected になりました(ただし依然として非サポートです ;))
- ここで特に [@mdmintz](https://github.com/mdmintz) と [@abdulzain6](https://github.com/abdulzain6) に感謝します。
- また、issues セクション全体で完全に自発的に支援してくれた [@sebdelsol](https://github.com/sebdelsol) にも特に感謝します。あなたはすごい人ですね :)
### 3.4.0 ###
**大きなアップデートです!あなたのコードを壊す可能性があるため注意してください。**
* 変数の削除やリネームの代わりに、検出回避メカニズムを書き直しました。変数をそのまま保持しつつ、そもそも注入されないようにします。これにより、少なくとも近い将来は検出から安全でいられるでしょう。
* ファイル名の付け方を書き直しました。{randomstring}_chromedriver.exe が何千もできるのを防ぎ、代わりに undetected_chromedriver.exe という名前だけにしました。
* compat、v2 ファイルと tests フォルダを削除してクリーンアップしました。
### 3.2.0 ###
* 典型的な webdriver コードを含む例を追加しました。よくある質問への回答、落とし穴、そしてマルチスレッドを不要にするいくつかのトリックを紹介しています。
### [>>>> サンプルコードはこちら <<<<](https://github.com/ultrafunkamsterdam/undetected-chromedriver/blob/master/example/example.py)
* WebElement.click_safe() メソッドを追加しました。リンクをクリックした後に検出された場合に試すことができます。動作は保証されません。
* WebElement.children(self, tag=None, recursive=False) を追加しました。
子ノードを簡単に取得/検索するためのものです。例:
```
body = driver.find_element('tag name', 'body')
# get the 6th child (any tag) of body, and grab all img's within (recursive).
images = body.children()[6].children('img', True)
srcs = list(map(lambda _:_.attrs.get('src'), images))
```
* example.py を追加しました。馬鹿げた質問をされたときに人々を誘導できる場所として。
(いや、実際にはかなりクールです。誰もが見るべきです)
* lambda プラットフォームのサポートを追加しました。
* x86_32 のサポートを追加しました。
* linux2 と報告するシステムのサポートを追加しました。
* いくつかのリファクタリング
### 3.1.6 ###
### 今も強力に機能中 ###
- use_subprocess はデフォルトで True になりました。multiprocessing と __name__ == '__main__' を理解していない人があまりにも多いためです。テストしたところ、chrome 104+ ではもはや違いはないようです。
- no_sandbox を追加しました。デフォルトは True で、「安全でないコマンドラインを使用しています...」という煩わしいバーも表示されません。
- [Docker イメージ](https://hub.docker.com/r/ultrafunk/undetected-chromedriver)を更新しました。コンテナに VNC または RDP 接続して、実際のブラウザウィンドウを確認できるようになりました。
[](https://i.imgur.com/W7vriN9.mp4)
- もちろん、通常モードも動作します。
[](https://i.imgur.com/2qSNyuK.mp4)
### 3.1.0 ###
**このバージョンは`コードを壊すかもしれません`。更新前にテストしてください!**
- **新しい検出回避ロジックを追加しました!**
- v2 がメインモジュールになりました。これにより、v2 への参照はもう必要ありません。つまり、以下のように単純に使用できます。 ```python
import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get('https://nowsecure.nl')
後方互換性のため、v2は削除されず、メインモジュールへのエイリアスとなっています。
非Windows OSでの「ウェルカム画面」のしつこい表示を修正。ウェルカム画面を❤し、Googleにさらに多くのデータを流し込みたいナグフェチの方は、 Chrome(suppress_welcome=False) を使用してください。
コンストラクタの executable_path を廃止し、browser_executable_path を採用。
これは、カスタムChromeインストールフォルダをPATH環境変数に追加できないエッジケース(そう、あなたのことです)、
または多数の異なるブラウザ/バージョンを抱えていて自動参照が誤ったブラウザを返す場合を除き、使用すべきではありません。
「v1」(?) は当面 _compat に移動。
依存関係のバージョンを修正
ChromeOptions のカスタム処理を削除したので、webdriver.chromium.options.ChromiumOptions と互換性があります。
Chrome.get() の妙技(fu)を削除し、「ほぼ」オリジナルに復元:
with 文はもはや不要になりましたが、後方互換性のために依然として動作します。現在までのテスト成功率: 100%
読解が苦手な方もいるようなので、もう一度言います: ヘッドレスはまだWIPです。issueを立てても無駄です
プロセス生成の動作を完全にデタッチ(分離)するよう変更
.get(url) メソッドが常に contextmanager を使用するよう変更
.get(url) メソッドが内部で cdp を使用するよう変更。
... with 文はもはや必要ありません ..
TODO: 非同期化と selenium 4 への対応を進める
気後れするような何かに遭遇したときはいつでもfrom session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
the solution is simple:
import undetected_chromedriver as uc
driver = uc.Chrome( version_main = 95 ) ```
**July 2021: Currently busy implementing selenium 4 for undetected-chromedriver**
**newsflash: https://github.com/ultrafunkamsterdam/undetected-chromedriver/pull/255**
## Usage ##
To prevent unnecessary hair-pulling and issue-raising, please mind the **[important note at the end of this document](#important-note) .**
<br>
### easy ###
Literally, this is all you have to do. Settings are included and your browser executable is found automagically. This is also the snippet i
recommend using in case you experience an issue.
```python
import undetected_chromedriver as uc