Ниже: Scrapy Spider, который использует Playwright для взаимодействия с веб-сайтом.
Паук ждет появления кнопки cookie, а затем нажимает ее.
Селектор, а также действия определяются в метаатрибуте запроса. объект и здесь, в словаре, в списке под названием page_methods.
Если кнопка GDPR отсутствует, страница завершается с ошибкой тайм-аута:
Код: Выделить всё
playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.Код: Выделить всё
from typing import Iterable
import scrapy
from scrapy_playwright.page import PageMethod
GDPR_BUTTON_SELECTOR = "iframe[id^='sp_message_iframe'] >> internal:control=enter-frame >> .sp_choice_type_11"
class GuardianSpider(scrapy.Spider):
name = "guardian"
allowed_domains = ["www.theguardian.com"]
start_urls = ["https://www.theguardian.com"]
def start_requests(self) -> Iterable[scrapy.Request]:
url = "https://www.theguardian.com"
yield scrapy.Request(
url,
meta=dict(
playwright=True,
playwright_include_page=True,
playwright_page_methods=[
PageMethod("wait_for_selector", GDPR_BUTTON_SELECTOR),
PageMethod("dispatch_event", GDPR_BUTTON_SELECTOR, "click"),
],
),
)
def parse(self, response):
pass
Однако, если кнопка Cookie отсутствует, паук аварийно завершает работу с ошибкой тайм-аута.
Я не хотел бы обращаться с кнопкой GDPR иначе. Я хотел бы иметь функцию, которая проверяет, присутствует ли кнопка, а затем нажимает ее.
Ниже приведена функция на простом Python-драматурге, которая делает именно это. Функция принимает объект Page и проверяет наличие кнопки GDPR. Если это так, он щелкает по нему. Если это не так, он ничего не делает.
Код: Выделить всё
from playwright.sync_api import Page
def accecpt_gdpr(page: Page) -> None:
if page.locator(GDPR_BUTTON_SELECTOR).count():
page.locator(GDPR_BUTTON_SELECTOR).dispatch_event("click")
Подробнее здесь: https://stackoverflow.com/questions/782 ... t-be-locat