Python Google Colabでスクレイピング

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

完全に趣味で個人で利用とかもせず、ただ取得して終わり。
まれにCSVとかに落とすくらいで、スクレイピングすること自体が好きなのだ。

ちょっと前はPHPでスクレイピングをしていたが、最近は環境構築をしなくて良いPythonを使ってやっている。

自分用のログとして。

#Python BeautifulSoupでスクレイピングしてみよう！
使用言語：Python

使うもの：[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

###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に投稿しようと思ったらエラー
初見殺しも酷いところ。エラーは出てるけど意味わからんすぎる。
![エラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171990/1f16facd-eff3-af00-25e3-d51a258f8b24.png)

内容が悪いのかと思いきや、タイトル下の部分だった。これはひどい
![タグの場所](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171990/d33c641a-2eed-44da-c89a-05f4976ac717.png)