@@ -357,6 +357,13 @@ async def _download_request(self, request: Request, spider: Spider) -> Response:
357
357
page = page , request = request , spider = spider , context_name = context_name
358
358
)
359
359
360
+ # We need to identify the Playwright request that matches the Scrapy request
361
+ # in order to override method and body if necessary.
362
+ # Checking the URL and Request.is_navigation_request() is not enough, e.g.
363
+ # requests produced by submitting forms can produce false positives.
364
+ # Let's track only the first request that matches the above conditions.
365
+ initial_request_done = asyncio .Event ()
366
+
360
367
await page .unroute ("**" )
361
368
await page .route (
362
369
"**" ,
@@ -368,6 +375,7 @@ async def _download_request(self, request: Request, spider: Spider) -> Response:
368
375
body = request .body ,
369
376
encoding = request .encoding ,
370
377
spider = spider ,
378
+ initial_request_done = initial_request_done ,
371
379
),
372
380
)
373
381
@@ -637,6 +645,7 @@ def _make_request_handler(
637
645
body : Optional [bytes ],
638
646
encoding : str ,
639
647
spider : Spider ,
648
+ initial_request_done : asyncio .Event ,
640
649
) -> Callable :
641
650
async def _request_handler (route : Route , playwright_request : PlaywrightRequest ) -> None :
642
651
"""Override request headers, method and body."""
@@ -676,7 +685,9 @@ async def _request_handler(route: Route, playwright_request: PlaywrightRequest)
676
685
if (
677
686
playwright_request .url .rstrip ("/" ) == url .rstrip ("/" )
678
687
and playwright_request .is_navigation_request ()
688
+ and not initial_request_done .is_set ()
679
689
):
690
+ initial_request_done .set ()
680
691
if method .upper () != playwright_request .method .upper ():
681
692
overrides ["method" ] = method
682
693
if body :
0 commit comments