Pythonで初めてのWebスクレイピングをやってみた

スポンサーリンク
Python
スポンサーリンク

退屈なことはPythonにやらせよう」という本を買って読んだので、紹介されている内容を参考に生まれて初めてのWebスクレイピングをやってみます。

今回はYahoo!トップページのトップニュースの部分のテキストを抜き出してみます。

スポンサーリンク

環境

まずは環境の確認。
開発用マシンのOSはLinux Mintです。バージョンは、

$ lsb_release -r
Release:  17.2

次に、Pythonのバージョンを確認します。「退屈なことはPythonにやらせよう」はPython3を前提として書かれているため、Python3がインストールされているか確認します。

$ Python --version
Python 2.7.6

あれ?こっちか?

$ Python3 --version
Python 3.4.3

pipのインストール

今回の開発では標準のPythonに含まれていないサードパーティ製モジュールを使用します。Pythonでサードパーティ製モジュールをインストールするには、pipというパッケージ管理ツールを使用すると便利です。
ちなみに、pipの正しい読み方は何なのでしょうか?私はピップと読んでいますが・・・。

まずはインストールされているか確認。

$ pip3 --version
プログラム 'pip3' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install python3-pip

ということなのでインストールします。

$ sudo apt-get install python3-pip

サードパーティ製モジュールのインストール

今回は、以下のモジュールを使用します。

  • Requests
  • BeautifulSoup4

「Requests」というモジュールはWebページをダウンロードするために使用するモジュールです。
「BeautifulSoup4」というモジュールはHTMLを解析して扱いやすくしてくれるモジュールです。
では、インストールしていきます。

$ sudo pip3 install requests
$ sudo pip3 install beautifulsoup4

HTMLコードの解析

スクリプトを書く前に、対象部分のHTMLコードを確認しておきます。

<div id="topicsboxbd" class="bdA2 ">
<div id="topicsfb" class="current"><div class="topicsindex"><em>20時8分更新</em>
<ul class="emphasis">
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAseZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDUwAA--/RK=0/RS=lOx9U7a5j466JpBWD7zFqwaPTN8-">5人被曝 プルトニウム不検出<span class="iconPhoto" title="写真">写真</span></a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAsuZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDU0AA--/RK=0/RS=4JSwbXj0plHKKZKQ4eIqpN7YY0Q-">防災訓練の高校生112人食中毒<span class="iconVideo" title="動画">動画</span><span class="iconNew" title="NEW">NEW</span></a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAs.Z8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDIzAA--/RK=0/RS=Hm9piDu6P0ZNssgxjSFe_we4Z70-">薬物で著書も 「教授」逮捕<span class="iconPhoto" title="写真">写真</span><span class="iconNew" title="NEW">NEW</span></a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAtOZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDUyAA--/RK=0/RS=HWnBDex6N.5pZEWNjkU9XEbbHU0-">静岡のロリエ常盤家が倒産</a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAteZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDQ3AA--/RK=0/RS=aWmypH_P5xWDjLtFc9NhDeV5Fvc-">苦戦かっぱ寿司 食べ放題試行<span class="iconPhoto" title="写真">写真</span></a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAtuZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDUzAA--/RK=0/RS=gkht8tRsMI7.AkHOf0qXzsH2F.4-">パラボラを網状に 新技術開発<span class="iconPhoto" title="写真">写真</span><span class="iconNew" title="NEW">NEW</span></a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAt.Z8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDQ1AA--/RK=0/RS=qZB9cTeDqdiHOWGQfTVE6TGvkZk-">史上最高の右打ち打者は誰か<span class="iconPhoto" title="写真">写真</span></a></li>
<li><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAuOZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL3BpY2t1cC82MjQzMDQ5AA--/RK=0/RS=n1r9e6UfN9DOtJ9GZt4YercBeWY-">アニサマ オタ芸を全面禁止に<span class="iconPhoto" title="写真">写真</span></a></li></ul><ul class="more"><li class="first"><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAueZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL2xpc3QvP2Q9MjAxNzA2MTImbWM9ZiZtcD1mAA--/RK=0/RS=0YTFDy0UdZZqWCRcd3ZHaYrNyvQ-">もっと見る</a></li>
<li><a href="http://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAuuZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cDovL25ld3MueWFob28uY28uanAvZmMA/RK=0/RS=pwhkORbk4NtDATZKERyFEESCx14-">記事一覧</a></li></ul></div><div class="topicscatch"><div class="topicsdetail bdB4 bgB5"><div class="topicsimg"><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAu.Z8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9oZWFkbGluZXMueWFob28uY28uanAvaGw_YT0yMDE3MDYxMi0wMDAwMDAzNC1qaWpwLXNvY2kudmlldy0wMDAA/RK=0/RS=FlMjlZ0IQgLcJ2RsQGWjEB5fM3Y-" id="tpcsimgfilter" class="imgfilter" style="background-image:url(https://lpt.c.yimg.jp/im_sigg0KFNLd6xxTv8wjLIlkwaFQ---x120-y120/amd/20170612-00000034-jijp-000-view.jpg);width:120px;height:100px;" title="世話をするシンシン">世話をするシンシン</a></div><p><a href="https://rdsig.yahoo.co.jp/_ylt=A2RiWbOsdj5ZxzkAvOZ8cQF8/RV=2/RE=1497352236/RH=cmRzaWcueWFob28uY28uanA-/RB=.lwRqKSUzJir3cXAxYuJJHO27Sc-/RU=aHR0cHM6Ly9oZWFkbGluZXMueWFob28uY28uanAvaGw_YT0yMDE3MDYxMi0wMDAwMDAzNC1qaWpwLXNvY2kudmlldy0wMDAA/RK=0/RS=FlMjlZ0IQgLcJ2RsQGWjEB5fM3Y-">世話をするシンシン</a></p><em>6月12日16時6分配信</em><cite>時事通信</cite>
</div></div></div>
<div id="economyfb" class=""></div>
<div id="entertainmentfb" class=""></div>
<div id="sportsfb" class=""></div>
<div id="domesticfb" class=""></div>
<div id="worldfb" class=""></div>
<div id="scientificfb" class=""></div>
<div id="localfb" class=""></div>
</div>
</div>

作ったスクリプト

#! python3

import requests, bs4

#Webページを取得
res = requests.get('https://www.yahoo.co.jp/')

#BeautifulSoupオブジェクトに変換
soup = bs4.BeautifulSoup(res.text,'lxml')  #本には書かれていないが第2引数に'lxml'をつけないとエラーになる

#セレクタを指定して表示
elems = soup.select('a')
for e in elems:
    print(e.getText())

結果

ヘルプ
Internet Explorerの互換表示について
感謝の気持ちを伝える、「父の日」ギフト特集
白木屋や笑笑など、居酒屋の飲み放題が割引に
アンケートに答えて最大5万ポイントが当たる
5人被曝 プルトニウム不検出
英EU離脱 交渉撤退も選択肢
市議長 小学生の傍聴を認めず
薬物で著書も 「教授」逮捕
静岡のロリエ常盤家が倒産
苦戦かっぱ寿司 食べ放題試行
イラク戦 なぜ酷暑の夕方に
50kg減量 父子3人王者目指す
もっと見る
記事一覧

ハダカの共演
ショッピング
ヤフオク!
旅行、ホテル予約
ニュース
天気
〜以下省略〜

はい。妥協しました。soup.select(‘a’)のところのセレクタの指定の仕方がわかりません。もうちょい勉強しますorz

コメント