Scrapy Playwright页面方法:防止选择器无法找到时超时错误
我的问题是关于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..