注意:全く同様の記事がはてなブログ上にも存在する.筆者の個人的な都合上,両方で公開した.
やったこと:ニュースサイトのスクレイピング
ニュースサイトに対してスクレイピングを行い,記事のタイトルと記事本体を拾い上げてくるプログラムをpython3で書いた.
対象
今回は,ニュースアプリのGunosyの記事を対象にスクレイピングを行なった.
環境
- python 3.6.1
- その他使用したライブラリ
- ssl <- もともと入っている
- urllib <- もともと入っている
- BeautifulSoup4
やり方
前準備:あらかじめ,ニュースの記事のサイトのHTMLから取り出したい部分を探しておく.
ブラウザのディベロッパツールなんかを使うと取り出すのが簡単になるのでオススメ.
htmlコードを調べると,ページ上の該当部分に色がついて見える.
ex.) GoogleChrome なら,メニューバー>表示>開発/管理>ディベロッパーツール
①URLを入力させる
pythonのinput()
でサイトURLを入力させ,url
に格納.
print("カテゴリ分類を行いたい記事のURLを入力してください.")
url = input()
②URLのソースコードを取り出す
ssl
を使って,SSLエラーを回避しながらページのソースurllib
を用いてhtml
内に格納
import ssl
import urllib
ssl._create_default_https_context = ssl._create_unverified_context #SSL証明書が正しくない場合にはエラーとなる。以下を追加することで、対応できる。
html = urllib.request.urlopen(url).read() #上記で取り出したurlを使用する.
③ソースコード内から該当部分を取り出す.
soup
にページ全てのhtmlの元が入っており,BeautifulSoupを使ってその中から該当する部分のみを取り出す.
該当する部分は,前準備の時に取り出したものである.ちなみに,BeautifulSoupではXpathを使えないようなので注意されたい.
また,.get_text()
を用いて文字データを抽出し,title, article
の中に格納した.
soup = BeautifulSoup(html,"lxml")
title_part = soup.find_all("h1", {"class": "article_header_title"})
article_part = soup.find_all("div", {"class": "article gtm-click"})
title = title_part[0].get_text()
article = article_part[0].get_text()
まとめ
基本的にこの要領で行えば,スクレイピングできるようである.lxmlパッケージなども用意されているが基本的には,BeautifulSoupで事足りそうである.
参考サイト
[http://www.mnsite.com/python%E3%81%A7ssl%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95]
[http://qiita.com/yhashizaki/items/c996297a80024bcaa2eb]