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,所以打算繼續進行下去。

广告
将在 10 秒后关闭
bannerAds