Python3系でスクレイピングするコンテナ構築
簡単なアプリを作るためにスクレイピングする必要があり、勉強がてらコンテナ上にPythonを使って構築しました。
Yahoo!ニューストップのaタグのリンク先URLを出力するサンプルをGitHubにアップロードしています。
docker-sample/scraping at master · nagamoto/docker-sample · GitHub
概要
構築やライブラリ選定にあたって以下の記事を参考にしています。
dockerfileについて
docker-sample/dockerfile at master · nagamoto/docker-sample · GitHub
ベースimageにはalpineではなくslim-busterのものを利用しています。VSCodeの拡張機能で便利にdockerコンテナに接続できるようになりましたが、alpineはサポートしていない*1ため、手元での取り回しやすさを優先しました。
ライブラリ使用例
Requestsライブラリ
headers = {"User-Agent": "your user agent"} URL = "https://news.yahoo.co.jp/" response = requests.get(URL, timeout=1, headers=headers)
docker-sample/app.py at master · nagamoto/docker-sample · GitHub
わかりやすすぎて特に言うことがないほどです
User-Agentについては、UserAgent調べる君でも利用して、実際に自分の環境のものを使用するとより安心です。
BeautifulSoupライブラリ
soup = BeautifulSoup(response.text, 'lxml') #要素を抽出 for a_tag in soup.find_all('a'): print(a_tag.get('href')) #リンクを表示
docker-sample/app.py at master · nagamoto/docker-sample · GitHub
aタグ要素をリストで取得して、そのhref属性を読み取っていることが直感的に理解できます。
使いやすいライブラリが充実しており、Pythonがスクレイピングに向いていると言われる理由がよくわかりました。
サンプルのdockerコンテナ利用方法
サンプルを起動する場合はCLIで次のように操作してください。
docker build -t scraping . # dockerfileがあるディレクトリで実行 docker run --rm --name scraping scraping
基本的なコマンドしか利用していませんが、ビルド時のタグ名指定と停止時にコンテナを破棄するオプションを設定しています。
最後に
スクレイピングを行う場合にPythonはとても便利だと感じてもらえたかと思います。Python学習の入り口としてはとてもとっつきやすいため、おすすめです。
また、スクレイピングをする場合には他にもRubyやNode.jsなど選択肢に上がります。*2基本的には実装・保守をするチームが扱いやすい言語を選べばいいでしょう。
ちなみに私はFirebaseと連携するためにCloud Functionsを利用したいと考えているので、Node.jsで実装し直す事になりそうです。*3
*1:insiders版であればalpineにも接続できます。
*2:比較参考記事: https://qiita.com/Octoparse_Japan/items/14304b5bd9fb84945ec3
*3:Cloud FunctionsはNode.js環境のみのため