python Webスクレイピング 実践入門をしようと思ったらうまくできなかった話

こちらのPython Webスクレイピング 実践入門を勉強しようと試していたところ、自分の環境にはurllib2というパッケージがインストールできなくてurllib3というパッケージを使わないといけないっぽい。そして、セキュリティーに関するエラーもでるというので、対策をしました。


 

urllib3を使うためには

参考までにurllib2をインスト−ルしようとすると以下のようなエラーがでます。

$ pip install urllib2
Collecting urllib2
 Could not find a version that satisfies the requirement urllib2 (from versions: )
No matching distribution found for urllib2

ちなみにインストールされているライブラリを確認してみると

$ pip freeze
・・・
unicodecsv==0.14.1
urllib3==1.22
# coding: UTF-8
wcwidth==0.1.7
・・・

urllib3が入ってます。ということで、特に何もせず使うことはできます。
「使うことは、、、」笑い

 

ライブラリインストール

$ pip install beautifulsoup4

これはそのままいけると思います。

日経新聞のページタイトル取得用ソースコード

getNikkeiWebPageTitle.py
# coding: UTF-8
import
urllib2
from
bs4
import
BeautifulSoup
# アクセスするURL
url
=
"http://www.nikkei.com/"
# URLにアクセスする htmlが帰ってくる → 経済、株価、ビジネス、政治のニュース:日経電子版
html
=
urllib2.urlopen(url)
# htmlをBeautifulSoupで扱う
soup
=
BeautifulSoup(html,
"html.parser")
# タイトル要素を取得する → 経済、株価、ビジネス、政治のニュース:日経電子版
title_tag
=
soup.title
# 要素の文字列を取得する → 経済、株価、ビジネス、政治のニュース:日経電子版
title
=
title_tag.string
# タイトル要素を出力
print
title_tag
# タイトルを文字列を出力
print
title

もちろんうまく行きません。

$ python3 getNikkeiWebPageTitle1.py
 File "getNikkeiWebPageTitle1.py", line 22
 print title_tag
 ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(title_tag)?

まずprint のSyntaxErrorが出ているので修正

# タイトル要素を出力
#print title_tag
print(title_tag)

# タイトルを文字列を出力
# print title
print(title)

実行してみるとまたまた、違うエラーがでます。

$ python3 getNikkeiWebPageTitle1.py
Traceback (most recent call last):
 File "getNikkeiWebPageTitle1.py", line 3, in 
 import urllib2
ModuleNotFoundError: No module named 'urllib2'

urllib3を使うということなのでそのあたりを修正

import urllib3

url = "http://www.nikkei.com/"
#html = urllib3.urlopen(url)
http = urllib3.PoolManager()
response = http.request('GET',url)

# htmlをBeautifulSoupで扱う
#soup = BeautifulSoup(html, "html.parser")
soup = BeautifulSoup(response.data.decode('UTF-8'),"lxml")

コメントアウトがもとのソースでその下が、修正した部分です。
このコードを実行すると

/Users/USERNAME/anaconda3/lib/python3.6/site-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
 InsecureRequestWarning)
経済、株価、ビジネス、政治のニュース:日経電子版
経済、株価、ビジネス、政治のニュース:日経電子版

InsecureRequestWarningという警告が出ています。

InsecureRequestWarningを消す

参考

$ pip
install
certifi
$ pip
install
urllib3[secure]

を実行

import
certifi
http
=
urllib3.PoolManager(cert_reqs='CERT_REQUIRED',ca_certs=certifi.where())

この2行を追加します。そうすると。エラーなく実行できます。

スクレイピングをうまく使うとかなり便利そうですね(^^)