
Adélia Cruz
Neural Network Developer

Scrapy-Playwright là một middleware tích hợp Scrapy, một framework web scraping mạnh mẽ và nhanh chóng cho Python, với Playwright, một thư viện tự động hóa trình duyệt. Sự kết hợp này cho phép Scrapy xử lý các trang web nặng JavaScript bằng cách tận dụng khả năng hiển thị nội dung động của Playwright, tương tác với các trang web và quản lý các ngữ cảnh trình duyệt một cách liền mạch.
Trong khi Scrapy rất phù hợp cho việc scraping các trang web tĩnh, nhiều trang web hiện đại phụ thuộc nhiều vào JavaScript để hiển thị nội dung một cách động. Các con nhện Scrapy truyền thống có thể gặp khó khăn với những trang web này, thường bỏ lỡ dữ liệu quan trọng hoặc không thể điều hướng các cấu trúc trang phức tạp. Scrapy-Playwright khắc phục khoảng cách này bằng cách cho phép Scrapy điều khiển một trình duyệt không đầu, đảm bảo rằng tất cả nội dung động được tải đầy đủ và có thể truy cập để scraping.
Để bắt đầu với Scrapy-Playwright, bạn cần cài đặt cả Scrapy và Playwright. Dưới đây là cách bạn có thể thiết lập môi trường của mình:
Cài đặt Scrapy:
pip install scrapy
Cài đặt Scrapy-Playwright:
pip install scrapy-playwright
Cài đặt trình duyệt Playwright:
Sau khi cài đặt Playwright, bạn cần cài đặt các binary trình duyệt cần thiết.
playwright install
Đầu tiên, tạo một dự án Scrapy mới nếu bạn chưa có:
scrapy startproject myproject
cd myproject
Tiếp theo, bạn cần bật Playwright trong cài đặt của dự án Scrapy. Mở settings.py và thêm các cấu hình sau:
# settings.py
# Bật middleware Playwright downloader
DOWNLOADER_MIDDLEWARES = {
'scrapy_playwright.middleware.ScrapyPlaywrightDownloadHandler': 543,
}
# Chỉ định trình xử lý tải xuống cho HTTP và HTTPS
DOWNLOAD_HANDLERS = {
'http': 'scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler',
'https': 'scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler',
}
# Bật cài đặt Playwright
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'
# Cài đặt Playwright (tùy chọn)
PLAYWRIGHT_BROWSER_TYPE = 'chromium' # Có thể là 'chromium', 'firefox' hoặc 'webkit'
PLAYWRIGHT_LAUNCH_OPTIONS = {
'headless': True,
}
Với việc thiết lập hoàn tất, hãy tạo một con nhện đơn giản sử dụng Playwright để scraping một trang web được hiển thị bằng JavaScript. Để minh họa, chúng ta sẽ scraping một trang web giả định tải nội dung một cách động.
Tạo một tệp con nhện mới dynamic_spider.py bên trong thư mục spiders:
# spiders/dynamic_spider.py
import scrapy
from scrapy_playwright.page import PageCoroutine
class DynamicSpider(scrapy.Spider):
name = "dynamic"
start_urls = ["https://example.com/dynamic"]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url,
meta={
"playwright": True,
"playwright_page_coroutines": [
PageCoroutine("wait_for_selector", "div.content"),
],
},
)
async def parse(self, response):
# Trích xuất dữ liệu sau khi JavaScript đã hiển thị nội dung
for item in response.css("div.content"):
yield {
"title": item.css("h2::text").get(),
"description": item.css("p::text").get(),
}
# Xử lý phân trang hoặc các tương tác bổ sung nếu cần
Trong ví dụ trên:
playwright: True: Thông báo cho Scrapy sử dụng Playwright cho yêu cầu này.playwright_page_coroutines: Chỉ định các hành động cần thực hiện với Playwright. Ở đây, nó chờ một bộ chọn div.content để đảm bảo nội dung động đã được tải trước khi phân tích cú pháp.parse không đồng bộ: Tận dụng các khả năng không đồng bộ để xử lý phản hồi hiệu quả.Một trong những thách thức đáng kể trong việc scraping web là xử lý captcha, được thiết kế để ngăn chặn truy cập tự động. CapSolver là một giải pháp mạnh mẽ cung cấp các dịch vụ giải quyết captcha, bao gồm cả tích hợp với các công cụ tự động hóa trình duyệt như Playwright. Trong phần này, chúng ta sẽ khám phá cách tích hợp CapSolver với Scrapy-Playwright để xử lý captcha một cách liền mạch.
CapSolver là một dịch vụ giải quyết captcha tự động hóa quá trình giải quyết các loại captcha khác nhau, bao gồm captcha và reCAPTCHA. Bằng cách tích hợp CapSolver với quy trình scraping của bạn, bạn có thể bỏ qua các thách thức captcha và duy trì dòng chảy của các tác vụ scraping mà không cần can thiệp thủ công.
Để tích hợp CapSolver với Scrapy-Playwright, bạn cần:
Dưới đây là hướng dẫn từng bước để tích hợp CapSolver với Scrapy-Playwright, kèm theo ví dụ mã.
Đầu tiên, tải xuống tiện ích mở rộng trình duyệt CapSolver và đặt nó vào thư mục dự án của bạn. Giả sử tiện ích mở rộng nằm ở CapSolver.Browser.Extension.
./assets/config.json trong thư mục tiện ích mở rộng CapSolver.enabledForcaptcha thành true và điều chỉnh captchaMode thành token để giải quyết tự động.Ví dụ config.json:
{
"enabledForcaptcha": true,
"captchaMode": "token"
// các cài đặt khác giữ nguyên
}
Sửa đổi settings.py của bạn để cấu hình Playwright tải tiện ích mở rộng CapSolver. Bạn cần chỉ định đường dẫn đến tiện ích mở rộng và chuyển các đối số cần thiết cho Playwright.
# settings.py
import os
from pathlib import Path
# Cài đặt Playwright hiện có
PLAYWRIGHT_BROWSER_TYPE = 'chromium'
PLAYWRIGHT_LAUNCH_OPTIONS = {
'headless': False, # Phải là False để tải tiện ích mở rộng
'args': [
'--disable-extensions-except={}'.format(os.path.abspath('CapSolver.Browser.Extension')),
'--load-extension={}'.format(os.path.abspath('CapSolver.Browser.Extension')),
],
}
# Đảm bảo rằng reactor Twisted được đặt
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'
Lưu ý: Việc tải tiện ích mở rộng trình duyệt yêu cầu trình duyệt phải chạy ở chế độ không đầu. Do đó, đặt 'headless': False.
Tạo một con nhện mới hoặc sửa đổi một con nhện hiện có để tương tác với captcha bằng cách sử dụng tiện ích mở rộng CapSolver.
# spiders/captcha_spider.py
import scrapy
from scrapy_playwright.page import PageCoroutine
import asyncio
class CaptchaSpider(scrapy.Spider):
name = "captcha_spider"
start_urls = ["https://site.example/captcha-protected"]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url,
meta={
"playwright": True,
"playwright_page_coroutines": [
PageCoroutine("wait_for_selector", "iframe[src*='captcha']"),
PageCoroutine("wait_for_timeout", 1000), # Chờ tiện ích mở rộng xử lý
],
"playwright_context": "default",
},
callback=self.parse_captcha
)
async def parse_captcha(self, response):
page = response.meta["playwright_page"]
# Xác định vị trí hộp kiểm hoặc khung captcha và tương tác cho phù hợp
try:
# Chờ iframe captcha khả dụng
await page.wait_for_selector("iframe[src*='captcha']", timeout=10000)
frames = page.frames
captcha_frame = None
for frame in frames:
if 'captcha' in frame.url:
captcha_frame = frame
break
if captcha_frame:
# Nhấp vào hộp kiểm captcha
await captcha_frame.click("div#checkbox")
# Chờ captcha được giải quyết bởi CapSolver
await page.wait_for_selector("div.captcha-success", timeout=60000) # Điều chỉnh bộ chọn nếu cần
self.logger.info("Captcha đã được giải quyết thành công.")
else:
self.logger.warning("Không tìm thấy iframe captcha.")
except Exception as e:
self.logger.error(f"Lỗi xử lý captcha: {e}")
# Tiến hành phân tích cú pháp trang sau khi captcha được giải quyết
for item in response.css("div.content"):
yield {
"title": item.css("h2::text").get(),
"description": item.css("p::text").get(),
}
# Xử lý phân trang hoặc các tương tác bổ sung nếu cần
Đảm bảo rằng tất cả các phụ thuộc được cài đặt và chạy con nhện của bạn bằng cách sử dụng:
scrapy crawl captcha_spider
Khi bạn đã quen với các chức năng cơ bản, Scrapy-Playwright cung cấp một số tính năng nâng cao để nâng cao các dự án scraping của bạn.
Scraping nhiều trang hoặc điều hướng qua một trang web có thể được hợp lý hóa bằng cách sử dụng các khả năng điều hướng của Playwright.
# spiders/multi_page_spider.py
import scrapy
from scrapy_playwright.page import PageCoroutine
class MultiPageSpider(scrapy.Spider):
name = "multipage"
start_urls = ["https://example.com/start"]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url,
meta={
"playwright": True,
"playwright_page_coroutines": [
PageCoroutine("wait_for_selector", "div.list"),
PageCoroutine("evaluate", "window.scrollTo(0, document.body.scrollHeight)"),
],
},
)
async def parse(self, response):
# Trích xuất dữ liệu từ trang đầu tiên
for item in response.css("div.list-item"):
yield {
"name": item.css("span.name::text").get(),
"price": item.css("span.price::text").get(),
}
# Điều hướng đến trang tiếp theo
next_page = response.css("a.next::attr(href)").get()
if next_page:
yield scrapy.Request(
response.urljoin(next_page),
callback=self.parse,
meta={
"playwright": True,
"playwright_page_coroutines": [
PageCoroutine("wait_for_selector", "div.list"),
],
},
)
Playwright cho phép tạo nhiều ngữ cảnh trình duyệt, có thể hữu ích để xử lý các phiên, cookie hoặc các tác vụ scraping song song.
# settings.py
PLAYWRIGHT_CONTEXTS = {
"default": {
"viewport": {"width": 1280, "height": 800},
"user_agent": "CustomUserAgent/1.0",
},
"mobile": {
"viewport": {"width": 375, "height": 667},
"user_agent": "MobileUserAgent/1.0",
"is_mobile": True,
},
}
Trong con nhện của bạn, chỉ định ngữ cảnh:
# spiders/context_spider.py
import scrapy
class ContextSpider(scrapy.Spider):
name = "context"
start_urls = ["https://example.com"]
def start_requests(self):
yield scrapy.Request(
self.start_urls[0],
meta={
"playwright": True,
"playwright_context": "mobile",
},
)
async def parse(self, response):
# Logic phân tích cú pháp của bạn ở đây
pass
Scrapy-Playwright có thể được tích hợp với các middleware khác để nâng cao chức năng, chẳng hạn như xử lý thử lại, quản lý proxy hoặc tiêu đề tùy chỉnh.
# settings.py
DOWNLOADER_MIDDLEWARES.update({
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
'scrapy_playwright.middleware.ScrapyPlaywrightDownloadHandler': 543,
})
# Ví dụ về việc đặt tiêu đề tùy chỉnh
DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'MyCustomAgent/1.0',
'Accept-Language': 'en-US,en;q=0.9',
}
Để tận dụng tối đa Scrapy-Playwright và CapSolver, hãy xem xét các thực tiễn tốt nhất sau:
Nhận Mã bổ sung của bạn cho các giải pháp captcha hàng đầu tại CapSolver: scrape. Sau khi đổi mã, bạn sẽ nhận được thêm 5% tiền thưởng sau mỗi lần nạp tiền, không giới hạn lần.

