のほほんのおと

IT系、音楽、映画、旅行などなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Python】PythonとライブラリmechanizeでWEBスパイダリング/スクレイピング

PythonでWEBスパイダリング/スクレイピング用のライブラリ「mechanize」というものをインストールし、動作確認するまでを整理してみます。

スパイダリング/スクレイピングというのは要するにWEBサイトをうろつき回り、WEBページ中の情報で必要なところを切り出してくる、といったものです。
WEB APIが用意されてないようなサイトからプログラムでデータを得る時は、WEBページのHTMLソースを解析し、必要な文字列等を抽出する、というわけです。

「 環境 」

ここで今回やった時の環境について。

Windows7 64bit
Python 2.7

Pythonのバージョンには注意です。
最初、3.X系でやろうとしたのですがうまく行かず、結局2.7を入れました。

「 手順概要 」

これからやる作業は以下です。
  1. EasyInstallのインストール
  2. Mechanizeのインストール
  3. 実験
「 EasyInstallのインストール 」

MechanizeのインストールにEasyInstallを使うのですが、入ってなかったので。

以下へ。

http://peak.telecommunity.com/dist/


以下を落とします。
ez_setup.py

ez_setup.pyをPythonインストールディレクトリ下にコピーします。
以下、例です。
C:\Software\Python27\
ez_setup.py

あとはez_setup.pyを実行するだけです。
以下、実行例。
C:\Software\Python27>python ez_setup.py
Downloading http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
Processing setuptools-0.6c11-py2.7.egg
Copying setuptools-0.6c11-py2.7.egg to c:\software\python27\lib\site-packages
Adding setuptools 0.6c11 to easy-install.pth file
Installing easy_install-script.py script to C:\Software\Python27\Scripts
Installing easy_install.exe script to C:\Software\Python27\Scripts
Installing easy_install.exe.manifest script to C:\Software\Python27\Scripts
Installing easy_install-2.7-script.py script to C:\Software\Python27\Scripts
Installing easy_install-2.7.exe script to C:\Software\Python27\Scripts
Installing easy_install-2.7.exe.manifest script to C:\Software\Python27\Scripts

Installed c:\software\python27\lib\site-packages\setuptools-0.6c11-py2.7.egg
Processing dependencies for setuptools==0.6c11
Finished processing dependencies for setuptools==0.6c11

C:\Software\Python27>

以下のようにインストールされていることが確認できます。
C:\Software\Python27>dir scripts
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 940C-02E6 です

 C:\Software\Python27\scripts のディレクトリ

2011/11/17  23:53    <DIR>          .
2011/11/17  23:53    <DIR>          ..
2011/11/17  23:53               316 easy_install-2.7-script.py
2011/11/17  23:53             7,168 easy_install-2.7.exe
2011/11/17  23:53               531 easy_install-2.7.exe.manifest
2011/11/17  23:53               308 easy_install-script.py
2011/11/17  23:53             7,168 easy_install.exe
2011/11/17  23:53               527 easy_install.exe.manifest
               6 個のファイル              16,018 バイト
               2 個のディレクトリ  120,230,211,584 バイトの空き領域

C:\Software\Python27>

「 Mechanizeのインストール 」

EasyInstallのあるディレクトリ「Scripts」まで移動してから以下でインストールします。
easy_install mechanize

以下、実行例。
C:\Software\Python27\Scripts>easy_install mechanize
Searching for mechanize
Reading http://pypi.python.org/simple/mechanize/
Reading http://wwwsearch.sourceforge.net/mechanize/
Best match: mechanize 0.2.5
Downloading http://pypi.python.org/packages/source/m/mechanize/mechanize-0.2.5.tar.gz
Processing mechanize-0.2.5.tar.gz
Running mechanize-0.2.5\setup.py -q bdist_egg --dist-dir c:\users\yosi\appdata\local\temp\easy_install-3dsj4w\mechanize-0.2.5\egg-dist-tmp-nt82uk
warning: no files found matching 'output' under directory 'test\functional_tests_golden'
Adding mechanize 0.2.5 to easy-install.pth file

Installed c:\software\python27\lib\site-packages\mechanize-0.2.5-py2.7.egg
Processing dependencies for mechanize
Finished processing dependencies for mechanize

C:\Software\Python27\Scripts>


以下のようにmechanizeのライブラリが入ったことが確認できます。

