Scrapy 是一个基于 Python 的开源网络爬虫框架,它被广泛应用于数据抓取、信息提取等领域,在招聘信息抓取的场景中,Scrapy 凭借其高效性、可扩展性和强大的数据处理能力,成为许多开发者和企业的首选工具,下面将详细介绍如何使用 Scrapy 进行招聘信息的抓取,包括环境搭建、项目创建、爬虫编写、数据存储及常见问题解决等步骤。

环境准备与项目初始化
在使用 Scrapy 之前,需要确保已安装 Python 环境(建议 Python 3.6 及以上版本),接着通过 pip 安装 Scrapy 框架:
pip install scrapy
安装完成后,可通过命令行创建一个新的 Scrapy 项目,创建一个名为 job_spider 的项目:
scrapy startproject job_spider cd job_spider
项目初始化后,会生成以下核心目录结构:
job_spider/:项目配置文件目录,包含settings.py(全局设置)、items.py(数据模型定义)等。spiders/:存放爬虫文件的目录,后续将在此编写具体的抓取逻辑。
定义数据模型(Items)
在抓取招聘信息前,需明确需要提取的字段,如职位名称、公司名称、薪资、工作地点、发布时间等,在 items.py 中定义数据模型:

import scrapy
class JobItem(scrapy.Item):= scrapy.Field() # 职位名称
company = scrapy.Field() # 公司名称
salary = scrapy.Field() # 薪资范围
location = scrapy.Field() # 工作地点
publish_time = scrapy.Field() # 发布时间
job_url = scrapy.Field() # 职位链接
source = scrapy.Field() # 招聘网站来源
通过定义 Item,可以规范数据结构,避免字段遗漏或错误。
编写爬虫(Spider)
在 spiders/ 目录下创建爬虫文件,zhaopin_spider.py,以智联招聘为例,编写爬虫逻辑:
import scrapy
from job_spider.items import JobItem
class ZhaopinSpider(scrapy.Spider):
name = 'zhaopin'
allowed_domains = ['zhaopin.com']
start_urls = ['https://www.zhaopin.com/jobs/search?keyword=Python&city=530']
def parse(self, response):
# 提取职位列表
job_list = response.css('div.job-list-item')
for job in job_list:
item = JobItem()
item['title'] = job.css('span.job-name::text').get()
item['company'] = job.css('a.company-name::text').get()
item['salary'] = job.css('span.salary::text').get()
item['location'] = job.css('span.job-area::text').get()
item['publish_time'] = job.css('span.job-publish-time::text').get()
item['job_url'] = response.urljoin(job.css('a::attr(href)').get())
item['source'] = '智联招聘'
yield item
# 处理分页
next_page = response.css('a.next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
上述代码中,parse 方法负责解析页面并提取数据,同时通过 yield 返回 Item 对象,对于分页场景,通过 response.follow 实现页面的递归抓取。
配置爬虫与中间件
在 settings.py 中进行关键配置,例如设置请求头(User-Agent)、限制爬取速度(避免被封禁)等:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' DOWNLOAD_DELAY = 2 # 请求间隔2秒,防止高频请求 ROBOTSTXT_OBEY = False # 忽略 robots.txt 规则(需谨慎使用)
若目标网站有反爬机制(如验证码、IP 封禁),可结合 middlewares.py 编写自定义中间件,例如使用代理 IP 池或添加 Cookie 头。
数据存储
Scrapy 支持多种数据存储方式,如 JSON、CSV、MySQL、MongoDB 等,以存储为 JSON 文件为例,在命令行中执行:
scrapy crawl zhaopin -o jobs.json
若需存储到数据库,可通过 pipelines.py 编写数据处理管道,将数据存入 MySQL:
import pymysql
class MySQLPipeline:
def __init__(self, host, database, user, password):
self.host = host
self.database = database
self.user = user
self.password = password
@classmethod
def from_crawler(cls, crawler):
return cls(
host=crawler.settings.get('MYSQL_HOST'),
database=crawler.settings.get('MYSQL_DATABASE'),
user=crawler.settings.get('MYSQL_USER'),
password=crawler.settings.get('MYSQL_PASSWORD')
)
def open_spider(self, spider):
self.connection = pymysql.connect(
host=self.host,
user=self.user,
password=self.password,
db=self.database,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
def close_spider(self, spider):
self.connection.close()
def process_item(self, item, spider):
with self.connection.cursor() as cursor:
sql = "INSERT INTO jobs (title, company, salary, location, publish_time, job_url, source) VALUES (%s, %s, %s, %s, %s, %s, %s)"
cursor.execute(sql, (
item['title'], item['company'], item['salary'],
item['location'], item['publish_time'], item['job_url'], item['source']
))
self.connection.commit()
return item
并在 settings.py 中启用管道:
ITEM_PIPELINES = {
'job_spider.pipelines.MySQLPipeline': 300,
}
运行与调试
执行爬虫命令后,Scrapy 会自动抓取数据并存储,若遇到解析错误,可通过 scrapy shell 进行调试:
scrapy shell "https://www.zhaopin.com/jobs/search?keyword=Python"
在交互式环境中测试 CSS 或 XPath 选择器是否正确提取数据。
常见问题与优化
- 反爬虫应对:动态渲染页面(如 JavaScript 渲染)可使用 Scrapy-Selenium 或 Splash;IP 封禁可通过代理轮换或降低请求频率解决。
- 数据清洗:在
process_item方法中处理数据格式,例如去除薪资字符串中的空格:item['salary'] = item['salary'].strip()。 - 分布式爬取:对于大规模数据抓取,可结合 Scrapy-Redis 实现分布式调度,提高抓取效率。
相关问答FAQs
Q1:Scrapy 抓取招聘信息时如何处理分页问题?
A1:Scrapy 处理分页通常有两种方式:一是通过分析页面的分页按钮(如“下一页”链接),使用 response.follow 递归请求下一页;二是构造页码参数(如 ?page=2)循环请求,需注意目标网站的分页规则,部分网站可能采用 AJAX 动态加载,此时需检查网络请求或使用 Splash 渲染页面。
Q2:如何避免目标网站识别并封禁爬虫?
A2:可通过以下措施降低被封禁风险:① 设置合理的 DOWNLOAD_DELAY(如 2-5 秒);② 随机更换 User-Agent,模拟不同浏览器;③ 使用代理 IP 池轮换请求地址;④ 遵守网站的 robots.txt 规则(ROBOTSTXT_OBEY = True);⑤ 避免高频请求同一页面,可结合 RANDOMIZE_DOWNLOAD_DELAY 实现随机延迟。
