爬虫:playwright+BeautifulSoup太好用了

简直太好用了!!

  • playwright:动态页面爬取,执行如页面导航、获取元素HTML这些功能,可用模仿操作行为
  • BeautifulSoup:解析静态页面,特点是可用按顺序解析HTML元素,如文章页面,一般很多都是一个段落一个<p></p>标签包裹的,中间还包括图片、表格等等。把通过playwright获取到的页面内容塞给BeautifulSoup,按顺序解析

来一个简单的示例:

  1. playwright获取动态页面
async def page_crawler(url: str, logger) -> (int, dict):

    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)

        # 获取要解析的HTML内容,这里也可用是一个page的全部元素
        info_html = await page.locator('div.con-bd ').inner_html()
        
        # 执行页面解析
        result = await process_element(info_html)
        
        return result 
  1. BeautifulSoup解析
# 定义一个函数来处理div中的所有子孙元素
def process_element(element):

    if element is None:
        return ''

    result = ''

    # 解析标签
    if element.name == 'p':
        # 判断<p>标签内是否包含<img>标签,并获取src属性
        img_tag = element.find('img')
        if img_tag:
            result += f"'\n'{img_tag['src']}"
        result += f"'\n'{element.get_text()}"

    # 解析img标签
    elif element.name == 'img':
        print(f"Image source: {element['src']}")
        result += f"'\n'{element['src']}"

    # 解析 a 标签
    elif element.name == 'a':
        print(f"Link URL: {element['href']}")
        result += f"'\n'{element['href']}"

    # 指定的dom元素特别处理
    elif element.name == 'div' and element.get('name') == 'class-name':
        result += f"\n{element.find('h2').get_text()}"

    # 解析表格
    elif element.name == 'table':
        # 提取表头
        headers = [th.get_text() for th in element.find_all('th')]
        # 提取表格内容
        rows = []
        rows.append(headers)
        for row in element.find_all('tr')[1:]:  # 跳过表头行
            cells = [cell.get_text() for cell in row.find_all('td')]
            rows.append(cells)
        result += str(rows)

    # 解析列表
    elif element.name == 'ul':
        # 获取所有li标签并打印其内容
        for li in element.find_all('li'):
            # result += li.get_text(strip=True)
            # 获取li标签内的所有文本
            text = li.get_text(separator=" ", strip=True) if li else ''
            result += text
            
            # 获取li标签内的所有图片src,如果没有img标签返回空列表
            images = [img['src'] for img in li.find_all('img')] if li and li.find_all('img') else []
            result += str(images)

    # 递归处理当前元素的所有子元素
    for child in element.children:
        if child.name:  # 只处理标签元素,忽略字符串等非标签内容
            result += process_element(child)

    return result
  • 以上方法还可以简化;
  • 解析的页面元素还不全;
  • 代码部分可用复用,但一般页面不会完全一样,所以使用时也需要修改
playwright+pytest框架是一种用于自动化测试的工具组合。playwright是一个跨浏览器的自动化测试工具,而pytest是一个Python的测试框架。结合使用这两个工具可以实现高效的自动化测试。 playwright+pytest框架的主要特点包括: 1. 跨浏览器支持:playwright可以同时支持多种浏览器,包括Chrome、Firefox和WebKit。这使得测试可以在不同的浏览器上运行,确保应用在各种环境下的兼容性。 2. 强大的自动化能力:playwright提供了丰富的API和功能,可以模拟用户在浏览器中的各种操作,如点击、输入、滚动等。这使得测试可以自动执行各种场景,提高测试效率。 3. 灵活的断言和报告:pytest框架提供了丰富的断言和报告功能,可以方便地编写和管理测试用例。同时,pytest还支持插件扩展,可以根据需要自定义测试流程和报告格式。 4. 共享的fixture函数:在pytest中,可以使用conftest.py文件定义fixture函数,这些函数可以在多个测试模块中共享。fixture函数可以用于初始化测试环境、准备测试数据等,提高测试的可维护性和复用性。 使用playwright+pytest框架进行自动化测试的步骤如下: 1. 安装playwright和pytest库。 2. 创建测试用例文件,使用pytest的装饰器标记测试函数。 3. 在测试函数中使用playwright的API进行操作和断言。 4. 运行pytest命令执行测试。 范例: 1. 安装playwright和pytest库 ```shell pip install playwright pytest ``` 2. 创建测试用例文件(例如test_example.py) ```python import pytest from playwright.sync_api import sync_playwright @pytest.fixture(scope="module") def browser(): with sync_playwright() as playwright: browser = playwright.chromium.launch() yield browser browser.close() def test_example(browser): page = browser.new_page() page.goto("https://www.example.com") assert page.title() == "Example Domain" ``` 3. 运行pytest命令执行测试 ```shell pytest test_example.py ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值