1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python Google Colabでスクレイピング

Posted at

スクレイピングが好きだ。
ただスクレイピング禁止のサイトも多いので気をつけている。

完全に趣味で個人で利用とかもせず、ただ取得して終わり。
まれに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めちゃくちゃ書きづらい。マークダウンがよくわからん。。。

他の人たち自分以外全員見やすいのになんでだ。

##Qiitaに投稿しようと思ったらエラー
初見殺しも酷いところ。エラーは出てるけど意味わからんすぎる。
エラー

内容が悪いのかと思いきや、タイトル下の部分だった。これはひどい
タグの場所

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?