【技术干货】使用Playwright和curl_cffi爬取BOSS直聘职位信息详解(附完整代码与流程图)
在日常数据分析、招聘市场研究、薪资水平调查等场景中,招聘网站的数据非常有价值。本文将详细介绍如何使用Python结合Playwright与curl_cffi库,爬取BOSS直聘网站上的职位信息,助你快速掌握网页抓取与数据分析的技巧。
📌 一、环境准备
首先需要安装必要的Python库:
pip install playwright curl_cffi pandas lxml openpyxl
playwright install msedge
这里安装了:
playwright:无头浏览器自动化工具curl_cffi:用于伪装请求,绕过网站的反爬虫策略pandas:处理数据,保存至Excellxml:解析HTML页面内容openpyxl:支持pandas保存Excel文件
📌 二、整体爬虫设计流程
下图是本爬虫程序的设计流程图,帮助你直观理解程序结构:
📌 三、代码功能分解与分析
🛠️ 1. 初始化环境与浏览器设置
class BossZPCrawler:
def __init__(self):
self.headers = headers
self.playwright = sync_playwright().start()
self.browser = self.playwright.chromium.launch(
channel="msedge",
headless=False,
args=["--no-sandbox", "--disable-blink-features=AutomationControlled"]
)
self.context = self.browser.new_context()
self.page = self.context.new_page()
说明:
- 使用微软Edge浏览器,开启可视化(
headless=False)便于观察抓取过程。- 参数
--disable-blink-features=AutomationControlled用来降低被网站反爬的风险。
🛠️ 2. 自动更新Cookies突破反爬机制
BOSS直聘有较强的反爬虫机制,需要频繁更新cookie。
def update_cookies(self):
while True:
try:
self.page.goto("https://www.zhipin.com/web/geek/job?query=%E5%B0%8F%E7%A8%8B%E5%BA%8F&city=101280600", timeout=15000)
cookies = self.context.cookies()
cookie_str = '; '.join([f"{c['name']}={c['value']}" for c in cookies])
self.headers['cookie'] = cookie_str
print("Cookie更新成功:", cookie_str)
break
except Exception as e:
print("Cookie更新失败:", e)
time.sleep(60)
说明:
该方法会自动打开指定页面,从页面中提取cookie更新到headers中。
🛠️ 3. 抓取职位列表数据
使用curl_cffi库伪装真实浏览器请求:
def crawling_list(self, keyword, citycode, page):
params = {
'scene': '1',
'query': keyword,
'city': citycode,
'page': page,
'pageSize': '30'
}
while True:
try:
self.update_cookies()
response = requests.get('https://www.zhipin.com/wapi/zpgeek/search/joblist.json', params=params, headers=self.headers, impersonate="chrome124")
html = response.json()
if '异常' not in response.text:
break
time.sleep(3)
except Exception as e:
time.sleep(3)
说明:
- 每次请求前调用
update_cookies更新Cookie。- 设置了
impersonate="chrome124"伪装请求,避免被拦截。
🛠️ 4. 抓取职位详情页面数据
def get_introduce(self, url):
retry_count = 0
while retry_count < 3:
try:
self.page.goto(url, timeout=15000, wait_until='domcontentloaded')
html_content = self.page.content()
html = etree.HTML(html_content)
if '异常' not in html_content:
break
raise Exception("异常访问")
except Exception as e:
print(f"请求失败: {str(e)},重试...")
time.sleep(10)
retry_count += 1
job_text = ''.join(html.xpath('//div[@class="job-detail-section"]//text()')).strip()
return job_text
说明:
- 使用Playwright访问详情页,能很好地模拟用户访问,避免被反爬机制识别。
🛠️ 5. 数据存储到Excel
@staticmethod
def save_to_excel(data, filename="jobs.xlsx"):
df = pd.DataFrame(data)
df.to_excel(filename, index=False)
说明:
- 数据利用Pandas快速存储成Excel,便于后续数据分析。
📌 四、运行程序与数据结果示例
🚀 执行爬虫程序:
if __name__ == '__main__':
crawler = BossZPCrawler()
all_job_data = []
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"jobs_{timestamp}.xlsx"
for i in range(1, 5):
job_data = crawler.crawling_list(keyword="小程序开发", citycode="101280600", page=i)
all_job_data.extend(job_data)
print(f"第{i}页爬取完成,获取{len(job_data)}条记录")
time.sleep(random.uniform(1, 3))
crawler.save_to_excel(all_job_data, filename)
print(f"数据已保存到 {filename},共爬取到 {len(all_job_data)} 条记录")
🗃️ 生成的Excel示例:
| jobId | jobName | salary | cityName | url | brandName | jobtext |
|---|---|---|---|---|---|---|
| xxx | 小程序开发 | 10-15K | 深圳-南山区 | … | XX科技 | 岗位职责:… |
📌 五、注意事项与反爬技巧总结
- 频繁更新Cookie:避免请求被拦截。
- Playwright模拟真实浏览器:有效规避大部分反爬机制。
- 合理的请求频率:防止被服务器检测为异常访问。
📌 六、思维导图总结:
- BOSS直聘职位爬虫
- 环境准备
- Python依赖安装
- 浏览器环境配置(Playwright)
- 反爬处理
- 自动更新Cookie
- Playwright模拟浏览器
- curl_cffi伪装请求
- 数据抓取流程
- 职位列表接口请求
- 职位详情页面解析
- 数据清洗与存储
- Pandas处理数据
- 存储为Excel文件
- 环境准备
🎯 总结
本文完整展示了如何使用Python和现代化的自动化技术(Playwright和curl_cffi)抓取BOSS直聘职位数据,并详细讲解了每一步的作用与原理,希望对你的网络爬虫开发和数据分析工作有所帮助。
实践出真知,动手尝试吧!

431

被折叠的 条评论
为什么被折叠?



