さくらのレンタルサーバー‎でPythonによるスクレイピング




環境の準備

さくらのレンタルサーバー
スタンダードを使用しています。

さくらのレンタルサーバーにはPython 2.7.6 が入っていました。

% python --version
Python 2.7.6

できれば新しいものが使いたいので、Python3をインストールします。

Python 3.7.2をインストールしようとしましが、途中で下記エラーが出てインストールできず、

ModuleNotFoundError: No module named '_ctypes'

バージョンを3.6.8をインストールしました。
ただし、そのままインストールすると、使用するOpenSSLのバージョンが古く
下記のエラーがでて、pipでパッケージが追加できません。

% 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 をインストールして、これを使うようにします。

% mkdir ~/local/src
% cd ~/local/src/
% wget https://www.openssl.org/source/openssl-1.0.2r.tar.gz
% 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 をインストールします。

% mkdir ~/www/python
% cd ~/www/python
% wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
% 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」をインストール

% pip3 install beautifulsoup4
% pip3 install Requests

これでスクレイピングするための準備が整いました。

スクレイピングしてみる

読売新聞のサイトから記事のタイトルを取得してみます。

% vi test.py
# -*- coding: utf-8 -*-
import ssl
from urllib import request
from bs4 import BeautifulSoup

def scraping():
    url = "https://www.yomiuri.co.jp/"

    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()

実行すると、エラーが出てしまいました。

% python3 test.py
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-19: ordinal not in range(128)

環境変数LANGを設定します。

% vi ~/.cshrc
下記追加
setenv LANG ja_JP.UTF-8

% source ~/.cshrc
% rehash

再度実行すると、取得(2019/2/28時点)できました。

% python3 test.py
正恩氏「直感では…よい結果が生まれるだろう」
安倍首相「私の考え方、正恩氏に伝わると確信」
ホワイトハウス「会談は敏感」欧米4記者を排除
「警察官の主観で切符を切られる」仏教会が懸念
段ボール切断の作業中、裁断機に巻き込まれ死亡
東京医大、追加合格44人の半数が辞退
竹内結子さん、中林大樹さんと結婚…映画で共演
NHK来春朝ドラ、窪田正孝さん主演「エール」
関大入試、正解ない「地理問題」…補欠合格追加
なでしこ、世界ランク1位の米と2―2ドロー
中国紙「経済発展したいなら、米と関係改善を」
北メディア、両首脳が「虚心坦懐で率直な対話」
米朝首脳、2日目会談始まる…冒頭1対1で対話

参考

【Python】さくらレンタルサーバーでPython3.5をインストールして環境構築をしたときの方法
さくらのレンタルサーバでHTTPS (TLS) 対応のPython 2.7をビルドした記録
Beautiful Soup での スクレイピング基礎まとめ [初学者向け]



  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。