You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy+Playwright:异步parse调用同步解析函数失效问题求助

问题解决:Scrapy+Playwright中同步函数无法正常执行

你的问题并非异步函数调用同步函数导致的——Scrapy的异步环境完全支持在async def的解析函数中调用普通同步函数。出现parse_single_jd未执行、print无输出且返回generator object的情况,主要是页面元素加载不完整或未处理页面结构异常导致的,以下是具体解决步骤:

1. 等待目标元素加载完成

点击职位后,直接获取#tl_ditsc的HTML可能因为元素尚未渲染完成,得到空或不完整的内容,后续解析时触发异常导致函数中断。需要添加等待逻辑:

async def parse(self, response):
    page = response.meta["playwright_page"]
    jobs = page.locator("//li")
   
    num_jobs = await jobs.count()

    for idx in range(num_jobs):
        await jobs.nth(idx).click()
        # 等待职位详情元素可见,确保渲染完成
        await page.wait_for_selector("#tl_ditsc", state="visible")
        job_details = page.locator("#tl_ditsc")
        
        job_details_html = await job_details.inner_html()
        soup = BeautifulSoup(job_details_html, 'html.parser')
        data = self.parse_single_jd(soup)

        yield {
            'idx': idx,
            'data': data,
        }

2. 添加异常捕获机制

页面结构可能存在异常(比如某条职位没有h2标签),会导致parse_single_jd中的soup.h2.text抛出AttributeError,中断函数执行且无任何输出。需要在函数内部和调用处添加异常处理:

修改parse_single_jd函数

def parse_single_jd(self, soup):
    print("parse_single_jd running!")
    title_of_role = "No title found"
    try:
        title_of_role = soup.h2.text.strip()
    except AttributeError:
        # 处理没有h2标签的情况
        pass
    data = {
        "title": title_of_role,
    }
    return data

在parse函数中添加调用异常捕获

async def parse(self, response):
    page = response.meta["playwright_page"]
    jobs = page.locator("//li")
   
    num_jobs = await jobs.count()

    for idx in range(num_jobs):
        await jobs.nth(idx).click()
        await page.wait_for_selector("#tl_ditsc", state="visible")
        job_details = page.locator("#tl_ditsc")
        
        job_details_html = await job_details.inner_html()
        soup = BeautifulSoup(job_details_html, 'html.parser')
        try:
            data = self.parse_single_jd(soup)
            yield {
                'idx': idx,
                'data': data,
            }
        except Exception as e:
            print(f"解析第{idx}条职位失败: {str(e)}")
            continue

3. 关于generator object的说明

你看到的generator object并非parse_single_jd的返回值,而是parse函数本身的返回——因为parse是async def且包含yield,它是一个异步生成器,这是Scrapy异步爬虫的正常特性,无需处理。

内容的提问来源于stack exchange,提问作者Allen Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:52:40