こんなもん

データサイエンスとか,カメラとか,クルマとか.ゆるーく,ちょっとずつ記録していきます.

python3でWebページのスクレイピング with BeautifulSoup4

注意:全く同様の記事がQiita上にも存在する.筆者の個人的な都合上,両方で公開した.

やったこと:ニュースサイトのスクレイピング

ニュースサイトに対してスクレイピングを行い,記事のタイトルと記事本体を拾い上げてくるプログラムをpython3で書いた.

対象

今回は,ニュースアプリのGunosyの記事を対象にスクレイピングを行なった.

環境
  • python 3.6.1
  • その他使用したライブラリ
  • ssl <- もともと入っている
  • urllib <- もともと入っている
  • BeautifulSoup4

やり方

前準備:あらかじめ,ニュースの記事のサイトのHTMLから取り出したい部分を探しておく.

ブラウザのディベロッパツールなんかを使うと取り出すのが簡単になるのでオススメ. htmlコードを調べると,ページ上の該当部分に色がついて見える.
ex.) GoogleChrome なら,メニューバー>表示>開発/管理>ディベロッパーツール

②URLを入力させる

pythoninput()でサイト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で事足りそうである.

参考サイト

pythonでSSLエラーが発生した場合の対処方法 | mnsite

qiita.com