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.
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