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

Scrapy爬虫无法获取部分字段数据:窗口尺寸相关问题求助

解决JobsDB职位短描述爬取空值问题

先排查核心问题,再给出可行解决方案:

1. 修正CSS选择器,确保获取完整文本

你的选择器[data-automation="jobShortDescription"]::text仅能获取元素直接子节点的文本,而实际页面中短描述可能嵌套了多级子标签(如<span>、<p>)。修改选择器以匹配所有后代文本:

# 替换原Job_Desc代码
Job_Desc = ' '.join(Jobs.css('[data-automation="jobShortDescription"] ::text').getall()).strip()

注意选择器中的空格:[data-automation="jobShortDescription"]与::text之间的空格代表匹配该元素下所有后代节点的文本,再通过join拼接成完整内容。

2. 用Scrapy-Playwright处理动态渲染(替代Scrapy-Splash)

Scrapy-Splash维护性较差,推荐用Scrapy-Playwright处理JS渲染和窗口尺寸问题,步骤如下:

安装依赖

pip install scrapy-playwright

配置settings.py

添加以下配置,确保Playwright以指定窗口尺寸加载页面并启用JS渲染:

DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}

PLAYWRIGHT_LAUNCH_OPTIONS = {
    "headless": True,  # 调试时可改为False,直观查看浏览器行为
    "viewport": {"width": 1920, "height": 1080},  # 设置标准桌面窗口尺寸
}

PLAYWRIGHT_DEFAULT_NAVIGATION_TIMEOUT = 15000  # 延长超时时间,确保页面加载完成

修改爬虫代码

使用Playwright请求页面,并处理JobsDB的滚动加载逻辑:

import scrapy

class JobsdbSpider(scrapy.Spider):
    name = "jobsdb"
    start_urls = ["https://hk.jobsdb.com/data-engineer-jobs"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={"playwright": True, "playwright_include_page": True},
                callback=self.parse,
            )

    async def parse(self, response):
        page = response.meta["playwright_page"]
        # 滚动到页面底部,触发更多职位加载(JobsDB默认分页加载)
        await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
        await page.wait_for_timeout(2000)  # 等待2秒,确保新职位加载完成
        
        # 获取渲染后的页面内容,生成Scrapy选择器
        rendered_content = await page.content()
        selector = scrapy.Selector(text=rendered_content)
        
        Jobs = selector.css('[data-automation="normalJob"]')
        for job in Jobs:
            Title = job.css('[data-automation="jobTitle"]::text').get().strip()
            Job_Desc = ' '.join(job.css('[data-automation="jobShortDescription"] ::text').getall()).strip()
            
            yield {
                "title": Title,
                "job_short_desc": Job_Desc
            }
        
        await page.close()

3. 更高效方案:直接爬取API接口

JobsDB的职位数据通过AJAX接口返回,直接请求API比渲染页面更稳定高效:

  1. 打开浏览器开发者工具(F12)→ 切换到Network标签→ 筛选XHR请求
  2. 刷新页面或滚动加载新职位,找到类似/api/search/jobsearch的请求
  3. 复制请求URL和参数,用Scrapy直接请求,解析返回的JSON数据即可拿到所有职位字段(包括短描述)

通常接口返回的JSON中,职位数据在data.results下,短描述字段对应shortDescription,直接提取即可。


内容的提问来源于stack exchange,提问作者阿聰MrOnion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:03:21