mizzsugar’s blog

日々感じていることや学んだことを書きます。エンジニアリング以外にも書くかもしれません。

PythonのWEBスクレイピング超絶入門に利用した文法など

PythonでWEBスクレイピングに初挑戦しました!

今回は、下記のnote教材にお世話になりました!

note.mu

超絶入門ということもあり、 さらっと出来てすごいなあと感動しました! (本当にありがたい・・・!)

しかし、私自身、「パーサとは」といったことから分かっていませんでした・・・

このまま次のステップへ進むのは危険なので、

備忘録として、「WEBスクレイピングとは」といったところから

使用したライブラリの簡単な文法まで

書き残したいと思います。

前提

  • Python 3.7.0
  • BeautifulSoup 4.4.0
  • pandas 0.23.4

パーサとは

「パーサとは、構文解析を行うためのプログラムの総称である。」

「パーサの中には、特定の解析対象を明示する形で、HTMLパーサやXMLパーサといった具合に呼称される場合がある」

www.weblio.jp

構文解析とは

「単語や字句で構成される文を、定義された文法に従って解釈し、文の構造を明確にすることである。」

www.weblio.jp

htmlパーサは、解析対象がhtmlとなります。

パーサは、それを読み込むアプリケーションにとって利用しやすい形に変換する機能を持っています。

なお、Pythonの標準ライブラリにhtmlパーサは含まれており、

今回利用するBeautifulSoupはそれをサポートしています。

また、BeautifulSoupは他のサードパーティーのライブラリもサポートしています。

BeautifulSoupで、とあるテキストに記載されているurlを取得してみる

教材にて、hmtl_docという変数に格納されたドキュメントにあるURLを取得して表示させるというものがありました。

 html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""

処理の流れとしてはこんな感じかな、と解釈しました。

①対象となるドキュメントのBeautifulSoupインスタンスの生成

②①で生成したBeautifulSoupインスタンスから、'a'タグの要素を抽出

①対象となるドキュメントのBeautifulSoupオブジェクトの生成

soup = BeautifulSoup(html_doc, 'html.parser') 

BeautifulSoup(対象となるドキュメント, パーサ)

という構文でBeautifulSoupオブジェクトを生成しています。

URLの取得に利用するのは、 BeautifulSoup型の変数soupになります。

また、prettify()という、対象となるBeautifulSoupインスタンスのパーサの型に応じて きれいにフォーマットを整えた文字列に変換して返してくれるメソッドの紹介もありました。

文法は、

BeautifulSoupインスタンス.prettify()

です。

soup = BeautifulSoup(html_doc, 'html.parser')
print(soup) # タグによってインデントがない見にくいドキュメントが表示されます
print(soup.prettify()) # インデントが整えられた、見えやすいドキュメントが表示されます。

aタグの要素を取得して表示してみます。

print(soup.a)
# BeautifulSoupインスタンス.a といったところですかね。

一つの要素しか表示されないかと存じます。

aタグのすべての要素を取得するために、find_all()を利用します。

print(soup.find_all('a'))
# BeautifulSoupインスタンス.find_all('タグ名') 
tags = soup.find_all('a')
for tag in tags:
    print(tag.get('href')

get('href')で、urlのみを取得します。

get(要素)で、その要素の値のみを取得します。

aタグでクラスが"class_name"の要素を抽出するなら↓

soup.find_all("a", {"class", "class_name})
soup.find_all("タグ名", {"class", "クラス名"}) # といったところでしょうか

第一引数がタグ名

第二引数が{str, str}のdict

となります。

requestsで指定されたURLのWEBページのhtmlを取得する

import requests
response = requests.get("https://review-of-my-life.blogspot.com/")
print(response.text)

requestsは、PythonのHTTPを扱うためのライブラリです。

get(url)で、urlにgetリクエストを送った際のレスポンスを取得します。

また、requests.post(url)やrequests.put(url)など、様々なhttpリクエストを送った際のレスポンスも簡単に取得できます。

textでレスポンスの内容をドキュメント化します。

printすると、ドキュメント化されたレスポンスの内容が表示されます。

クイックスタート — requests-docs-ja 1.0.4 documentation

soup = BeautifulSoup(response, 'html.parser')
tags = soup.find_all('a')

for tag in tags:
    print(tag.get('href'))

pandasで分析結果の表を作成する

pandasとは

強力なPython製のデータ分析ツールです。 CSVやhtmlなど様々なファイルからデータを読み込み、DataFrame(表のような形式のオブジェクト)に変換し、様々な形式で出力することができます。

https://docs.pyq.jp/python/pydata/pandas/index.html

Cookbook — pandas 0.23.4 documentation

今回は、表を作成をします。

列を指定してヘッダを作成する

import pandas as pd
columns = ["Name", "Url"]
df = pd.DataFrame(columns=columns) # 列名を指定する
print(df)

DataFrame(column = ["Name", "Url"]) columnはDataFrameのキーワード引数です。

DataFrameオブジェクトに行を追加してボディを作成する

se = pd.Series(['LINEから送った画像を文字起こししてくれるアプリを作るときのメモ①', 'https://review-of-my-life.blogspot.com/2018/03/moji-okosi-1.html'], columns) # 行を作成
df = df.append(se, columns) # データフレームに行を追加
df

Series(シリーズ)は、 1次元の配列のオブジェクト(リストのような形式)となります。

DataFrame(データフレーム)は、 二次元の配列のオブジェクト(表のような形式)となります。

DataFrameオブジェクトにSeriesオブジェクトを追加するのは、

表に行を追加するイメージです。

Intro to Data Structures — pandas 0.23.4 documentation

google.colabでCSVをダウンロードする

from google.colab import files
df1.to_csv("df1.csv")
files.download('df1.csv')

to_csvcsvファイルを作成します。

download(file)でファイルをダウンロードします。