Python 爬虫实战:使用 requests 和正则解析前程无忧招聘信息
本文介绍了使用 Python 进行网络爬虫开发的实战教程,以爬取前程无忧招聘网站为例。内容涵盖爬虫基本流程、环境配置、网络数据分析、代码实现细节及数据存储方法。重点讲解了如何使用 requests 发送请求、利用正则表达式提取 JSON 数据、以及将结果保存至 CSV 文件。文章还包含了异常处理、请求头伪装、频率控制等优化技巧,并强调了爬虫开发的合规性与伦理规范,适合 Python 初学者参考学习。

本文介绍了使用 Python 进行网络爬虫开发的实战教程,以爬取前程无忧招聘网站为例。内容涵盖爬虫基本流程、环境配置、网络数据分析、代码实现细节及数据存储方法。重点讲解了如何使用 requests 发送请求、利用正则表达式提取 JSON 数据、以及将结果保存至 CSV 文件。文章还包含了异常处理、请求头伪装、频率控制等优化技巧,并强调了爬虫开发的合规性与伦理规范,适合 Python 初学者参考学习。

网络爬虫是获取互联网数据的重要手段之一。本文将以 Python 语言为基础,通过实际案例演示如何爬取招聘网站(以前程无忧为例)的招聘信息。我们将学习爬虫的基本流程、正则表达式的使用、HTTP 请求的发送以及数据的本地存储。
在开始之前,请确保您的开发环境满足以下要求:
requests:用于发送 HTTP 请求。re:Python 内置模块,用于正则表达式匹配。json:Python 内置模块,用于处理 JSON 数据。csv:Python 内置模块,用于保存 CSV 文件。time:Python 内置模块,用于控制请求频率。安装第三方库命令:
pip install requests
一个完整的爬虫程序通常包含以下步骤:
以前程无忧搜索页面为例,我们需要访问特定的 URL 来获取 Python 相关的招聘信息。通过 F12 打开开发者工具,切换到 Network(网络)标签页,刷新页面后可以看到加载的请求。分析发现,数据是通过 JavaScript 动态渲染的,直接请求 HTML 可能无法获取完整数据,但可以通过分析接口返回的 JSON 字符串来提取。
目标 URL 结构示例:
https://search.51job.com/list/010000%252C020000%252C030200%252C040000%252C090200,000000,0000,00,9,99,python,2,{page}.html
其中 {page} 代表页码参数。
首先导入所需的 Python 标准库和第三方库。
import requests
import re
import json
import csv
import time
import os
为了代码的可维护性,我们将逻辑封装在一个类中。
class JobScraper:
def __init__(self):
# 设置基础 URL
self.base_url = 'https://search.51job.com/list/'
# 设置请求头,伪装成浏览器
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
}
# 初始化 CSV 写入器
self.csv_file = None
self.writer = None
def start(self):
# 创建 CSV 文件
if not os.path.exists('python_招聘数据.csv'):
with open('python_招聘数据.csv', mode='w', encoding='utf-8-sig', newline='') as f:
writer = csv.DictWriter(f, fieldnames=[
'标题', '公司名字', '城市', '薪资', '招聘信息',
'公司属性', '公司规模', '企业性质', '发布日期',
'公司详情页', '招聘详情页'
])
writer.writeheader()
# 遍历多页数据
for page in range(1, 11):
print(f'正在爬取第 {page} 页...')
try:
self.fetch_page(page)
# 避免请求过快被封禁,增加延时
time.sleep(1)
except Exception as e:
print(f'第 {page} 页爬取失败:{e}')
continue
def fetch_page(self, page):
# 拼接 URL
url = f'{self.base_url}010000%252C020000%252C030200%252C040000%252C090200,000000,0000,00,9,99,python,2,{page}.html'
# 发送请求
response = requests.get(url=url, headers=self.headers, timeout=10)
# 检查状态码
if response.status_code == 200:
# 解析数据
data_list = self.parse_data(response.text)
# 保存数据
self.save_to_csv(data_list)
else:
raise Exception(f'请求失败,状态码:{response.status_code}')
def parse_data(self, html_content):
# 使用正则提取 JSON 字符串
# window.__SEARCH_RESULT__ = (.*?)</script>
pattern = r'window.__SEARCH_RESULT__\s*=\s*(.*?)</script>'
match = re.search(pattern, html_content, re.S)
if not match:
return []
json_str = match.group(1).strip()
try:
json_data = json.loads(json_str)
# 获取职位列表
jobs = json_data.get('engine_jds', [])
return jobs
except json.JSONDecodeError:
print('JSON 解析失败')
return []
def save_to_csv(self, jobs):
file_path = 'python_招聘数据.csv'
with open(file_path, mode='a', encoding='utf-8-sig', newline='') as f:
writer = csv.DictWriter(f, fieldnames=[
'标题', '公司名字', '城市', '薪资', '招聘信息',
'公司属性', '公司规模', '企业性质', '发布日期',
'公司详情页', '招聘详情页'
])
for job in jobs:
item = {
'标题': job.get('job_name', ''),
'公司名字': job.get('company_name', ''),
'城市': job.get('workarea_text', ''),
'薪资': job.get('providesalary_text', ''),
'招聘信息': '|'.join(job.get('attribute_text', [])),
'公司属性': job.get('companyind_text', ''),
'公司规模': job.get('companysize_text', ''),
'企业性质': job.get('companytype_text', ''),
'发布日期': job.get('issuedate', ''),
'公司详情页': job.get('company_href', ''),
'招聘详情页': job.get('job_href', '')
}
writer.writerow(item)
print(f'已保存:{item["标题"]}')
if __name__ == '__main__':
scraper = JobScraper()
scraper.start()
在解析过程中,我们使用了 re.search 配合正则模式 r'window.__SEARCH_RESULT__\s*=\s*(.*?)</script>'。
\s*:匹配任意空白字符(空格、换行等)零次或多次。(.*?):非贪婪匹配,捕获中间的内容。re.S:让 . 可以匹配换行符,确保能跨行匹配整个 JSON 字符串。服务器通常会检测 User-Agent 字段来判断请求来源。如果不设置,可能会被识别为脚本而拒绝服务。本例中设置了 Chrome 浏览器的 User-Agent 进行伪装。
try-except 块捕获网络请求或解析过程中的异常,防止程序崩溃。time.sleep(1) 在每次请求间暂停 1 秒,降低对目标服务器的压力,符合爬虫伦理。保存 CSV 时指定 encoding='utf-8-sig',这样 Excel 打开中文不会出现乱码。newline='' 参数是为了让 csv 模块正确处理换行符。
本文详细介绍了使用 Python 爬取前程无忧招聘信息的全过程。通过结合 requests 发起请求、re 进行正则提取、json 解析数据结构以及 csv 保存结果,我们构建了一个基础的爬虫框架。在实际应用中,还可以进一步引入代理 IP、Cookie 池、Selenium 反反爬等技术来应对更复杂的场景。希望本文能为初学者提供清晰的入门指引。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online