はじめに
スクレイピングをやってみたいなと思いながら中々手を付けずにいましたが、ようやく一念発起して触れ、その際に調べたことをまとめました。
Webスクレイピングを始めてみようという方に参考になれば幸いです。
環境
$ python --version
Python 3.7.4
$ conda --version
conda 4.7.12
$ pip -V
pip 19.2.3 from ■■■■■■■■■■■■■■■■■■■ (python 3.7)
インストール
今回はanacondaを用いてスクレイピングを行います。
必要な方はインストールを行ってください。
anaconda Windows版
anaconda Mac版
anacondaをインストールしない場合は、下記のライブラリをpipからインストールしてください。(anacondaには標準搭載されています。)
- Requests
- Beautiful Soup 4
- lxml
$ pip install requests
$ pip install beautifulsoup4
$ pip install lxml
ライブラリについて
Requests
WebサイトのHTML・XMLの情報や画像等の取得を簡単に行うことができるHTML通信ライブラリ。
Pythonの標準ライブラリにurllibというHTTP通信ライブラリが搭載されているが、APIがまともに使えない(Requests公式見解)。
Beautiful Soup 4
取得したHTML・XMLから特定のテキストを抽出する、HTMLパーサーライブラリ。
lxml
HTMLパーサー。
Pythonにはhtml.parserが標準ライブラリとしてありますが、lxmlの方が使い勝手が良い様です。
Webスクレイピングを始めよう
某サイトのトップニュースを想定してコード例として記していきます。
記事の最後にサンプルコードをまとめて置いています。
1 pyファイルを作成し、以下の記述でrequestsとBeautifulSoup4をインポートします。
import requests
from bs4 import BeautifulSoup
2 URLを設定し、RequestsでHTMLを取得します。
url = 'https://■■■■■■■■■■■■■■/'
rq = requests.get(url)
3 HTMLパース用のオブジェクトを作成します。
bs = BeautifulSoup(rq.text, 'lxml')
4 Chromeの開発者ツールを使用し、必要な部分を探します。
トピックニュースのタイトルに共通している部分はliタグで囲まれ、クラス名が「topicsListItem」となっていますね。
<ul class="topicList">
<li class="topicsListItem">
<a href="https://●●●●●">
トップニュース1
</a>
</li>
<li class="topicsListItem">
<a href="https://▲▲▲▲▲">
トップニュース2
</a>
</li>
・
・
・
</ul>
5 4で探した条件を元にHTMLから必要部分を切り出します。
newsList = bs.find_all("li", class_="topicsListItem")
この状態ではliタグごと取得している状態になります。
6 切り取ったリストからテキスト部分のみが欲しいのでget_text()してから出力しています。
for news in newsList:
print(news.get_text())
結果
トップニュース1
トップニュース2
・
・
・
きちんと取得できましたね!
サンプルコード
import requests
from bs4 import BeautifulSoup
url = 'https://■■■■■■■■■■■■■■/'
rq = requests.get(url)
bs = BeautifulSoup(rq.text, 'lxml')
newsList = bs.find_all("li", class_="topicsListItem")
for news in newsList:
print(news.get_text())