Python で Web スクレイピングを実装する

シェアする

Python で Web スクレイピングを実装します。

Python で Web スクレイピングをする場合、パッケージでいくつか選択肢が出てきますが、今回は最もシンプルな requests + BeautifulSoup で実装したいと思います。

別の選択肢としては、より高機能な Selenium や Scrapy などがありますが、requests + BeautifulSoup でも基本的なことは実装できますので、用途に合わせて選択すれば良いと思います。

バージョン

  • Python 3.5.4
  • requests 2.21.0
  • BeautifulSoup 4.7.1

環境構築

$ mkdir web-scraping
$ cd web-scraping/
$ python -m venv venv
$ source venv/bin/activate
(venv) $ pip install requests beautifulsoup4

はじめに環境を構築します。今回は Mac で環境を作りました。

まず、virtualenv で Python の仮想環境を作り、その中に requests と BeautifulSoup をインストールします。

実装

環境構築の次は、実装していきます。

Web スクレイピングの内容ですが、ある検索キーワードを Google 検索に投げ、その検索結果を抽出するようなプログラムを実装したいと思います。

コマンドラインオプション

import argparse

parser = argparse.ArgumentParser(description='Google Search Web Scraping.')
parser.add_argument('--num', default=5, type=int, help='Number.')
parser.add_argument('--query', help='Search Query.')
args = parser.parse_args()

今回のプログラムは、コマンドでの実行形式にしたいと思いますので、argparse を使って、オプションを定義します。

検索結果数を決める –num というオプションと検索クエリの –query という二つのオプションを定義しています。

Google 検索

import requests

res = requests.get('http://google.com/search?q=' + args.query)
res.raise_for_status()

コマンドラインオプションの次は、Google 検索に投げる部分の実装をします。と言っても、requests で get しているだけです。

Google 検索結果のHTMLを解析

import bs4

soup = bs4.BeautifulSoup(res.text, 'html.parser')
link_elems = soup.select('.r a')
num_open = min(args.num, len(link_elems))

for i in range(num_open):
    rank = i + 1
    url = link_elems[i]['href']
    title = link_elems[i].get_text()
    print_line = '{rank}, {url}, {title}'.format(rank=rank, url=url, title=title)
    print(print_line)

requests で検索結果 HTML を取得したら、BeautifulSoup で HTML を解析します。Google 検索結果の HTML では、<div class=”r”><a> という形が1つの結果となっていますので、この要素を取得するために、soup.select(‘.r a’) としています。もちろん Google が HTML 変えた場合は、それに合わせて修正する必要があります。

あとは、好きな形で出力すればOKです。上記ではカンマ区切りで、出力していますので、リダイレクトでファイルを指定すれば、CSV ファイルが出来上がります。

search_google.py

import argparse, requests, bs4

parser = argparse.ArgumentParser(description='Google Search Web Scraping.')
parser.add_argument('--num', default=5, type=int, help='Number.')
parser.add_argument('--query', help='Search Query.')
args = parser.parse_args()

res = requests.get('http://google.com/search?q=' + args.query)
res.raise_for_status()

soup = bs4.BeautifulSoup(res.text, 'html.parser')
link_elems = soup.select('.r a')
num_open = min(args.num, len(link_elems))

for i in range(num_open):
    rank = i + 1
    url = link_elems[i]['href']
    title = link_elems[i].get_text()

    print_line = '{rank}, {url}, {title}'.format(rank=rank, url=url, title=title)
    print(print_line)

全てを合わせると上記のようなプログラムになりました。

動作確認

(venv) $ python google_search.py --query PythonでWebスクレイピング
1, /url?q=https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406&sa=U&ved=0ahUKEwiSsIaY86nhAhUEyIsBHdS9AHcQFggUMAA&usg=AOvVaw2wh9K11qmlnQQ0YZvxhVTP, Python Webスクレイピング 実践入門 - Qiita
2, /url?q=https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a&sa=U&ved=0ahUKEwiSsIaY86nhAhUEyIsBHdS9AHcQFggdMAE&usg=AOvVaw0D97Lw-_eBD4YPXRkG-URC, Python Webスクレイピング テクニック集「取得できない値は無い ... - Qiita
3, /url?q=https://www.sejuku.net/blog/51241&sa=U&ved=0ahUKEwiSsIaY86nhAhUEyIsBHdS9AHcQFggjMAI&usg=AOvVaw3GbB7VwOKM6TAGsbHQgZHc, 初心者向けにPythonでWebスクレイピングをする方法をまとめる | 侍 ...
4, /url?q=https://yokonoji.work/python-scraping-1&sa=U&ved=0ahUKEwiSsIaY86nhAhUEyIsBHdS9AHcQFggtMAM&usg=AOvVaw3Zan78RUlc9z2od5u_4mkv, 素人がPythonでWebスクレイピングを実装する1 | よこのじ.work
5, /url?q=https://takahiromiura.github.io/&sa=U&ved=0ahUKEwiSsIaY86nhAhUEyIsBHdS9AHcQFggzMAQ&usg=AOvVaw1ezehUi5xubBN9nvoCiAC_, Python による Web スクレイピングにようこそ! — Python で行う Web ...

実行すると上記のようになりました。「PythonでWebスクレイピング」という検索ワードで実行しています。やはり、技術系ネタは Qiita 強いですね。

まとめ

Python で Web スクレイピングを実装しました。

requests は Web スクレイピングだけではなく、様々な場所で使うパッケージなので、覚えておきましょう。

また、BeautifulSoup は、その HTML 解析スピード、レスポンスの早さに最初は驚きました。その感動を皆さんも実感して欲しいので、是非とも試してみてください。

シェアする

フォローする