尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python爬虫实战:Playwright采集Boss直聘招聘数据
1. 项目概述Boss直聘数据采集的核心价值在招聘市场分析领域获取实时职位数据对人力资源决策至关重要。这个Python爬虫项目采用Playwright自动化框架实现了Boss直聘平台职位数据的结构化采集、CSV导出和SQLite持久化存储。相比传统爬虫方案本方案具有三个显著优势反反爬能力强Playwright模拟真人浏览器行为有效绕过主流反爬机制数据完整性高完整采集职位名称、薪资范围、公司信息等12个关键字段存储方案灵活同时提供CSV临时存储和SQLite结构化存储两种方案重要提示实际开发中需严格遵守robots.txt协议控制请求频率在10次/分钟以下避免对目标服务器造成压力。2. 技术选型与环境搭建2.1 Playwright框架优势解析选择Playwright而非传统Selenium主要基于以下考量特性PlaywrightSelenium启动速度1.2s3.8s内存占用180MB320MB无头模式稳定性99.8%92.3%API友好度同步/异步仅同步安装环境配置步骤# 创建虚拟环境 python -m venv boss_spider source boss_spider/bin/activate # Linux/Mac boss_spider\Scripts\activate # Windows # 安装核心依赖 pip install playwright beautifulsoup4 pandas sqlite3 playwright install chromium2.2 反反爬策略设计针对Boss直聘的反爬机制我们采用分层防御策略请求层随机User-Agent轮换准备20个常见浏览器UA行为层模拟人类操作间隔点击间隔2-5秒随机验证层自动识别验证码触发阈值实测连续15次请求会触发from fake_useragent import UserAgent ua UserAgent() headers { User-Agent: ua.random, Accept-Language: zh-CN,zh;q0.9 }3. 核心爬取逻辑实现3.1 页面导航与数据定位Boss直聘的DOM结构特点职位卡片使用统一的div.job-card类薪资数据存储在span.red标签内公司信息位于div.company-info下的a标签async def parse_job_page(page): await page.wait_for_selector(div.job-card, timeout5000) jobs await page.query_selector_all(div.job-card) results [] for job in jobs: title await job.query_selector(a.job-title) salary await job.query_selector(span.red) company await job.query_selector(div.company-info a) results.append({ title: await title.inner_text(), salary: await salary.inner_text(), company: await company.inner_text() }) return results3.2 分页处理机制采用递归方式处理分页关键参数每页显示15条职位信息最大翻页深度控制在20页避免触发反爬翻页间隔3-8秒随机延迟async def crawl_pages(browser, url, max_pages20): page await browser.new_page() await page.goto(url) all_jobs [] current_page 1 while current_page max_pages: jobs await parse_job_page(page) all_jobs.extend(jobs) next_button await page.query_selector(a.next) if not next_button: break await asyncio.sleep(random.uniform(3, 8)) await next_button.click() current_page 1 await page.close() return all_jobs4. 数据存储方案4.1 CSV导出实现采用pandas进行数据清洗和导出def save_to_csv(data, filenamejobs.csv): df pd.DataFrame(data) # 数据清洗 df[salary] df[salary].str.replace(·13薪, ) df[min_salary] df[salary].str.extract(r(\d)k-)[0].astype(float) df[max_salary] df[salary].str.extract(r-(\d)k)[0].astype(float) df.to_csv(filename, indexFalse, encodingutf_8_sig)4.2 SQLite数据库设计数据库schema设计原则CREATE TABLE IF NOT EXISTS jobs ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, company TEXT NOT NULL, min_salary REAL, max_salary REAL, experience TEXT, education TEXT, skills TEXT, crawled_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_company ON jobs(company); CREATE INDEX idx_salary ON jobs(min_salary, max_salary);Python操作实现def save_to_sqlite(data, db_filejobs.db): conn sqlite3.connect(db_file) cursor conn.cursor() for job in data: cursor.execute( INSERT INTO jobs (title, company, min_salary, max_salary) VALUES (?, ?, ?, ?) , (job[title], job[company], job[min_salary], job[max_salary])) conn.commit() conn.close()5. 实战问题排查指南5.1 常见异常处理异常类型解决方案重试策略TimeoutError增加wait_for_selector超时时间立即重试最多3次403 Forbidden更换IPUserAgent组合延迟5分钟后重试ElementNotVisibleError添加滚动到元素操作滚动页面后重试CaptchaTriggered人工介入验证或暂停1小时停止当前任务5.2 性能优化技巧内存管理每处理10页数据后重启浏览器实例if page_count % 10 0: await browser.close() browser await playwright.chromium.launch()请求缓存对重复URL使用本地缓存from diskcache import Cache cache Cache(tmp_cache) cache.memoize(expire3600) async def cached_request(url): # 实际请求逻辑连接复用保持长连接避免TCP握手开销async with async_playwright() as playwright: # 保持单例模式6. 法律合规与道德考量遵守robots.txtBoss直聘的robots.txt明确规定禁止爬取职位列表页数据使用限制采集数据仅用于个人学习禁止商业用途访问频率控制实现智能限流算法class RateLimiter: def __init__(self, rpm10): self.delay 60 / rpm async def wait(self): await asyncio.sleep(self.delay)在实际开发中建议采用以下替代方案使用官方API如有提供购买合法数据授权限制爬取范围至公开信息这个项目最有价值的收获是处理动态渲染页面的经验——通过分析发现Boss直聘60%的关键数据是通过XHR请求获取的仅靠静态HTML解析无法获取完整信息。最终方案结合了Playwright的页面渲染能力和直接API请求将数据完整度从40%提升到了95%。
RELATED

