virtualenvのすすめ
参考書などを読みながら、Pythonのプログラミングを進めていくと
知らぬ間によくわからないパッケージがインストールしてあったりします。
プロジェクトごとにパッケージを管理したいな~なんて思うこともあるでしょう。
また現在はPython3以上でプロジェクトを立ち上げることが一般的ですが、
Python2.7など、特定のバージョンでないと動かないパッケージがあったりします。
1台のサーバー内で、プロジェクト毎にPythonのバージョンを切り分けられたらいいですよね。
そんなとき、オススメしたいのが「virtualenv」です。
virtualenvを利用すると、プロジェクト毎(ディレクトリ毎)にPyhtonの環境管理が構築できます。
はじめにpipを利用してvirtualenvをインストールしましょう。
$ pip install virtualenv
インストールが完了したら、プロジェクトのディレクトリを作成しましょう
今回はScrapyのプロジェクトを作ることを仮定して進めてみます。
Pythonのバージョンは2.7を利用します。
scrapy用のディレクトリを作成
$ mkdir scrapy
ディレクトリ内に移動
$ cd scrapy
Python2.7 の環境を、ENV という名前で作成します。
ENVの名前は管理しやすい任意の文字列で構いません。
$ virtualenv -p python2.7 ENV
ENVのディレクトリが作成されたか確認してみましょう。
ls -al
こんな感じでENVディレクトリが作られていればOKです。
drwxrwxr-x 3 user user 4096 Sep 2 04:24 . drwxrwxr-x 5 user user 4096 Sep 2 03:28 .. drwxrwxr-x 5 user user 4096 Sep 2 04:23 ENV
環境が構築できたので、このENVの環境を有効化しましょう
$ source ENV/bin/activate
ENV環境に切り替わると、環境名が()の中に表示されます。
(ENV) [user scrapy]$
ENV環境を有効化した状態でwhichするとPythonのパスが変わっています。
(ENV) [user scrapy]$ which python ~/Python/scrapy/ENV/bin/python
念の為Pythonのバージョンも確認しておきましょう
(ENV) [user scrapy]$ python -V Python 2.7.5
ENVの仮想環境を新たに作った時点では、初期段階のパッケージしか入っていません。
以下のコマンドで不要なパッケージが入っていないことを確認してみましょう。
いままでの環境と完全に切り分けられています。
(ENV) [user scrapy]$ pip freeze
この仮想環境を停止したい時は以下のコマンドで停止しましょう。
(ENV) [user scrapy]$ deactivate
構築した仮想環境が不要になった場合は
$ rm -r ENV
で、ENVディレクトリを消去するだけです。
簡単に環境の切り替えができ、プロジェクトごとのパッケージ管理もしやすいです。
うまくいくかわからないチャレンジングなプロジェクトをはじめたい時にも、現在の環境を汚さずにパッケージをバンバンインストールできる点も利点です。
初心者の方にこそ、virtualenvを試していただきたいです。
Webスクレイピングで、タグの属性値を取得する方法
Webスクレイピングしたタグの特定の属性値を取得する方法をご紹介します。
まず「属性値」についてのおさらいです。
例えば以下のようなタグの場合で考えてみましょう。
<a href="/sports/item/65406540/" class="sold_out no_img" target="_blank" sample="this is sample">スノーボードセット</a>
このよくあるタイプのaタグでいうと、
href、class、target等…は属性にあたります。
属性値は、この属性の中に入っている値のことを指します。
属性「href」の属性値は「/sports/item/65406540/」
属性「class」の属性値は「sold_out」、「no_img」の2つ
属性「target」の属性値は「_blank」
ということになりますね。
それでは、Webスクレイピングで属性値を取得する方法です。
属性値を取得する場合は、「get」取得したい属性を指定します。
下記はサンプルコードです。
text = '<a href="/sports/item/65406540/" class="sold_out no_img" target="_blank" sample="this is sample">スノーボードセット</a>' bsobj = BeautifulSoup(text, 'lxml') a_sourse = bsobj.find('a') a_sourse # <a href="/sports/item/65406540/" class="sold_out no_img" target="_blank">スノーボードセット</a> a_sourse.get('href') # /sports/item/65406540/ a_sourse.get('class') # ['sold_out', 'no_img'] a_sourse.get('target') # _blank # 自分で作った任意の属性にも利用できます。 a_sourse.get('sample') # this is sample
Pythonの環境にインストール済みのパッケージを確認する方法
$ pip freeze alabaster==0.7.10 anaconda-client==1.6.5 anaconda-navigator==1.6.9 anaconda-project==0.8.0 asn1crypto==0.22.0 astroid==1.5.3 astropy==2.0.2 Babel==2.5.0 backports.shutil-get-terminal-size==1.0.0 beautifulsoup4==4.6.0 bitarray==0.8.1 bkcharts==0.2 blaze==0.11.3 bleach==2.0.0 bokeh==0.12.10 boto==2.48.0 Bottleneck==1.2.1 certifi==2018.1.18 cffi==1.10.0 chardet==3.0.4 click==6.7 . . .
pip freeze で確認できます。
pip のバージョンを確認する方法
$ pip --version pip 9.0.1 from ******/python3.6/site-packages (python 3.6)
pip --version
で確認することができます。
UnicodeEncodeError: 'latin-1' のエラーがでたときの対処法
PythonでMySQLに接続する際、
pymysqlを利用して接続しようとすると
UnicodeEncodeError: 'latin-1' codec can't encode characters in position ~
のエラーが出力された。
mysql> show create database dbname;
調べてみると
+----------+--------------------------------------------------------------+ | Database | Create Database | +----------+--------------------------------------------------------------+ | dbname | CREATE DATABASE `dbname` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+--------------------------------------------------------------+
utf8に設定されている。
以下のSQLでも調べてみる。
mysql> show variables LIKE 'chara%';
出力結果
+--------------------------+---------------------------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------------------------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ | +--------------------------+---------------------------------------------------------+
PyCharmの文字コードは右下に記載されている

文字コードはいずれも「UTF-8」なのになぜか
UnicodeEncodeError: 'latin-1' codec can't encode characters in position ~
のエラーコードが出力されているようだ。
MySQLに接続するのにpymysqlを利用しているのだが、どうやらこいつが影響しているようだ。
MySQLに接続する設定のパラメータでcharsetも指定したら
文字コードのエラーが消えました。
charset='utf8' を追記しました。
connect=pymysql.connect(
user='dbuser',
password='password',
host='localhost',
database='dbname',
charset='utf8'
)
参照ページ
pcl.solima.net