C:\Software\Python27\Lib\site-packages\
mechanize-0.2.5-py2.7.egg

「 実験 」

ここではGoogleへのアクセスを試してみます。
Googleのトップぺージにアクセスし、タイトル表示とページ中のリンクを全て表示しています。
Pythonのコマンドラインで対話的に実行しました。

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> from mechanize import Browser
>>> br = Browser()
>>> br.open('http://www.google.com/')
<response_seek_wrapper at 0x2a50580 whose wrapped object = <closeable_response at 0x2a50288 whose fp = <socket._fileobject object at 0x02A47AF0>>>
>>> br.title()
'Google'
>>> for i in br.links():
...     print i
...
Link(base_url='http://www.google.co.jp/', url='http://www.google.co.jp/imghp?hl=ja&tab=wi', text='\x89\xe6\x91\x9c', tag='a', attrs=[('class', 'gb1'), ('href','http://www.google.co.jp/imghp?hl=ja&tab=wi')])
Link(base_url='http://www.google.co.jp/', url='http://video.google.co.jp/?hl=ja&tab=wv', text='\x93\xae\x89\xe6', tag='a', attrs=[('class', 'gb1'), ('href', 'http://video.google.co.jp/?hl=ja&tab=wv')])
Link(base_url='http://www.google.co.jp/', url='http://maps.google.co.jp/maps?hl=ja&tab=wl', text='\x92n\x90}', tag='a', attrs=[('class', 'gb1'), ('href', 'http://maps.google.co.jp/maps?hl=ja&tab=wl')])
Link(base_url='http://www.google.co.jp/', url='http://news.google.co.jp/nwshp?hl=ja&tab=wn', text='\x83j\x83\x85\x81[\x83X', tag='a', attrs=[('class', 'gb1'), ('href', 'http://news.google.co.jp/nwshp?hl=ja&tab=wn')])
Link(base_url='http://www.google.co.jp/', url='http://www.google.co.jp/prdhp?hl=ja&tab=wf', text='\x83V\x83\x87\x83b\x83s\x83\x93\x83O', tag='a', attrs=[('class', 'gb1'), ('href', 'http://www.google.co.jp/prdhp?hl=ja&tab=wf')])
Link(base_url='http://www.google.co.jp/', url='https://mail.google.com/mail/?tab=wm', text='Gmail', tag='a', attrs=[('class', 'gb1'), ('href', 'https://mail.google.com/mail/?tab=wm')])
Link(base_url='http://www.google.co.jp/', url='http://www.google.co.jp/intl/ja/options/', text='\x82\xe0\x82\xc1\x82\xc6\x8c\xa9\x82\xe9 &raquo;', tag='a', attrs=[('class', 'gb1'), ('style', 'text-decoration:none'), ('href', 'http://www.google.co.jp/intl/ja/options/')])
Link(base_url='http://www.google.co.jp/', url='/url?sa=p&pref=ig&pval=3&q=http://www.google.co.jp/ig%3Fhl%3Dja%26source%3Diglk&usg=AFQjCNEmQuNg1ivauCid9lXp5yYSx6AHXw', text='iGoogle', tag='a', attrs=[('href', '/url?sa=p&pref=ig&pval=3&q=http://www.google.co.jp/ig%3Fhl%3Dja%26source%3Diglk&usg=AFQjCNEmQuNg1ivauCid9lXp5yYSx6AHXw'), ('class', 'gb4')])
Link(base_url='http://www.google.co.jp/', url='http://www.google.com/history/optout?hl=ja', text='\x83E\x83F\x83u\x97\x9a\x97\xf0', tag='a', attrs=[('href', 'http://www.google.com/history/optout?hl=ja'), ('class', 'gb4')])
Link(base_url='http://www.google.co.jp/', url='/preferences?hl=ja', text='\x90\xdd\x92\xe8', tag='a', attrs=[('href', '/preferences?hl=ja'), ('class', 'gb4')])
Link(base_url='http://www.google.co.jp/', url='https://accounts.google.com/ServiceLogin?hl=ja&continue=http://www.google.co.jp/', text='\x83\x8d\x83O\x83C\x83\x93', tag='a', attrs=[('id', 'gb_70'), ('href', 'https://accounts.google.com/ServiceLogin?hl=ja&continue=http://www.google.co.jp/'), ('class', 'gb4')])
Link(base_url='http://www.google.co.jp/', url='/advanced_search?hl=ja', text='\x8c\x9f\x8d\xf5\x83I\x83v\x83V\x83\x87\x83\x93', tag='a', attrs=[('href', '/advanced_search?hl=ja')])
Link(base_url='http://www.google.co.jp/', url='/language_tools?hl=ja', text='\x8c\xbe\x8c\xea\x83c\x81[\x83\x8b', tag='a', attrs=[('href', '/language_tools?hl=ja')])
Link(base_url='http://www.google.co.jp/', url='/intl/ja/ads/', text='\x8dL\x8d\x90\x8cf\x8d\xda', tag='a', attrs=[('href', '/intl/ja/ads/')])
Link(base_url='http://www.google.co.jp/', url='http://www.google.co.jp/intl/ja/services/', text='\x83r\x83W\x83l\x83X \x83\\\x83\x8a\x83\x85\x81[\x83V\x83\x87\x83\x93', tag='a', attrs=[('href', 'http://www.google.co.jp/intl/ja/services/')])
Link(base_url='http://www.google.co.jp/', url='/intl/ja/about.html', text='Google \x82\xc9\x82\xc2\x82\xa2\x82\xc4', tag='a', attrs=[('href', '/intl/ja/about.html')])
Link(base_url='http://www.google.co.jp/', url='http://www.google.com/ncr', text='Google.com in English', tag='a', attrs=[('href', 'http://www.google.com/ncr'),('class', 'gl nobr')])
Link(base_url='http://www.google.co.jp/', url='/intl/ja/privacy.html', text='\x83v\x83\x89\x83C\x83o\x83V\x81[', tag='a', attrs=[('href', '/intl/ja/privacy.html')])
>>>

