Cá nhân tôi thích sử dụng phế liệu và selen và neo cả hai trong các thùng chứa riêng biệt. Bằng cách này, bạn có thể cài đặt cả hai với rắc rối tối thiểu và thu thập dữ liệu các trang web hiện đại mà hầu như tất cả đều chứa javascript ở dạng này hay dạng khác. Đây là một ví dụ:
Sử dụng scrapy startproject
để tạo cạp và viết con nhện của bạn, bộ xương có thể đơn giản như thế này:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['https://somewhere.com']
def start_requests(self):
yield scrapy.Request(url=self.start_urls[0])
def parse(self, response):
# do stuff with results, scrape items etc.
# now were just checking everything worked
print(response.body)
Phép thuật thực sự xảy ra trong phần mềm trung gian. Ghi đè hai phương thức trong phần mềm trung gian của trình tải xuống __init__
và process_request
, theo cách sau:
# import some additional modules that we need
import os
from copy import deepcopy
from time import sleep
from scrapy import signals
from scrapy.http import HtmlResponse
from selenium import webdriver
class SampleProjectDownloaderMiddleware(object):
def __init__(self):
SELENIUM_LOCATION = os.environ.get('SELENIUM_LOCATION', 'NOT_HERE')
SELENIUM_URL = f'http://{SELENIUM_LOCATION}:4444/wd/hub'
chrome_options = webdriver.ChromeOptions()
# chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
self.driver = webdriver.Remote(command_executor=SELENIUM_URL,
desired_capabilities=chrome_options.to_capabilities())
def process_request(self, request, spider):
self.driver.get(request.url)
# sleep a bit so the page has time to load
# or monitor items on page to continue as soon as page ready
sleep(4)
# if you need to manipulate the page content like clicking and scrolling, you do it here
# self.driver.find_element_by_css_selector('.my-class').click()
# you only need the now properly and completely rendered html from your page to get results
body = deepcopy(self.driver.page_source)
# copy the current url in case of redirects
url = deepcopy(self.driver.current_url)
return HtmlResponse(url, body=body, encoding='utf-8', request=request)
Đừng quên bật phần mềm trung gian này bằng cách bỏ ghi chú các dòng tiếp theo trong tệp settings.txt:
DOWNLOADER_MIDDLEWARES = {
'sample_project.middlewares.SampleProjectDownloaderMiddleware': 543,}
Tiếp theo cho dockerization. Tạo ảnh của bạn Dockerfile
từ một hình ảnh nhẹ (Tôi đang sử dụng python Alpine tại đây), sao chép thư mục dự án của bạn vào đó, yêu cầu cài đặt:
# Use an official Python runtime as a parent image
FROM python:3.6-alpine
# install some packages necessary to scrapy and then curl because it's handy for debugging
RUN apk --update add linux-headers libffi-dev openssl-dev build-base libxslt-dev libxml2-dev curl python-dev
WORKDIR /my_scraper
ADD requirements.txt /my_scraper/
RUN pip install -r requirements.txt
ADD . /scrapers
Và cuối cùng kết hợp tất cả lại với nhau trong docker-compose.yaml
:
version: '2'
services:
selenium:
image: selenium/standalone-chrome
ports:
- "4444:4444"
shm_size: 1G
my_scraper:
build: .
depends_on:
- "selenium"
environment:
- SELENIUM_LOCATION=samplecrawler_selenium_1
volumes:
- .:/my_scraper
# use this command to keep the container running
command: tail -f /dev/null
Chạy đi docker-compose up -d
. Nếu bạn đang làm điều này lần đầu tiên, sẽ mất một lúc để nó tìm nạp selenium / độc lập-chrome mới nhất và xây dựng hình ảnh cạp của bạn.
Khi đã xong, bạn có thể kiểm tra xem các thùng chứa của bạn có đang chạy không docker ps
và cũng kiểm tra xem tên của thùng chứa selen có khớp với biến môi trường mà chúng ta đã chuyển đến thùng chứa cạp không (ở đây, nó làSELENIUM_LOCATION=samplecrawler_selenium_1
).
Nhập bộ chứa cạp của bạn với docker exec -ti YOUR_CONTAINER_NAME sh
, lệnh cho tôi là docker exec -ti samplecrawler_my_scraper_1 sh
, cd vào thư mục bên phải và chạy bộ cạp của bạn với scrapy crawl my_spider
.
Toàn bộ điều này nằm trên trang github của tôi và bạn có thể lấy nó từ đây