LoginSignup
8
12

More than 3 years have passed since last update.

pythonでスクレイピング ①BeautifulSoup

Last updated at Posted at 2019-02-26

はじめに

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

環境

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')

おわりに

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

8
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12