Scrapy Playwright页面方法:防止选择器无法找到时超时错误

0 投票
2 回答
54 浏览
提问于 2025-04-13 00:25

我的问题是关于Scrapy Playwright的,想知道如何防止爬虫的页面崩溃,尤其是在使用某个页面方法时找不到特定的选择器。

下面是一个使用Playwright与网站互动的Scrapy爬虫。这个爬虫会等待cookie按钮出现,然后点击它。选择器和操作都在请求对象的meta属性中定义,并且在一个叫做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按钮存在,一切都会正常工作。但是,如果cookie按钮不存在,爬虫就会因为超时错误而崩溃。

我并不想这样处理GDPR按钮。我希望有一个函数可以检查按钮是否存在,然后再点击它。下面是一个简单的Python-playwright函数,正好实现了这个功能。这个函数接受一个页面对象,并检查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")

我该如何在Scrapy爬虫中实现相同的功能呢?

2 个回答

0

试试这个:

doesGdprButtonExist = page.query_selector(GDPR_BUTTON_SELECTOR)

if doesGdprButtonExist:
  page.locator(GDPR_BUTTON_SELECTOR).dispatch_event("click")
else
  dosomethingelse..

撰写回答