【Python】スクレイピング基礎

流行りのスクレイピングというものを超簡単に紹介する。
詳細は各自チェックで。

参考
https://docs.python.org/ja/3/library/urllib.html
http://python-remrin.hatenadiary.jp/entry/2017/05/01/152455
http://kondou.com/BS4/

ライブラリ読み込み

import urllib.request, urllib.error, urllib.parse

HTMLファイルをゲットする

with urllib.request.urlopen('https://www.yahoo.co.jp') as response:
   html = response.read().decode('utf-8')
print(html)

出力結果

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
...

HTMLファイルの中身が丸まま出てきます。

ライブラリ読み込み&構文解釈

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

出力

print(soup.title)
<title>Yahoo! JAPAN</title> 
print(soup.title.string)
Yahoo! JAPAN
print(soup.find_all("a"))
[<a href="https://www.yahoo-help.jp/"><nobr>ヘルプ</nobr></a>, <a href="https://www.yahoo-help.jp/app/answers/detail/p/533/a_id/43883">Internet Explorerの互換表示について</a>, <a href="https://yahoo.jp/d9fuCi">熊本地震から3年 ネット募金で被災地を応援しよう</a>, <a href="https://rdsig.yahoo.co.jp/auction/promo/sunday/pc/ytop/txt/RV=1/RU=aHR0cHM6Ly9hdWN0aW9ucy55YWhvby5jby5qcC90b3BpYy9wcm9tby9rdWppLz9jcGlkPXByX3N1bmRheSZtZW51PXRvcHBhZ2UmdGFyPXRvcCZjcj10b3A-">ヤフオク!Sundayくじで期間固定Tポイント当たる</a>, <a href="https://news.yahoo.co.jp/pickup/6320275">首相と省庁面談 議事録残さず<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320278">LED照明事故 10年で328件 ...

トップニュースの文字列を取得してみる

aタグの中からリンク先がhttps://news.yahooから始まるものを抽出。
正規表現を使って探すので、まず正規表現を扱うライブラリのインポート。

import re

次に抽出。

print(soup.find_all("a", href=re.compile("^https:\/\/news\.yahoo")))
[<a href="https://news.yahoo.co.jp/pickup/6320275">首相と省庁面談 議事録残さず<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320278">LED照明事故 10年で328件<img alt="NEW" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconNew_150713.gif" width="30"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320281">田に潤い再び 正念場の南阿蘇<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/><img alt="NEW" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconNew_150713.gif" width="30"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320282">死者も 米製ベビーベッド回収<img alt="NEW" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconNew_150713.gif" width="30"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320279">「姥捨て山」残る伝承 真相は<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320270">2満塁被弾 虎ファン8回に帰る<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320280">石野卓球 出演中一言も発せず<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/><img alt="NEW" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconNew_150713.gif" width="30"/></a>, <a href="https://news.yahoo.co.jp/pickup/6320271">磯山さやか ぽっちゃりは個性<img alt="写真" border="0" height="12" src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif" width="16"/></a>, <a href="https://news.yahoo.co.jp/list/?d=20190414&mc=f&mp=f">もっと見る</a>, <a href="https://news.yahoo.co.jp/fc">記事一覧</a>, <a href="https://news.yahoo.co.jp/">ニュース</a>] 

それぞれのタグの中のテキストだけを抽出。

headlines = soup.find_all("a", href=re.compile("^https:\/\/news\.yahoo"))
for headline in headlines:
    print(headline.get_text())
首相と省庁面談 議事録残さず
LED照明事故 10年で328件
田に潤い再び 正念場の南阿蘇
死者も 米製ベビーベッド回収
「姥捨て山」残る伝承 真相は
2満塁被弾 虎ファン8回に帰る
石野卓球 出演中一言も発せず
磯山さやか ぽっちゃりは個性
もっと見る
記事一覧
ニュース

まとめ

HTTPリクエスト投げて帰ってきたレスポンスを加工するだけ。
そのときにBeautifulSoup4というライブラリを使うとある程度楽にできる。
でも思い通りに情報を取り出したかったら、正規表現を使ってがんばる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です