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比渲染页面更稳定高效:
- 打开浏览器开发者工具(F12)→ 切换到Network标签→ 筛选XHR请求
- 刷新页面或滚动加载新职位,找到类似
/api/search/jobsearch的请求 - 复制请求URL和参数,用Scrapy直接请求,解析返回的JSON数据即可拿到所有职位字段(包括短描述)
通常接口返回的JSON中,职位数据在data.results下,短描述字段对应shortDescription,直接提取即可。
内容的提问来源于stack exchange,提问作者阿聰MrOnion
相关产品推荐
相关产品推荐

