LoginSignup
5
7

More than 3 years have passed since last update.

多分動くから! スクレイピングやってみよう!

Last updated at Posted at 2020-10-04

はじめに

スクレイピングをやってみたいなと思いながら中々手を付けずにいましたが、ようやく一念発起して触れ、その際に調べたことをまとめました。
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から必要部分を切り出します。
python
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())
5
7
0

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
5
7