5log

日々の仕事の備忘録

BeautifulSoup4とurllibを使用して、公開されたWebページの情報をスクレイピングする

PythonのBeautifulSoupを使用するWebスクレイピング記事その2です。前回記事では変数に格納したHTMLタグに対し、BeautifulSoupでスクレイピングを行いました。

5log.hateblo.jp

今回はurllibというパッケージを使用して、WWWに公開されているウェブサイトから情報を取得していこうと思います。

はじめに:今回の記事作成にあたり

前回の記事内で、URLを使ったスクレイピング手法に関しては、下記qiitaの記事を引用していたのですが、改めて検証したらPython3.7では一部記述を変える必要があるため、下記で紹介されているコードをコピペしても動かない事が判明しました。

Python Webスクレイピング 実践入門 - Qiita

そのため、今回は上記記事のコードをベースに、Python3.7で動かす場合を想定したコードに書き換えたものをご紹介したいと思います。

urllibとは

PythonでURLを扱うためのモジュールを集めたパッケージの呼称です。詳細を知りたい方は下記のリンク先を参照してください。

21.5. urllib — URL を扱うモジュール群 — Python 3.6.5 ドキュメント

通常、パッケージを使う場合はBeautifulsoupのようにパッケージのインストール作業が発生するのですが、urllibはPython3.7時点では最初からインストールされているため、インストール作業不要で使うことができます。

そして、下記のリンク先記事を読むとわかりますが、Python2系と3系では使い方が異なります。

Python3系でurllib2は使えない:代わりにurllib.requestとurllib.errorを使う - MathPython

そのため、Python3でurllibを使ってサイトの情報を取得する場合のサンプルコードを、次の項目でご紹介します。

サンプルコード

以前紹介した記事と同じ事をやっても面白くないので、今回はYahoo!のトップページから、titleタグの情報とdescription文言を取得してみようと思います。

# import urllib2ではなく下記の文言を使用
import urllib.request, urllib.error
from bs4 import BeautifulSoup

# アクセスするURL
url = "https://www.yahoo.co.jp/"
# URLを開く
html = urllib.request.urlopen(url)
# BeautifulSoupで開く
soup = BeautifulSoup(html, "html.parser")

title_tag = soup.title
# titleタグの出力。Python3ではprint(変数)と記述する
print(title_tag)

# HTMLからname=description要素が含まれるタグを探す
desc_tag = soup.find(attrs={"name":"description"})
# descriptionタグからcontent要素だけを抽出する
desc_txt = desc_tag["content"]

# desc_txtの情報を出力
print(desc_txt)

このコードを適当なファイルに保存後にPythonで実行すると、このような結果となります。

<title>Yahoo! JAPAN</title>
日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。

title_tagでページのtitleタグを、desc_tagでページのdescriptionタグのcontent情報を取得することに成功しました。

まとめ

BeautifulSoupとurllibを使用することで、ブラウザの「ページのソースを表示」から閲覧できる情報はほぼ全て取得することが可能です。

しかし、例えばJavaScriptなどスクリプトで表示が出し分けされている箇所などは、ブラウザのソースコードにソースが表示されないため、このやり方では取得できません。

次回はそうしたJavaScriptで制御されている情報を、Selenium+Chromedriverを使って取得する方法について記事にしていこうと思います。