おしまい








スポンサーサイト

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

【Python】スクリプトをPyInstallerでフローズンバイナリ化(EXEファイル化)

PythonスクリプトをWindowsのEXEファイル形式にする方法を調べてみたので整理してみました。

Python使いじゃない人に自作スクリプトを使ってもらうにはどうしてもこういうのが必要になりますね。
面倒臭いなぁと思っていたのですが、やってみたらそれほどでもありませんでした。
先人達に多謝多謝。

ちなみにこういうのを「フローズンバイナリ」と言うらしいですね。
でも一般的じゃない気がするので「EXE化」としておきます。

「 方法選定 」

EXE化の方法としては幾つか見つかりました。
  • py2exe
  • cx_Freeze
  • PyInstaller
py2exeが一番情報がありましたが、今回はPyInstallerを使うことにしました。
要件として「EXEファイル1つにしたい」というのがあったのですが、py2exeではできないようだからです。

「 環境 」

ここで今回やった時の環境について。
Windows7 64bit
Python 2.7
Pythonのバージョンには注意です。
最初、3.X系でやろうとしたのですがうまく行かず、結局2.7を入れました。

今回EXE化するのは自作の以下のスクリプトです。
CybozeMailDL.py
グループウェア「サイボウズ」のメールをダウンロードするツールです。これについてはまた別で。

「 PyInstallerインストール 」

以下へ。
www.pyinstaller.org/

以下のstable release版を落とす。
pyinstaller-1.5.1.zip

解凍してできたフォルダを以下へ移動。
C:\Software\pyinstaller-1.5.1

本当はこのPyInstallerへのPATHを通した方がいいのかもしれませんが、やりませんでした。
Pythonにも通してない環境です。

「 手順概要 」

これからやる作業は以下です。
  1. 対象スクリプト準備
      対象スクリプトはPyInstallerのインストールフォルダ下に置きます。
  2. 初期コンフィグ
      PyInstallerをインストール後、1回だけやる作業です。
  3. specファイル作成
  4. EXE化
  5. 確認
「 作業 」

1. 対象スクリプト準備

対象スクリプトはPyInstallerのインストールフォルダ下に置きます。
C:\Software\pyinstaller-1.5.1\
CybozeMailDL.py

2. 初期コンフィグ
PyInstallerをインストール後、1回だけやる作業です。
C:\Software\pyinstaller-1.5.1>C:\Software\Python27\python.exe Configure.py
I: computing EXE_dependencies
I: Finding TCL/TK...
W: library coredll.dll required via ctypes not found
I: Analyzing C:\Software\Python27\DLLs\_tkinter.pyd
    :中略
