5Python5(ゴーパイソンゴー)

プログラミングに挫折したわたしが一流のPython使いになるまでの備忘録

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

yumでインストールしたパッケージを確認する方法

yumを利用してインストールしたパッケージは

$ yum list installed

で確認できます。

ものすごい数のパッケージが列挙されますので、
これから追加したいパッケージが既にインストールされているのかを確認したい場合は、
下記のようにgrepを利用して検索するといいでしょう。

php」を含むパッケージを検索する

$ yum list installed | grep php

yumでインストールしたパッケージを確認する方法

yumを利用してインストールしたパッケージは

$ yum list installed

で確認できます。

ものすごい数のパッケージが列挙されますので、
これから追加したいパッケージが既にインストールされているのかを確認したい場合は、
下記のようにgrepを利用して検索するといいでしょう。

$ yum list installed

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 で確認できます。

UnicodeEncodeError: 'latin-1' のエラーがでたときの対処法

PythonMySQLに接続する際、
pymysqlを利用して接続しようとすると

UnicodeEncodeError: 'latin-1' codec can't encode characters in position ~

のエラーが出力された。

データベースの文字コードを調べるSQLはこちら

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\ |
+--------------------------+---------------------------------------------------------+

文字コードUTF-8になってるようだ。

PyCharmの文字コードは右下に記載されている
f:id:booleanoid:20180126212050p:plain

文字コードはいずれも「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