Symfoware

Symfowareについての考察blog

Python mechanizeでブラウザ操作をエミュレート

ブラウザでの操作をプログラムで実行できる「mechanize」
Seleniumとの大きな違いは、

Selenium:プログラムでブラウザ自体を操作する
mechanize:ブラウザと同等の機能を持つライブラリを操作する

という感じでしょうか。
GUIを持たないOSでも実行できるのが魅力です。

PerlやRubyにも同名のモジュールがありますが、今回はPython版を使用してみます。


インストール



メインページはこちら。
http://wwwsearch.sourceforge.net/mechanize/

github
https://github.com/jjlee/mechanize


インストールは、easy_installで行いました。

$ sudo easy_install mechanize







簡単なページの読み込み



読み込み対象として、こんなhtmlページを用意しておきました。


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <title>日本語タイトルテスト</title>
  7. </head>
  8. <body>
  9.     本文です
  10. </body>
  11. </html>




このページを読み込んでみます。


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 対象のURLをオープン
  6. response = br.open('http://localhost:8080/test.html')
  7. # タイトル取得
  8. print br.title()
  9. print u'-' * 10
  10. # レスポンスヘッダー
  11. print response.info()
  12. print u'-' * 10
  13. # レスポンスの内容
  14. print response.read()




ちゃんとページの内容が取得出来ました。


日本語タイトルテスト
----------
Host: localhost:8080
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Length: 215
Content-Type: text/html; charset=utf-8

----------
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>日本語タイトルテスト</title>
</head>
<body>
    本文です
</body>
</html>







非ロボット化



サーバー側のアクセスログを見てみると、


[404]: /robots.txt - No such file or directory



というエラーログが出力されています。

デフォルトの状態だと、robots.txtを参照し、アクセス権をチェックする模様。


  1. br.set_handle_robots(False)



を追加することで、robots.txtを参照しなくなります。





リンクの取得



html中のリンクを取得してみます。
解析対象のhtmlを以下のように変更しました。


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <title>日本語タイトルテスト</title>
  7. </head>
  8. <body>
  9.     本文です
  10.     <a href="test_1_1.html">リンク1-1</a>
  11.     <a href="test_1_2.html">リンク1-2</a>
  12.     <a href="test_1_3.html">リンク1-3</a>
  13.     <a href="test_1_4.html">リンク1-4</a>
  14.     
  15.     <a href="test_2_1.html">リンク2-1</a>
  16.     <a href="test_2_2.html">リンク2-2</a>
  17.     <a href="test_2_3.html">リンク2-3</a>
  18.     <a href="test_2_4.html">リンク2-4</a>
  19. </body>
  20. </html>




プログラムは以下のようになりました。


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 非ロボット化
  6. br.set_handle_robots(False)
  7. # 対象のURLをオープン
  8. br.open('http://localhost:8080/test.html')
  9. # 最初のリンクを取得
  10. response = br.find_link()
  11. print response.url
  12. print response.text




実行結果


test_1_1.html
リンク1-1




特定の文字列が含まれるリンクを取得する場合は、
「text_regex = r"正規表現"」で指定します。

「リンク2」という文字列が含まれる最初のリンクを取得。


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 非ロボット化
  6. br.set_handle_robots(False)
  7. # 対象のURLをオープン
  8. br.open('http://localhost:8080/test.html')
  9. # 「リンク2」の最初のリンクを取得
  10. response = br.find_link(text_regex=r'リンク2')
  11. print response.url
  12. print response.text




実行結果


test_2_1.html
リンク2-1




find_linkにキーワード引数で取得するリンクの位置を指定できます。
3番目に出現するリンクを取得したい場合は、
「nr = 2」を指定します。


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 非ロボット化
  6. br.set_handle_robots(False)
  7. # 対象のURLをオープン
  8. br.open('http://localhost:8080/test.html')
  9. # 「リンク2」が含まれる3番目のリンクを取得
  10. response = br.find_link(text_regex=r'リンク2', nr=2)
  11. print response.url
  12. print response.text




実行結果


test_2_3.html
リンク2-3




リンク全てを取得するには「links」を使用します。


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 非ロボット化
  6. br.set_handle_robots(False)
  7. # 対象のURLをオープン
  8. br.open('http://localhost:8080/test.html')
  9. # リンク全てを取得
  10. for link in br.links():
  11.     print link.url, link.text




実行結果


test_1_1.html リンク1-1
test_1_2.html リンク1-2
test_1_3.html リンク1-3
test_1_4.html リンク1-4
test_2_1.html リンク2-1
test_2_2.html リンク2-2
test_2_3.html リンク2-3
test_2_4.html リンク2-4







リンク先への遷移



リンク先へページ遷移してみます。
遷移先ページがないと404エラーになるので、こんなページを用意しておきました。

・test_1_1.html


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <title>リンク先1-1</title>
  7. </head>
  8. <body>
  9.     リンク先1-1です
  10. </body>
  11. </html>




サンプル


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 非ロボット化
  6. br.set_handle_robots(False)
  7. # 対象のURLをオープン
  8. br.open('http://localhost:8080/test.html')
  9. # 遷移先のURLを探す
  10. link = br.find_link(text_regex=r'リンク1-1')
  11. # click_linkで移動
  12. response = br.follow_link(link)
  13. print br.title()
  14. print response.read()




実行結果


リンク先1-1
----------
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>リンク先1-1</title>
</head>
<body>
    リンク先1-1です
</body>
</html>




follow_linkにリンク名を指定してもOK


  1. # -*- coding:utf-8 -*-
  2. import mechanize
  3. # Browserオブジェクトを生成
  4. br = mechanize.Browser()
  5. # 非ロボット化
  6. br.set_handle_robots(False)
  7. # 対象のURLをオープン
  8. br.open('http://localhost:8080/test.html')
  9. # click_linkで移動
  10. response = br.follow_link(text_regex=r'リンク1-1')
  11. print br.title()
  12. print u'-' * 10
  13. print response.read()




今度は、ボタンのクリックについて調べていこうと思います。




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/01/23(土) 15:06:43|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python mechanizeでボタンクリック | ホーム | Python デバッグ用のSMTPサーバーを作成(SocketServer)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1825-7f265172
この記事にトラックバックする(FC2ブログユーザー)