web-scraping - 如何使用剧作家捕捉特定的重定向?

标签 web-scraping automated-tests playwright playwright-python

当 Google map 在某种程度上确认某个地点搜索时,它会重定向到特定的 Google 地点 url,否则它会返回 map 搜索结果页面。

谷歌地图搜索“manarama”是

https://www.google.com/maps/search/manarama/@23.7505522,90.3616303,15z/data=!4m2!2m1!6e6

重定向到 Google Place URL

https://www.google.com/maps/place/Manarama,+29+Rd+No.+14A,+Dhaka+1209/@23.7505522,90.3616303,15z/data=!4m5!3m4!1s0x3755bf4dfc183459:0xb9127b8c3072c249!8m2!3d23.750523!4d90.3703851

谷歌地图搜索结果页面在没有确认具体地点的情况下看起来像下面的链接

https://www.google.com/maps/search/Mana/@24.211316,89.340686,8z/data=!3m1!4b1

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://www.google.com/maps/search/manarama/@23.7505522,90.3616303,15z/data=!4m2!2m1!6e6", wait_until="networkidle")
        print(page.url) 
        await page.close()
        await browser.close()

asyncio.run(main())

有时它会返回重定向的 URL,但大多数时候不会。如何确定 URL 已重定向到某个地方 URL?以下 StackOverflow 帖子有相似之处,但无法适用于我的情况

How to catch the redirect with a webapp using playwright

最佳答案

您可以使用 expect_navigation .

在评论中,您提到了与函数匹配的 url。几乎所有此类剧作家函数都接受 regex模式。因此,如有疑问,请使用正则表达式。请看下面的代码:

import asyncio
from playwright.async_api import async_playwright, TimeoutError
import re

pattern = re.compile(r"http.*://.+?/place.+")


async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        try:
            async with page.expect_navigation(url=pattern, timeout=7000) as resp:
                await page.goto(
                    "https://www.google.com/maps/search/manarama/@23.7505522,90.3616303,15z/data=!4m2!2m1!6e6",
                    wait_until='networkidle')
        except TimeoutError:
            print('place not found')
        else:
            print('navigated to place')

        print(page.url)
        await page.close()
        await browser.close()

asyncio.run(main())

为了检查页面是否导航,只需将函数包装在 try..except block 中并传递一个合适的 timeout 参数(以毫秒为单位) 期望导航。然后,如果出现 Timeout 错误,您就会知道没有任何与我们的模式匹配的 url 更改。

关于web-scraping - 如何使用剧作家捕捉特定的重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72764540/

相关文章:

python - 如何激活每个项目并解析它们的信息?

python - 我无法抓取网站的 div 参数(scrapy)

java - 如何断言 JSON 数组中具有相同键但值不同的两个 JSON 对象

ios - 使用 KIF 测试异步 UITableView

node.js - 剧作家无法拦截所有请求

ssl - 使用 playwright 代码生成忽略 SSL 错误

通过 Mechanize 的 Python 表单登录

automated-tests - 在 Github 操作上运行的机器人框架无法获取测试返回代码

node.js - Playwright - 无法使用文件 ://in an img tag 访问本地文件

python - 我怎样才能刮掉所有击球手的名字?