ナガモト の blog

Full Cycle Developerを目指すエンジニアが有用そうな技術記事や、ポエムのようなよしなしごとを投稿するブログです。

Python3系でスクレイピングするコンテナ構築

簡単なアプリを作るためにスクレイピングする必要があり、勉強がてらコンテナ上にPythonを使って構築しました。

Yahoo!ニューストップのaタグのリンク先URLを出力するサンプルをGitHubにアップロードしています。

docker-sample/scraping at master · nagamoto/docker-sample · GitHub

概要

  • dockerのベースimageはPython公式のものを利用
  • スクレイピングに利用するライブラリはrequests, beautifulsoup4, lxml

構築やライブラリ選定にあたって以下の記事を参考にしています。

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環境のみのため