PythonでMechanicalSoupを用いてリンクを辿ってみます。
今回はMechanicalSoupを用います。このライブラリ・モジュールは、Pythonの標準ライブラリではありませんので、事前にインストールする必要があります。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)
■MechanicalSoupを用いてリンクを辿る
それでは早速、MechanicalSoupを用いてリンクを辿るスクリプトを書いていきます。
■コード
import mechanicalsoup browser = mechanicalsoup.StatefulBrowser() browser.open("https://laboratory.kazuuu.net/") browser.follow_link("お問い合わせ・相談") print(browser.url)
importでmechanicalsoupモジュールを呼び出します。その後、browserという変数を定義し、その中でmechanicalsoup.StatefulBrowser()を用いて、ブラウザオブジェクトを作成。
作成後、open()を用いて括弧内にWebページを渡します。これで指定したWebページを開くことができます。今回は、当サイト(https://laboratory.kazuuu.net/)を指定しています。
指定後、follow_link()を用いて括弧内に日本語のテキストを渡し、一致するリンクを辿ってみます。
最後に、browser.url()を用いて辿った後のURLをprint()で出力してみます。
■実行・検証
このスクリプトを「web_dialogue.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
Traceback (most recent call last): File "web_dialogue.py", line 7, in browser.follow_link("お問い合わせ・相談") File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\mechanicalsoup\stateful_browser.py", line 354, in follow_link link = self._find_link_internal(link, bs4_args, File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\mechanicalsoup\stateful_browser.py", line 324, in _find_link_internal return self.find_link(*args, **kwargs) File "C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\mechanicalsoup\stateful_browser.py", line 298, in find_link raise LinkNotFoundError() mechanicalsoup.utils.LinkNotFoundError
実行してみると、「mechanicalsoup.utils.LinkNotFoundError」というエラーが発生し、リンクを辿ることができませんでした。原因を探ってみると、MechanicalSoupのドキュメントでは、「Form のメソッドが、間違った型(または不正な型)の HTML 要素に対して使用された場合に発生します。」という内容が書かれていたので、スクリプトを変更してみることにしました。
■コード
import mechanicalsoup browser = mechanicalsoup.StatefulBrowser() browser.open("https://laboratory.kazuuu.net/") browser.follow_link("inquiry-form") print(browser.url)
変更した内容は、follow_link()を用いる時に日本語のテキストではなく、開いたWebページ内のURLに含まれる英文字を一致させ、一致した場合にリンクを辿るというものです。
■再度検証
変更したスクリプトを「web_dialogue.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると、今度はエラーは発生せずに、follow_link()を用いたことで、指定されたテキストと一致するリンクを辿り、辿った後のURLをprint()関数で出力させることができました。
コメント