Docker + Django + Beautifulsoup 的环境配置和运行
机会
使用Docker进行开发已成为基本趋势,但我从未配置过基于Docker的开发环境。
因为之前是从Python开始学习编程,但是从来没有使用Python创作过任何东西,所以很想试着创作一些东西。
我想要做一个基于网页抓取的服务并使用Python进行网页抓取。→ 使用BeautifulSoup
Docker: 使用 Docker
首先创建Dockerfile和docker-compose.yml文件。
Docker文件
FROM python:3.6
RUN mkdir /app
WORKDIR /app
ADD requirements.txt /app
RUN pip install -r requirements.txt
ADD ./backend /app
docker-compose.yml 文件
version: '2'
services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./backend:/app
ports:
- "8000:8000"
depends_on:
- db
在这里我们使用PostgreSQL作为数据库。
要求.txt
Django
psycopg2
beautifulsoup4
使用requirements.txt文件来安装Django和Beautifulsoup。
容器的启动
构建Docker镜像。
docker-compose build
按照Django的惯例,用名为”config”的项目创建根目录。
docker-compose run --rm web django-admin startproject config .
由于容器已准备好运行,因此执行以下命令。
docker-compose up
当访问 http://localhost:8000/ 时,将显示Django的初始界面。
Django 是一個開放源碼的網頁框架。
在Django中创建一个名为”myapp”的应用,并在视图中使用BeautifulSoup。
创建应用程序
docker-compose run --rm web python manage.py startapp myapp
当您执行此操作时,将创建myapp应用程序的目录。
设定URL
在刚刚创建的myapp/urls.py文件中定义应用程序的URL,并将其配置为可以从config/urls.py文件中调用。
我的应用程序/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
配置/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('myapp/', include('myapp.urls')),
path('admin/', admin.site.urls)
]
当通过 http://localhost:8000/myapp/ 访问时,将调用“views”中的“index”函数,但是由于还没有对其进行定义,需要创建一个名为“index”的函数。
创建一个视图
我的应用程序视图文件是myapp/views.py。
from django.shortcuts import render
def index(request):
return render(request, 'myapp/index.html')
当你访问之前的URL时,现在将调用此方法,但是因为尚未创建“index.html”,需要先创建它。
创建模板
在使用Django创建模板时,需要在应用程序下创建一个名为「templates」的目录,并在其中创建各个模板。
我的应用程序/模板/我的应用程序/首页.html
<h1>Hello Django</h1>
终于在屏幕上显示出了写着“Hello Django”的内容。
美丽的汤
使用BeautifulSoup可以从HTML或XML中提取特定的数据。
使用Beautifulsoup从View中提取信息
我的应用程序视图.py
from django.shortcuts import render
from bs4 import BeautifulSoup
import urllib.request
def index(request):
# 対象サイトのURL
url = "http://www.nikkei.com/"
# スクレイピング
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
# 全てのaタグを抽出
links = soup.find_all('a')
# テンプレートに渡すデータを格納
context = {
'links': links,
}
return render(request, 'myapp/index.html', context)
我的应用程序/模板/我的应用程序/首页.html
{{ links }}
应该可以从目标网站上提取所有的”a”标签,并将其显示在屏幕上。
結束
暫時先使用Docker搭建Django的開發環境,成功使用了Beautifulsoup。
目前還沒有使用PostgreSQL,且希望將Django用作API,前端使用React,所以打算繼續進行下去。