Scrapy-Playwright là một công cụ thay đổi cuộc chơi cho việc scraping web, thu hẹp khoảng cách giữa việc trích xuất nội dung tĩnh và động. Bằng cách tận dụng sức mạnh của framework mạnh mẽ của Scrapy và tự động hóa trình duyệt tiên tiến của Playwright, bạn có thể giải quyết các tác vụ scraping khó khăn nhất một cách dễ dàng. Hơn nữa, tích hợp CapSolver cho phép bạn vượt qua các thách thức captcha, đảm bảo thu thập dữ liệu liên tục từ các trang web được bảo vệ nhất.
Cho dù bạn đang scraping các trang web thương mại điện tử, các nền tảng mạng xã hội hay bất kỳ trang web nặng JavaScript nào, Scrapy-Playwright kết hợp với CapSolver cung cấp các công cụ bạn cần để thành công. Bằng cách tuân theo các thực tiễn tốt nhất và tận dụng các tích hợp mạnh mẽ này, bạn có thể xây dựng các giải pháp scraping web hiệu quả, đáng tin cậy và có khả năng mở rộng phù hợp với nhu cầu cụ thể của bạn.
Bạn đã sẵn sàng nâng cao các dự án scraping của mình? Hãy thử Scrapy-Playwright và CapSolver, và mở khóa những khả năng mới cho việc thu thập dữ liệu và tự động hóa.
Hãy học cách xác định nguyên nhân gây ra lỗi Cloudflare 1020 Truy cập Bị Từ Chối, cách Tường lửa Ứng dụng Web và phát hiện bot hoạt động, và cách các nhà phát triển giảm thiểu kết quả dương tính giả trong các quy trình tự động hợp lệ.

Học cách sử dụng mẫu CapSolver n8n để theo dõi các trang sản phẩm được bảo vệ bởi AWS WAF, giải quyết các thách thức, trích xuất giá cả, so sánh các thay đổi và kích hoạt cảnh báo tự động.
