PyQueryでJQueryのようにスクレイピングする【Python】

プログラミング

Pythonでスクレイピングを気軽に行いたいですか?
JQueryを使うことができますか?

上記の質問に両方ともYesなら、PyQueryの出番です。
PyQueryを使えば、jQueryの要領でスクレイピングができます。

本記事の内容

  • PyQueryとは?
  • PyQueryのシステム要件
  • PyQueryのインストール
  • PyQueryでスクレイピングする
  • PyQueryの限界

それでは、上記に沿って解説していきます。

PyQueryとは?

PyQuery
https://pypi.org/project/pyquery/

上記ページでは、スクレイピングについては言及されていません。
しかし、 PyQueryはスクレイピングに利用できます。

PHPの経験者なら、phpQueryというライブラリを知っているかもしれません。
phpQueryのPython版だと考えれば理解しやすいでしょう。

このPyQueryですが、リリースは2008年です。
結構な歴史があるということになります。

そして、2021年1月時点では、1.4.3が最新バージョンです。
2020年10月21日にリリースされています。
このことから、メンテナンスも継続されていると言えますね。

以上より、PyQueryのざっくりとしたイメージはつかめたと思います。
では、PyQueryのシステム要件を確認しましょう。

PyQueryのシステム要件

OSに関しては、特に表記がありません。
よって、Windows、macOS、Linuxのどこでも動くのでしょう。

Pythonが動けば、PyQueryはどこでも動くということでしょう。
そうだとすると、iOSやAndroidでも動くかもしれませんね。

最も注意するべきは、Pythonのバージョンです。
PyQuery最新版の1.4.3は、以下のバージョンに対応しています。

  • Python 3
  • Python 3.5
  • Python 3.6
  • Python 3.7

明記されているのは、上記です。
Python 3と記載されているので、3.8以降でも普通に動くでしょう。

今回は、そのPython 3.8で試してみます。

>python -V
Python 3.8.6

以上が、PyQueryのシステム要件となります。
システム要件を確認する限り、特にクセのあるライブラリではありませんね。

素直にインストールできるはずです。
では、PyQueryを行っていきましょう。

PyQueryのインストール

最初に、現状のインストール済みパッケージを確認しておきます。

>pip list
Package    Version
---------- -------
pip        20.3.3
setuptools 51.1.1

わかりやすいように最低限のモノだけインストールした状況にしています。
次にするべきことは、pip自体の更新です。
pipコマンドを使う場合には、常に以下のコマンドを実行しておきます。

python -m pip install --upgrade pip

現時点では、pipは更新されませんでした。
pip 20.3.3が、最新だということでしょう。

では、PyQueryのインストールを行います。
インストールするのは、以下のコマンドです。

pip install pyquery

インストールは数秒で終わります。
ここで、インストールされたパッケージを確認しましょう。

>pip list
Package    Version
---------- -------
cssselect  1.1.0
lxml       4.6.2
pip        20.3.3
pyquery    1.4.3
setuptools 51.1.1

新たに追加されたのは、以下のパッケージです。

  • cssselect  1.1.0
  • lxml       4.6.2
  • pyquery    1.4.3

以上で、インストールは完了です。
最後に、動作確認を兼ねて実際にスクレイピングを行いましょう。

PyQueryでスクレイピングする

サンプルコードは、以下。

from pyquery import PyQuery as pq

url = "https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/HTML_basics"

# ページ全体のソース取得
page = pq(url)

# タグごと取得
title = page("title")
print(title)

# タグのテキスト
title_text = page("title").text()
print(title_text)

# # id指定でテキスト取得
h2_text = page("#So_what_is_HTML_really").text()
print(h2_text)

コメントを見れば、おおよその意味はわかるでしょう。
というよりは、jQueryと同じですね。

このコードの実行結果は、以下。

<title>HTML の基本 - ウェブ開発を学ぶ | MDN</title>
HTML の基本 - ウェブ開発を学ぶ | MDN
そもそも HTML とは

問題ありませんね。
以上で、PyQueryの動作確認は終わりです。

ただし、PyQueryには限界があります。
最後に、この限界について説明しておきます。

PyQueryの限界

次のコードを実行すると、エラーになります。

from pyquery import PyQuery as pq

url = "https://twitter.com/Sankei_news/status/1346244949960921090"

# ページ全体のソース取得
page = pq(url)

# タグのテキスト
text = page("title").text()
print(text)

エラーの内容は、以下。

urllib.error.HTTPError: HTTP Error 400: Bad Request

Twitterにアクセスをはじかれた形になっています。
このプログラムによるアクセスが、ロボット(プログラム)だと判定されたのです。

そもそも、Twitterはスクレイピングを禁止しています。

だから、プログラムによるアクセスがはじかれたということです。
Twitterのように、プログラムによるアクセスをはじいているサイトは他にもあります。

Amazon、Instagramなどもそうです。
それじゃあ、それらのサイトはスクレイピングできないのでしょうか?

できます。
それらのサイトをスクレイピングする方法を以下の記事で解説しています。

以上より、簡単にスクレイピングできるサイトとそうではないサイトが存在しています。
そして、簡単なサイトであれば、PyQueryで十分です。

しかし、簡単ではない場合は、Seleniumを使う必要があります。
Seleniumに関しては、当ブログに多くに記事があるので参考にしてください。

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