注意:全く同様の記事がはてなブログ上にも存在する.筆者の個人的な都合上,両方で公開した.
やったこと:ニュースサイトのスクレイピング
ニュースサイトに対してスクレイピングを行い,記事のタイトルと記事本体を拾い上げてくるプログラムをpython3で書いた.
対象
今回は,ニュースアプリのGunosyの記事を対象にスクレイピングを行なった.
環境
- python 3.6.1
- その他使用したライブラリ
- ssl <- もともと入っている
- urllib <- もともと入っている
- BeautifulSoup4
やり方
前準備:あらかじめ,ニュースの記事のサイトのHTMLから取り出したい部分を探しておく.
ブラウザのディベロッパツールなんかを使うと取り出すのが簡単になるのでオススメ.
htmlコードを調べると,ページ上の該当部分に色がついて見える.
ex.) GoogleChrome なら,メニューバー>表示>開発/管理>ディベロッパーツール
①URLを入力させる
pythonのinput()
でサイトURLを入力させ,url
に格納.
input_url
print("カテゴリ分類を行いたい記事のURLを入力してください.")
url = input()
②URLのソースコードを取り出す
ssl
を使って,SSLエラーを回避しながらページのソースurllib
を用いてhtml
内に格納
get_src
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
の中に格納した.
get_title_and_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で事足りそうである.