さくらのレンタルサーバーでPythonによるスクレイピング
環境の準備
さくらのレンタルサーバー
スタンダードを使用しています。
さくらのレンタルサーバーにはPython 2.7.6 が入っていました。
1 2 | % python --version Python 2.7.6 |
できれば新しいものが使いたいので、Python3をインストールします。
Python 3.7.2をインストールしようとしましが、途中で下記エラーが出てインストールできず、
ModuleNotFoundError: No module named '_ctypes' |
バージョンを3.6.8をインストールしました。
ただし、そのままインストールすると、使用するOpenSSLのバージョンが古く
下記のエラーがでて、pipでパッケージが追加できません。
1 2 | % pip3 install beautifulsoup4 Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:852)'),)': /simple/beautifulsoup4/ |
下記のオプションをつけたら解決するといった記事も見つけましたが、ダメでした。
--trusted-host pypi.org --trusted-host files.pythonhosted.org |
なので、先に最新のOpenSSL 1.0.2r をインストールして、これを使うようにします。
1 2 3 4 5 6 7 8 9 10 11 12 | % mkdir ~/local/src % cd ~/local/src/ % tar xvfz openssl-1.0.2r.tar.gz % cd openssl-1.0.2r % ./config --prefix=${HOME}/local -fPIC % gmake % gmake install % ~/local/bin/openssl version OpenSSL 1.0.2r 26 Feb 2019 |
Python 3.6.8 をインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | % mkdir ~/www/python % cd ~/www/python % tar xvfz Python-3.6.8.tgz % cd Python-3.6.8 先程インストールしたOpenSSLの場所を指定します。 % ./configure --prefix=$HOME/local/python CPPFLAGS="-I$HOME/local/include" LDFLAGS="-L$HOME/local/lib" % make % make install % vi ~/.cshrc 下記追加を set path = ($path $HOME/local/python/bin) setenv PYTHON $HOME/local/python/lib % source ~/.cshrc % rehash 確認 % python3 -V Python 3.6.8 |
次にスクレイピングのモジュール「Beautiful Soup」と
HTTPライブラリ「Requests」をインストール
1 2 | % pip3 install beautifulsoup4 % pip3 install Requests |
これでスクレイピングするための準備が整いました。
スクレイピングしてみる
読売新聞のサイトから記事のタイトルを取得してみます。
% vi test.py |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # -*- coding: utf-8 -*- import ssl from urllib import request from bs4 import BeautifulSoup def scraping(): context = ssl.SSLContext(ssl.PROTOCOL_TLS) html = request.urlopen(url, context = context) soup = BeautifulSoup(html, "html.parser" ) titles = soup.find_all( "h3" , attrs = { "class" , "c-list-title--small" }) for title in titles: print (title.a.string) if __name__ = = "__main__" : scraping() |
実行すると、エラーが出てしまいました。
1 2 | % python3 test.py UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-19: ordinal not in range(128) |
環境変数LANGを設定します。
1 2 3 4 5 6 | % vi ~/.cshrc 下記追加 setenv LANG ja_JP.UTF-8 % source ~/.cshrc % rehash |
再度実行すると、取得(2019/2/28時点)できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | % python3 test.py 正恩氏「直感では…よい結果が生まれるだろう」 安倍首相「私の考え方、正恩氏に伝わると確信」 ホワイトハウス「会談は敏感」欧米4記者を排除 「警察官の主観で切符を切られる」仏教会が懸念 段ボール切断の作業中、裁断機に巻き込まれ死亡 東京医大、追加合格44人の半数が辞退 竹内結子さん、中林大樹さんと結婚…映画で共演 NHK来春朝ドラ、窪田正孝さん主演「エール」 関大入試、正解ない「地理問題」…補欠合格追加 なでしこ、世界ランク1位の米と2―2ドロー 中国紙「経済発展したいなら、米と関係改善を」 北メディア、両首脳が「虚心坦懐で率直な対話」 米朝首脳、2日目会談始まる…冒頭1対1で対話 |
参考
【Python】さくらレンタルサーバーでPython3.5をインストールして環境構築をしたときの方法
さくらのレンタルサーバでHTTPS (TLS) 対応のPython 2.7をビルドした記録
Beautiful Soup での スクレイピング基礎まとめ [初学者向け]