スクレイピングしたときにハマったことと解決策PythonSeleniumスクレイピングproxyPython3はじめにタイトルのとおりの変なことをしようとして色々ハマり、調べて解決したのでまとめておきます。PyPIに従ってやっていきましょう。要約すると以下のとおりです。webdriver.Firefox()browser.get('http://seleniumhq.org/')たったこれだけなのにハマりました。解決:Firefoxを入れる今確認できず正確なメッセージが記載できませんが、capabilities云々のエラーが出ました。webdriverのドキュメントを読むと以下の記述がありました。解決:headlessモードで動かせば良いスクレイピングを行うマシンはサーバとしてセットアップしていて、デスクトップ環境を入れたくありませんでした。調べたところ、最終的にはFirefoxをheadlessモードで動作させればよいということがわかりました。headlessモードにする方法も色々あるようですが、本記事の環境では以下のとおりです。process"といったようなエラーメッセージが出ていました。調べても解決しませんでしたが、ふとgeckodriver.logに気づき見ると以下のようなログが出ていました。directory実は、Firefoxをパッケージマネージャでインストールすると依存が多いのが嫌で、webサイトからアーカイブをダウンロードしていました。そのため依存ライブラリが入っていませんでした。本記事の環境ではgtk3とlibXtをインストールして解決しました。解決:quit()サンプルコードを何度も動かしていたらなんだかマシンが重くなってきました。firefoxするとなかなかの数がヒットしました。これは明示的に終了させなければなりません。解決:プロファイルを使うプロキシ設定は、どこにどう設定するのか、バリエーションが多すぎます。どこにwebdriver.Firefox()のproxyキーワード引数OptionsのproxyプロパティFirefoxProfileのset_proxy()メソッドProxy.add_to_capabilities()してcapabilitiesをwebdriver.Firefox()に渡すどうプロパティに直接host:port文字列を渡すProxyインスタンスを作るhttpProxyにsocks5://host:portを渡すsocksProxyにhost:portを渡す試行錯誤の末、以下のようにして設定できました。Firefox(firefox_profile=profile)ちなみにset_proxy()の呼び出しで以下のように怒られます。profile.set_proxy(proxy)それで動かんかったからこうしとんのじゃ。プロファイルを使う結局、プロファイルとはFirefoxの設定を含んでいて、Firefoxは設定でsocksプロキシに名前解決させるかどうかを決定できるので、プロファイルを直接いじる1しかありません。「socksプロキシに名前解決させるかどうか」はどういうキーなのか。調べたところこんなページに当たりました。これによると、network.proxy.socks_remote_dnsだそうです。get_property('textContent')を使うtextプロパティでは空文字列が返ります。要素の下にテキスト要素があるという構造なのかもしれませんが、WebElementには「idなどを何も指定せず、子要素を取得する」というメソッドがないため、アクセス不能です。get_property()メソッドでDOMプロパティが取得できるのでこれを使います。テキストはtextContentプロパティで取れます。innerTextでも大丈夫かと思います。終わりにselenium周りはseleniumライブラリ以外にもWebドライバ・ブラウザ・OS等環境要因が色々あり、更にそれぞれのバージョンで互換性があったりなかったりするので混乱しました。様々な言語のバインディングがあるのも調べづらさに拍車をかけていると思います。それだけ人気のプロジェクトであるということだとは思うのですが......。upLoginユーザーは見つかりませんでした。