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
相关产品推荐
相关产品推荐

