菜鸟科技网

Scrapy爬虫如何高效抓取招聘数据?

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

Scrapy爬虫如何高效抓取招聘数据?-图1
(图片来源网络,侵删)

环境准备与项目初始化

在使用 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 中定义数据模型:

Scrapy爬虫如何高效抓取招聘数据?-图2
(图片来源网络,侵删)
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)、限制爬取速度(避免被封禁)等:

Scrapy爬虫如何高效抓取招聘数据?-图3
(图片来源网络,侵删)
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 选择器是否正确提取数据。

常见问题与优化

  1. 反爬虫应对:动态渲染页面(如 JavaScript 渲染)可使用 Scrapy-Selenium 或 Splash;IP 封禁可通过代理轮换或降低请求频率解决。
  2. 数据清洗:在 process_item 方法中处理数据格式,例如去除薪资字符串中的空格:item['salary'] = item['salary'].strip()
  3. 分布式爬取:对于大规模数据抓取,可结合 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 实现随机延迟。

分享:
扫描分享到社交APP
上一篇
下一篇