python3でWebページのスクレイピング with BeautifulSoup4
注意:全く同様の記事がQiita上にも存在する.筆者の個人的な都合上,両方で公開した.
やったこと:ニュースサイトのスクレイピング
ニュースサイトに対してスクレイピングを行い,記事のタイトルと記事本体を拾い上げてくるプログラムをpython3で書いた.
対象
今回は,ニュースアプリのGunosyの記事を対象にスクレイピングを行なった.
環境
やり方
前準備:あらかじめ,ニュースの記事のサイトの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で事足りそうである.