【python】requests-htmlでwebスクレイピング

スポンサーリンク
プログラミング

webスクレイピングをするためのpythonのrequests-htmlの使い方を説明したいと思います。

webスクレイピングを行うには「Beautiful soup」,「Pyppeteer」,「requests」,「PyQuery」などを利用する方法がある。しかし「requests-html」はこれらの機能が入っているライブラリであるためこれ一つでほとんどの作業ができてしまう。

スポンサーリンク

準備

PCはwindowsを利用する。Macの方ごめんなさい、Macを持っていないのでわからないです…。pythonのバージョンとpipのバージョン

>python -V
Python 3.9.1
>pip -V
pip 21.0.1

特に理由のない方はこれらのバージョンをアップデートしておこう。

インストール

requests-htmlのインストール
コマンドプロンプトに以下のコマンドを入力すればインストールが完了する

pip install requests-html

使用方法

実際にrequests-htmlをどのように使うかを説明していく。

GETリクエストを要求

from requests_html import HTMLSession
session = HTMLSession()
url = "https://it-syoya-engineer.com/hello-world/"
r = session.get(url)
r.htmnl.render()

まずはじめにrequests-htmlを利用するためimport文を書く。
利用するページはこのブログ開設時にはじめからあった投稿のページを利用する。
“session.get(url)”でページに対してGETリクエストを要求している。
最後の行を書くことによりブラウザで表示されるHTMLの内容を生成させます。
これで得たGETリクエストを利用していく。実行結果を書いてしまうと長くなってしまうので一部省略します。

ページ内の全てのリンク

r.html.links

絶対形式のページで見つかった全てのリンク

r.html.absolute_links

ページのベースURL

r.html.base_url
=>'https://it-syoya-engineer.com/hello-world/'

HTMLおよびHTMLResponseヘッダーから抽出された、使用されるエンコード文字列

r.html.encoding
=>'utf-8'

要素またはHTMLの全文コンテンツ(リンクを含む)

r.html.full_text

HTMLコンテンツのUnicode表現

r.html.html

要素またはHTMLのPyQuery表現

r.html.pq
=>[<html>]

HTMLコンテンツのバイト表現

r.html.raw_html

指定された解析テンプレートの要素を検索

r.html.search(str型)

要素またはHTMLのテキストコンテンツ

r.html.text

CSSセレクターを指定し、Elementオブジェクトのリストまたは単一のオブジェクトを返却

r.html.find(selector,containing,clean,first,_encoding)
引数内容引数の型
selecttor使用するCSSセレクターstr型
clean見つかったタグと<style>タグのHTMLをサニタイズするかどうか</p>bool型
containing指定した場合、提供されたテキストを含む要素のみを返すstr型またはlist型
first最初の結果だけを返すかどうかbool型
_encodingエンコード形式str型

CSSセレクターの指定方法はについてはこちらを参考にしてください。

findで得た要素に対して更に要素を検索することができる

#タグがdivの最初の要素を取得
div = r.html.find('div',first=True)
#更にその要素内のタグがaの要素を取得
div.find('a')

また、今回紹介したものはfindで得た要素に対しても使うことができる。

#タイトルを表示させる
title = r.html.find('title',first=True)
title.text
=>'Hello world! | エンジニアによるブログ'

最後に

この記事では「requests-html」の使い方を簡単に説明しました。
webスクレイピングはquests-html一つで簡単にプログラムが書けると思いました。
次は実際にこれを使ってプログラムを書いてみたいと思います。

コメント

タイトルとURLをコピーしました