たうブログ

東京で働くIT系会社員 主にIT系/ギター/旅行/映画/筋トレ等

PythonでWebスクレイピング

PythonでWebスクレイピングをやってみたかったので、土曜日にガッツリやってみた。

やりたいこと

  • サイトの情報を抜き取る
  • DBに登録
    これを定期的にバッチ実行する

まずPythonをインストールし、適当にネットを見てると、どうやらBeautifulSoupというライブラリが役立つそうだ。

Qiitaのこの投稿がとっても役に立った

無事にBeautifulSoupインストールできた。 取得結果をコマンドプロンプト上に出すだけだったら上記だけで行ける。 サイトごとにhtml.parsed.select(~~)の中の書き方を変えてあげれば。 ただし、エクセルに出力したりDBに書き込むやり方は書いてない。

そこで、ここが役にたった

ここではエクセルに落とし込むやり方が書いてある。
※直接DB登録はさらにハードル上がるので今回はパス
ちなみにここで出てくるxlutilsのインストールは
easy_instal xlutils
でいけた。(シャープいらんかった)

最終的にはこんな感じ

from urllib.request import urlopen
from bs4 import BeautifulSoup
from xlwt import Workbook

url = '~~~URL~~~'
htmlData = urlopen(url).read()
htmlParsed = BeautifulSoup(htmlData, 'html.parser')
numrow=0
numcol=0
wb = Workbook()
ws = wb.add_sheet( "~~シート名~~" )

for div in htmlParsed.select('~~CSSセレクタ~~'):
    player_url = '~~ドメイン部~~' + div.get("href")
    player_htmlData = urlopen(player_url).read()
    htmlParsed2 = BeautifulSoup(player_htmlData, 'html.parser')

    htmlParsed2.select_one('~~CSSセレクタ~~')
    print(''.join(div.text.split()))
    ws.write( numrow, 0, ''.join(div.text.split()))
    numcol=1
    for detail in htmlParsed2.select('.meat'):
        #strip()で先頭末尾の余計な空白削除
        print(detail.string.strip())
        ws.write( numrow, numcol, detail.string.strip())
        numcol+=1
    print('--------------------')
    numrow+=1

wb.save( "~~保存名~~.xls" )

ところどころデバッグ用にprint()書いてます。
さて、これでデータは表形式に落とし込めた

最後はこれをDBに取り入れたい。それについては、ここが役にたった。

これで、エクセルマクロでinsert文を生成できます。 ひとまずこれでDBまでは登録できました。

しかし、たとえば芸能人の情報を取ってきたいな、と思ったときに一つのサイトで完結するならいいが、サイトによってHTMLの構造違うから。
あるサイトではプロフィールにclass名つけてくれるところもあるけど、そんなのなくてtableタグで囲んでいるだけのところもある。 HTMLパーサーで分解して分析していくからHTMLの構造も固定じゃないと自動化はできないね

ということで、

やれたこと

  • サイトの情報を抜き取る
  • Excelに落とし込む
  • Insert文生成
  • DBに登録