I: could not find TCL/TK
I: testing for Zlib...
I: ... Zlib available
I: Testing for ability to set icons, version resources...
I: ... resource update available
I: Testing for Unicode support...
I: ... Unicode available
I: testing for UPX...
I: ...UPX unavailable
I: computing PYZ dependencies...
I: done generating config.dat

C:\Software\pyinstaller-1.5.1>

以下のようにWarningっぽいのが一つ出てしまいましたが、エラーではないみたいなのでほっときます。
W: library coredll.dll required via ctypes not found

なお、このとき私の環境でははじめ以下のエラーになりました。
C:\Software\pyinstaller-1.5.1>C:\Software\Python27\python.exe Configure.py
ERROR: Python 2.6+ on Windows support needs pywin32
Please install http://sourceforge.net/projects/pywin32/

C:\Software\pyinstaller-1.5.1>

ということで、pywin32を以下から入手し、インストールしてあります。
sourceforge.net/projects/pywin32/
Python for Windows extensions

3. specファイル作成


specファイルを作成します。
このときオプション-Fをつけることで、1つのEXEファイルにすることができます。

C:\Software\pyinstaller-1.5.1>C:\Software\Python27\python.exe Makespec.py -F CybozeMailDL.py
wrote C:\Software\pyinstaller-1.5.1\CybozeMailDL\CybozeMailDL.spec
now run Build.py to build the executable

C:\Software\pyinstaller-1.5.1>

specファイルは以下のよう にCybozeMailDL というフォルダが作られ、その下にできています。
C:\Software\pyinstaller-1.5.1>dir .\CybozeMailDL\
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 940C-02E6 です

 C:\Software\pyinstaller-1.5.1\CybozeMailDL のディレクトリ

2011/11/23  16:56    <DIR>          .
2011/11/23  16:56    <DIR>          ..
2011/11/23  16:56               492 CybozeMailDL.spec
               1 個のファイル                 492 バイト
               2 個のディレクトリ  120,157,540,352 バイトの空き領域

C:\Software\pyinstaller-1.5.1>

4. EXE化

いよいよEXEファイル化です。

C:\Software\pyinstaller-1.5.1>C:\Software\Python27\python.exe  Build.py .\CybozeMailDL\CybozeMailDL.spec
I: Dependent assemblies of C:\Software\Python27\python.exe:
I: x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none
checking Analysis
building Analysis because outAnalysis0.toc non existent
running Analysis outAnalysis0.toc
Analyzing: support\_mountzlib.py
Analyzing: support\useUnicode.py
Analyzing: CybozeMailDL.py
I: Analyzing C:\Software\Python27\python.exe
I: Dependent assemblies of C:\Software\Python27\python.exe:
    :中略
I: Analyzing C:\Software\Python27\DLLs\sqlite3.dll
I: Skipping KERNEL32.dll dependency of sqlite3.dll
Warnings written to .\CybozeMailDL\warnCybozeMailDL.txt
checking PYZ
rebuilding outPYZ1.toc because outPYZ1.pyz is missing
building PYZ outPYZ1.toc
checking PKG
rebuilding outPKG3.toc because outPKG3.pkg is missing
building PKG outPKG3.pkg
checking EXE
rebuilding outEXE2.toc because CybozeMailDL.exe missing
building EXE from outEXE2.toc
Appending archive to EXE .\CybozeMailDL\dist\CybozeMailDL.exe

C:\Software\pyinstaller-1.5.1>

5. 確認

以下のようにCybozeMailDLフォルダの下に更にdistフォルダが掘られ、EXEファイルができていることが確認できます。
ちなみにspecファイルを作る際に-Fオプションをつけなかった場合はここにEXE以外に色々なファイル、フォルダがぞろぞろとできています。
その場合、distフォルダ丸ごと配布、という形になるようです。

C:\Software\pyinstaller-1.5.1>dir C:\Software\pyinstaller-1.5.1\CybozeMailDL\dist\
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 940C-02E6 です

 C:\Software\pyinstaller-1.5.1\CybozeMailDL\dist のディレクトリ

2011/11/23  16:58    <DIR>          .
2011/11/23  16:58    <DIR>          ..
2011/11/23  16:58         4,362,585 CybozeMailDL.exe
               1 個のファイル           4,362,585 バイト
               2 個のディレクトリ  120,144,654,336 バイトの空き領域

C:\Software\pyinstaller-1.5.1>

あとはこのできたEXEをどこか全く関係ないフォルダや別PCにコピーして試してみましょう。
こんだけです。

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

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。