PythonでWebスクレイピング
PythonでWebスクレイピングをやってみたかったので、土曜日にガッツリやってみた。
やりたいこと
- サイトの情報を抜き取る
- DBに登録
これを定期的にバッチ実行する
まずPythonをインストールし、適当にネットを見てると、どうやらBeautifulSoupというライブラリが役立つそうだ。
Qiitaのこの投稿がとっても役に立った
- Pythonの Beautiful Soup を使ってプロ野球選手のプロフィールをスクレイピングしてみた
https://qiita.com/s_now7man/items/2c4a7349e36ed628c72e
無事に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に取り入れたい。それについては、ここが役にたった。
- ExcelデータをINSERT文に変換する
https://utage.headwaters.co.jp/blog/?p=2954https://qiita.com/hiyo3@github/items/5213ee0c3cd6c6a1eb8b
これで、エクセルマクロでinsert文を生成できます。 ひとまずこれでDBまでは登録できました。
しかし、たとえば芸能人の情報を取ってきたいな、と思ったときに一つのサイトで完結するならいいが、サイトによってHTMLの構造違うから。
あるサイトではプロフィールにclass名つけてくれるところもあるけど、そんなのなくてtableタグで囲んでいるだけのところもある。
HTMLパーサーで分解して分析していくからHTMLの構造も固定じゃないと自動化はできないね
ということで、
やれたこと
- サイトの情報を抜き取る
- Excelに落とし込む
- Insert文生成
- DBに登録