スクレイピングでメンタリストDaiGoさんがおすすめする本を調べる方法!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

f:id:slopebook:20180524172813j:plain
こんにちは!
今回はプログラミング初心者でも簡単にできるスクレイピングのやり方を環境構築からCSVで出力するまでご紹介します。
プログラミング1年ちょっとの僕でも調べてスクレイピングするとサクッと3時間くらいでできました!

ちなみにDockerもスクレイピングもほぼ初めてでした!

そんな初スクレイピングのきっかけは、こちらの記事に詳しく書いてあるのですが、簡単に言うとめっちゃいろんなことに詳しいメンタリストのDaiGoさんのおすすめの本とはどういう本なのか!って感じです。

やり終えてみると「プログラミング覚えててよかった〜」と心底思いました。なんせスクレイピングしたページ数は約250ページ!本の数は1000行以上!!!
人力でやるには趣味の範疇を超えますね、、、w

f:id:slopebook:20180524172216p:plain

開発環境

docker for mac
python 3.6
BeautifulSoup
requests

環境構築

開発環境ができてる方は飛ばしてください。

開発環境はDockerでサクッと作りました。
ソースコードはローカルで作成し、実行などをdockerコンテナで行いました。

dockerのインストール

docs.docker.com

バージョン確認

$ docker --version
Docker version 1.13.1, build 092cba3

Docker Hubから公式イメージを入手

こちらのサイトでイメージが配布されています。

Pythonの公式のイメージがあったので今回はそのイメージを利用します。

https://hub.docker.com/_/python/

$ sudo docker pull python:3.6

バージョンはsudo docker pull python:<バージョン>で指定できます。

バージョン確認

$ docker images
REPOSITORY  TAG    ...
python      3.6    ...

コンテナ起動 & ホストのディレクトリをマウント

docker run -itでコンテナを作成し、/bin/bashでログイン、-vでマウントしています。

$ docker run -v {ホスト側のディレクトリ}:{docker内のディレクトリ} -it {イメージ名} /bin/bash
$ docker run -v /Users/username/hoge/:/home/username/ -it python /bin/bash

OS情報確認

# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Pythonとpipのバージョン確認

# python --version
Python 3.6.2
# pip --version
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)

必要なものをインストール + ユーザー追加 + 動作確認

# apt update
# apt install -y vim
# apt install sudo
# adduser username
# gpasswd -a username sudo
# su - username

Pythonの動作確認
/home/username/に移動し、
$ vim hello_world.pyで作成し、

#-*- coding: utf-8 -*-
print("hello world")

python hello_world.pyで定番の出力ができればOKです。

Dockerの使い方

コンテナIDのところはコンテナ名でもいけます。

docker ps -a              #コンテナ一覧
docker start コンテナID #コンテナ起動、
docker stop コンテナID #コンテナ停止
docker exec -it コンテナ名 /bin/bash #ログイン

スクレイピング

スクレイピングについては注意点がいくつかあります。
こちらをご参照ください。

導入

今回はbeautifulsoup4とrequestsを使用します。

$ pip install requests
$ pip install beautifulsoup4

コーディング

対象のURLのページ数をfor文で指定しています。
アクセスの感覚は2秒開けて実行しています。

for i in range(249):
i += 1
get_books_name(i)
sleep(2)

指定したURLにgetでrequestを送り、取得したHTMLのhrefにhttp://www.amazon.co.jpが入っているものをfind_allで全て取得し、IF文で余計なものを省くようにしています。
ちなみに、
soup.body.find_all(href=re.compile("http://www.amazon.co.jp") は、
soup = 指定されたURLで取得したHTMLの中の、
body = bodyタグの中の、
find_all(href=re.compile(“http://www.amazon.co.jp“) = hrefにhttp://www.amazon.co.jpが入っているもの、 と言う感じです。

url = "http://ch.nicovideo.jp/mentalist/blomaga?page=" + str(num)
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
for title in soup.body.find_all(href=re.compile("http://www.amazon.co.jp")):
if title.text != "" and title.text != "Amazon.co.jpで詳細を見る":

csvで保存。

with open('books.csv', 'a') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(title)

コード

import requests
from bs4 import BeautifulSoup
import csv
import re
from time import sleep
def get_books_name(num):
url = "http://ch.nicovideo.jp/mentalist/blomaga?page=" + str(num)
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
for title in soup.body.find_all(href=re.compile("http://www.amazon.co.jp")):
if title.text != "" and title.text != "Amazon.co.jpで詳細を見る":
with open('books.csv', 'a') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(title)
for i in range(249):
i += 1
get_books_name(i)
sleep(2)

最後に

私でも簡単にサクッとdockerの環境構築、スクレイピングcsv出力ができてちょっと自信がつきました。データを取得して分析とかも今後やってみたいなーと思いましたね!

皆さんもぜひ自分が欲しいデータをスクレイピングしてみてください!

↓興味があったらフォローお願いします!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*