スクレイピングが好きだ。
ただスクレイピング禁止のサイトも多いので気をつけている。
完全に趣味で個人で利用とかもせず、ただ取得して終わり。
まれにCSVとかに落とすくらいで、スクレイピングすること自体が好きなのだ。
ちょっと前はPHPでスクレイピングをしていたが、最近は環境構築をしなくて良いPythonを使ってやっている。
自分用のログとして。
#Python BeautifulSoupでスクレイピングしてみよう!
使用言語:Python
使うもの:Colaboratory
###1. Colaboratoryを開く
ファイル>新規作成で新しいノートブックを開く
###2. 必要なものをimportする
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import re
*requests = サイト情報を取る?
*BeautifulSoup = requestsで取れた情報を整形する?
*time = 時間関係のことを使えるようになる?
*pandas = 取得したデータを見やすくする感じのやつ?
*re = 正規表現を使うためのやつ
###3.まず取得したいサイトのURLをurlに入れる
url = "XXXXXXXXXXXXXXXX"
###4.次にそのURLを使い、htmlの情報を取得する。
(これは何も考えずに定型として使う。)
res = requests.get(url)
res.raise_for_status()
html = BeautifulSoup(res.text, 'lxml')
###5.あとは欲しい箇所をfindやfind_allを使って取得する
例)メディアサイトのタイトルをバッと取得したい時。
検証で記事タイトルの要素とclass名を確認する。
<div class=main_title">自己紹介記事</div>
だったとしたら、適当に変数名を書いてそこに代入
ここでは記事タイトル一覧が欲しいのでfind_allを使い、”div”のクラス名”main_title”を使う。
main_title = html.find_all('div', attrs={'class': 'main_title'})
これで終わり。main_titleを出力すれば一覧が取得できたはず。
####MEMO
base_url = 'XXXXXXX' ←サイトの大元URL
url = "XXXXXXXXXX?YYYYYYYYYYYY" ←取得したいURL
data = [] ←入れ物を作る
#次のページがあるのでページ遷移のためにループさせる。
for i in range(ページ分の回数回す):
print(i+1,'回目') ←確認用に何回目のループか出力する
res = requests.get(url)
res.raise_for_status()
html = BeautifulSoup(res.text, 'lxml')
elems = html.find_all('div', attrs={'class': 'title'})
後から取得するものが増えてもいいように、タイトル直ではなく、ひとかたまりのエレメントを取得する
それを回す↓
for elem in elems:
title = elem.find('a', attrs={'class': 'main_title'})
title = elem.text.replace('\u3000', ' ') ←都合の悪い文字があれば置換する
title_url = elem.get('href') ←リンクを取得
title_url = title_url.split('?')[0] ←リンク取得時に?以降の部分は不要だったので切り離し、必要な[0]の部分だけ取得
title_url = base_url+title_url ←取得したリンクに頭のhttps://XXXX~がなかったので、用意しておいたbase_urlとくっつけて、繋がるURLを生成する。
details = {} ←これはよくわからん
datum = details ←なんか入れる
datum['タイトル'] = title ←適当なカラム名をつけ取得したものを、入れておく
datum['タイトルURL'] = title_url ←リンクも同様に
data.append(datum) ←appendでdataを追加していく
time.sleep(1) ←サイトに負荷がかからないように何秒か待つ処理を入れる。 timeをimportしてないと使えない
# 次のページのリンクを取得する
#select()を使う。
*1: サイトで検証を押し、右クリックすると”コピー”があるのでカーソルをもっていき、”copy selector”を選択する
next_page = html.select('*1を入れる')
next_page = next_page[0]
next_page = next_page.get('href') ←リンク部分だけを取得
url = base_url+next_page ←次ページのリンクをurlに入れることで、次にforを回した時urlが書き代わってページ遷移の処理ができる。
time.sleep(2) ←なんとなく2秒待たせる
##絶対に注意しないといけないこと
・スクレイピングが禁止ではないか
・for文などが無限ループしないか
そしたら取得したdataを整形してみる
df = pd.DataFrame(data)
良さそうで出力が必要であれば。
df.to_csv('ファイル名.csv', index=False)
実行するとGoogle Colabに保存されるので、そこからダウンロードすることが可能になる。
終わり。
Qiitaめちゃくちゃ書きづらい。マークダウンがよくわからん。。。
他の人たち自分以外全員見やすいのになんでだ。