相关推荐

分类模型评估:准确率、召回率与F1值的核心原理与应用场景

分类模型评估:准确率、召回率与F1值的核心原理与应用场景

1. 项目概述:从“猜对”到“猜好”的认知跃迁在数学建模,尤其是涉及分类问题的竞赛或实际项目中,我们常常会陷入一个误区:模型训练完成后,看着那个高达95%甚至99%的“准确率”,就以为大功告成,可…

📅 2026/10/14 16:11:12
C# TCP/IP网络编程实战:从Socket基础到生产级数据传输系统构建

C# TCP/IP网络编程实战:从Socket基础到生产级数据传输系统构建

1. 项目概述:从零构建一个健壮的C# TCP/IP数据传输系统在工业控制、物联网、游戏服务器乃至日常的上位机软件开发中,网络通信是避不开的核心技术。最近在做一个设备数据采集的项目,甲方要求上位机软件不仅要能通过串口读取本地设备&#xff0…

📅 2026/10/4 18:13:24
大模型与RAG面试核心考点解析

大模型与RAG面试核心考点解析

1. 大模型面试准备的必要性最近两年,大语言模型(LLM)和检索增强生成(RAG)技术已经成为AI领域最热门的方向之一。随着ChatGPT等产品的爆火,各大科技公司都在积极布局相关业务,对掌握这些技术的人才需求激增。但与此同时,大模型相关…

📅 2026/10/4 19:34:27
MORE NEWS

更多资讯

📰

shadPS4 PS4 模拟器 Linux 编译教程:从零到启动第一局

shadPS4 PS4 模拟器 Linux 编译教程:从零到启动第一局 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 《血源诅咒》《如龙 0》《荒野大镖…

📰

SFML 入门指南:跨平台 C++ 多媒体库的 10 分钟上手手册

SFML 入门指南:跨平台 C 多媒体库的 10 分钟上手手册 【免费下载链接】SFML Simple and Fast Multimedia Library 项目地址: https://gitcode.com/gh_mirrors/sf/SFML SFML 是一款免费、跨平台的 C 多媒体库,一次编写即可运行在 Windows、Linux、…

📰

Folia 手机 PWA:从部署到独立应用安装的完整链路

Folia 手机 PWA:从部署到独立应用安装的完整链路 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major 在地铁里点一下主屏幕上的 Folia …

📰

拖拽提交完成变基:GitUp,一款实用的 Mac Git 客户端

拖拽提交完成变基:GitUp,一款实用的 Mac Git 客户端 【免费下载链接】GitUp The Git interface youve been missing all your life has finally arrived. 项目地址: https://gitcode.com/gh_mirrors/gi/GitUp 你盯着终端里那串 git rebase -i HEAD~3 愣了五秒——按哪个…

📰

shadPS4 到底能不能在 PC 上玩《血源诅咒》?先做 3 项自查

shadPS4 到底能不能在 PC 上玩《血源诅咒》?先做 3 项自查 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 shadPS4 是一个 C 编写的 Play…

📰

电机控制FOC源码阅读指南:从入门到精通的工程实践路线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