+2

Selenium, Docker và Django

Giới thiệu

Hiện nay việc crawl dữ liệu, hoặc sử dụng Selenium để thực hiện các hành động một cách tự động khá là phổ biến. Vậy bây giờ bạn muốn tạo ra một trang web mà có thể crawl dữ liệu hay thực hiện gì đó với Selenium mà chưa biết cách làm thì hôm nay mình sẽ chỉ các bạn cách crawl dữ liệu bằng Selenium và lưa nó vào PostgreSQL trên Docker với trang web được viết bằng Django. image.png

Cài đặt

Cài đặt project

Để bắt đầu với dự án django thực hiện các lệnh sau đây

pip install django
django-admin startproject app
django-admin startapp product

Khởi tạo project

Làm việc với Django

Sau khi khởi tạo project xong. Thì thư mục của bạn sẽ như này.

app
  app
    __init__.py
    asgi.py
    setting.py
    urls.py
    wsgi.py
  product
    __init__.py
    admin.py
    apps.py
    models.py
    test.py
    views.py
manage.py

Chỉnh sửa models.py trong app product Trong file này bạn tạo một model Product.

from django.db import models
from django.contrib.auth.models import User

class Product(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    category = models.CharField(max_length=200)
    price = models.IntegerField()
    url = models.URLField(max_length=2000)
    def __str__(self) -> str:
        return self.title

Tạo 1 file urls.py trong app product

app
  app
    __init__.py
    asgi.py
    setting.py
    urls.py
    wsgi.py
  product
    __init__.py
    admin.py
    apps.py
    models.py
    urls.py
    test.py
    views.py
manage.py

Chỉnh sửa urls.py vừa khởi tạo. Sau đó trong views.py của product bạn tự thực hiện các bước còn lại. Nếu không thì bạn có thể tìm hiểu ở trang chủ Django

from django.conf import settings
from . import views

app_name = 'product'

urlpatterns = [
    path('products/', views.products, name ='products'),
]

Chỉnh sửa urls.py trong app

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('product.urls')),
]

Làm việc với Selenium

Sau đó bạn tạo một file getdata.py ở trong app product

app
  app
    __init__.py
    asgi.py
    setting.py
    urls.py
    wsgi.py
  product
    __init__.py
    admin.py
    apps.py
    getdata.py
    models.py
    urls.py
    test.py
    views.py
manage.py

Trong getdata.py bạn tạo một hàm để lấy dữ liệu. Khi nào bạn cần lấy dữ liệu cứ import và gọi hàm này là được. Bạn có thể tìm hiểu thêm về Selenium

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

def data_scrap(link):
  driver = webdriver.Remote("http://selenium:4444/wd/hub", DesiredCapabilities.CHROME)
  driver.get(link)
  //Bạn có thể viết code lấy dữ liệu ở đây

  driver.close()

Chỉnh sửa file setting.py


ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'product',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

STATIC_URL = '/static/'
STATIC_DIR = os.path.join(BASE_DIR, 'static')

STATICFILES_DIRS = [
    STATIC_DIR,
]

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Làm việc với Docker

Đầu tiên bạn hãy tạo một file Dockerfile trong project app

app
  app
    __init__.py
    asgi.py
    setting.py
    urls.py
    wsgi.py
  product
    __init__.py
    admin.py
    apps.py
    getdata.py
    models.py
    urls.py
    test.py
    views.py
Dockerfile
manage.py

Tạo và chỉnh sữa file requirements.txt trong project app

selenium==3.141.0
webdriver-manager==3.2.2
psycopg2==2.8.6
psycopg2-binary>=2.8

Chỉnh sửa file Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt /app/
RUN apt-get update \
    && apt-get -y install libpq-dev gcc
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Tạo và chỉnh sữa file docker-compose.yml. Ở đây db dùng cho database postgres, web để chạy server django, còn selenium thực lấy dữ liệu

version: "3.9"

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

  selenium:
    image: selenium/standalone-chrome
    ports:
    - 4444:4444

Thự mục sau khi thực hiện các hành động

app
  app
    __init__.py
    asgi.py
    setting.py
    urls.py
    wsgi.py
  product
    __init__.py
    admin.py
    apps.py
    getdata.py
    models.py
    urls.py
    test.py
    views.py
Dockerfile
docker-compose.yml
requirements.txt
manage.py

Khởi chạy dự án

docker-compose build
docker-compose run web python manage.py makemigrations
docker-compose run web python manage.py migrate
docker-compose up

Sau đó bạn vào http://127.0.0.1:8000/ để xem kết quả

Cảm ơn các bạn đã quan tâm


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.