Edited at

pythonでスクレイピング ①BeautifulSoup


はじめに

今回が初投稿になるので、至らない部分も多いかと思いますがご容赦ください。間違いなどありましたらご指導いただけると幸いです。


環境

macOS Mojave 10.14

python 3.6.4


準備

BeautifulSoupとrequestsをインストール

$ pip install beautifulsoup4

$ pip install requests


  • BeautifulSoup4

    HTMLやXMLを解析してデータを取り出すためのライブラリ


  • requests

    Webブラウザの代わりにHTTPでデータの送受信を行う



Webページの情報を取得

まず、requestsを使ってWebページの情報を取得する。

今回は例として、livedoorNEWSのランキングの情報を取得する。

get関数は、取得したいURLを指定するとその情報を格納したResponseオブジェクトを生成して返す。

import requests

response = requests.get('http://news.livedoor.com/ranking/')


Webページから要素を抜き出す

BeautifulSoup4を使ってHTMLを構文解析してタグなどの任意の要素を取得する。

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')

要素を見つけるには以下のようにする。


soup.a # 先頭のa要素を一つ取得
soup.find('a') # soup.aと同じ
soup.find_all('a') # 全てのa要素を取り出す。リストのように扱える。
soup.find('div', id='main') # divタグでidがmainのものを取得する
soup.a.get('href') # href属性を取得する
soup.a.text # aタグの中身を取得する


実践

プログラムを書き始める前に、HTMLの構造を確認することが必要。ここでは、ニュースのタイトル・日時・URLを取得してみる。

Chromeの検証機能を使うとどのタグの中に欲しい情報があるのか簡単に分かる。Chromeの検証機能についてはまた詳しく書こうと思います。


news.py

# -*- coding: utf-8 -*-


import requests
from bs4 import BeautifulSoup
import pandas as pd

response = requests.get('http://news.livedoor.com/ranking/')
soup = BeautifulSoup(response.text, 'html.parser')
newslist = soup.find('div', class_='mainBody')
tags = newslist.find_all('li')

articles = []
for tag in tags:
url = tag.a.get('href')
title = tag.a.h3.text
time = tag.time.text

article = {
'title': title,
'url': url,
'datetime': time
}

articles.append(article)

df = pd.DataFrame(articles) # 辞書をDataFrameに変換
print(df)
df.to_csv('news.csv')



おわりに

これからは勉強したことをきちんと残していきたいです。