Published on

Seek 招聘网站爬虫

Authors
  • avatar
    Name
    Jack Qin
    Twitter

SeekSpider:一个用于职位爬取的 Scrapy 项目

目录

简介

SeekSpider 是一个使用 Scrapy 构建的强大网络爬虫工具,Scrapy 是一个快速的高级 Python 网络爬取框架。该项目专为从 seek.com.au 提取职位列表而设计,能够高效地浏览职位列表页面、收集重要的职位相关信息,并将其存储以供进一步分析。它配备了处理分页、浏览不同分类以及在请求失败时管理重试逻辑的功能。

功能特性

  • 使用 Scrapy 框架实现强大高效的网络爬取
  • 自定义日志设置以保持输出整洁
  • 分页处理,可遍历多个列表页面
  • 自动遍历不同的职位分类类别
  • 集成 BeautifulSoup 进行详细的职位描述爬取
  • 内置 RetryMiddleware 自定义,优雅处理 HTTP 错误码

快速开始

前置要求

确保你的系统已安装以下软件:

  • Python 3.9 或更高版本
  • pip(Python 包安装器)
  • MySQL 服务器(用于数据库存储)

安装

  1. 将仓库克隆到本地机器。
git clone https://github.com/your-username/SeekSpider.git
cd SeekSpider
  1. 在终端中导航到项目目录。安装 requirements.txt 中列出的所需 Python 包。你可以使用 pip 安装:
pip install -r requirements.txt

确保 MySQL 已安装并在本地机器或远程服务器上运行,并设置好所需的数据库和表结构。在 settings_local.py 中配置数据库设置以指向你的 MySQL 实例。

配置

  1. 数据库配置

    • 创建 MySQL 数据库和具有适当权限的用户。
    • settings_local.py 或你选择的配置文件中定义数据库连接设置。
  2. 参数配置

    • SeekSpider 类的 params 字典中自定义搜索参数以进行目标爬取。

运行

使用以下命令运行爬虫:

scrapy crawl seek

执行后,爬虫将开始浏览 SEEK 上的职位列表,并使用 pipeline 将每个职位的数据插入数据库。

注意: 我不是在偷懒,但你可以直接运行 main.py :)

Web API 参数说明

爬虫使用 Seek 职位搜索 API,带有多个查询参数,以根据特定需求定制搜索结果。以下是爬虫查询字符串中使用的这些参数的详细说明:

  • where:指职位搜索的位置。当前配置设置为 "All Perth WA"。
  • seekSelectAllPages:布尔参数,设置为 True 时,表示爬虫考虑所有可用的职位列表页面。
  • classification:Seek 上的每个职位类别都有唯一的分类 ID。值 6281 指信息与通信技术。
  • hadPremiumListings:表示搜索结果是否包含高级列表。
  • include:在响应中包含搜索引擎优化数据。
  • locale:确定 API 的区域设置。'en-AU' 将区域设置为英语 - 澳大利亚。
  • url_page:当前页码。

注意: Seek 对职位列表有 26 页的限制,这意味着你无法超过 26 页的结果。为了克服这一限制,我们使用子分类将任务分解成更小的部分。

params 通过 urlencode 方法转换为查询字符串,确保它们针对 HTTP 请求进行正确格式化。调整这些参数允许进行广泛的搜索,以收集对不同用户意图有用的数据。

这些参数对于爬虫的功能至关重要,因为它们决定了网络爬取任务的范围和具体性。用户可以根据自己的需求修改这些参数,以收集与其特定搜索条件相关的职位列表数据。

项目组件

Items

SeekspiderItem 类定义为 Scrapy Item。Items 提供了一种收集爬虫爬取数据的方法。该项目收集的字段如下:

字段名描述
job_id职位发布的唯一标识符
job_title职位名称
business_name发布职位的企业名称
work_type工作类型(如全职、兼职)
job_description职位和职责的描述
pay_range该职位提供的薪资或范围
suburb职位所在的郊区
area职位位置的更大区域指定
url职位列表的直接 URL
advertiser_id职位广告商的唯一标识符
job_type职位的分类

Spider

SeekSpider 项目的核心是 scrapy.Spider 子类,它定义了如何爬取职位列表。它构建必要的 HTTP 请求,解析从 Web 服务器返回的响应,并使用选择器提取数据以填充 SeekspiderItem 对象。

Pipeline

SeekspiderPipeline 负责处理爬虫爬取的 items。一旦 item 被爬虫填充数据,它就会传递给 pipeline,在那里通过 pymysql 建立与 MySQL 数据库的连接,并将数据插入相应的表中。

Settings

我有意降低了速度以避免被封禁。如果你觉得爬虫太慢,请尝试增加 CONCURRENT_REQUESTS 并减少 DOWNLOAD_DELAY

配置文件

在运行爬虫之前,你需要在项目目录中创建一个 settings_local.py 文件。该文件应包含数据库连接的配置设置。以下是 settings_local.py 文件的模板:

MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USER = 'MYSQL_USER'
MYSQL_PASSWORD = 'MYSQL_PASSWORD'
MYSQL_DATABASE = 'Seek'
MYSQL_TABLE = 'Jobs_test'

如果该文件包含敏感信息(如数据库密码),请确保它不被版本控制跟踪。你可以将 settings_local.py 添加到 .gitignore 文件中,以防止它被提交到 git 仓库。

你可以在爬虫的 params 字典中调整爬取参数,如搜索位置、类别和职位类型。确保这些参数与 seek.com.au API 的预期查询参数匹配。

params = {
  "where": "All Perth WA",
  "classification": 6281,
  "locale": "en-AU",
}

数据库架构

确保你的 MySQL 数据库有一个具有正确架构的表来存储数据。以下是基于 SeekspiderItem 中定义的字段的指导性架构:

CREATE TABLE jobs (
  job_id VARCHAR(255) PRIMARY KEY,
  job_title VARCHAR(255),
  business_name VARCHAR(255),
  work_type VARCHAR(255),
  job_description VARCHAR(255),
  pay_range VARCHAR(255),
  suburb VARCHAR(255),
  area VARCHAR(255),
  url VARCHAR(255),
  advertiser_id VARCHAR(255),
  job_type VARCHAR(255)
);

请根据你的查询模式包含相关索引以获得最佳性能。

贡献

欢迎贡献。Fork 该项目,进行更改,然后提交 pull request。对于重大更改,请先打开一个 issue 讨论你想要更改的内容。

许可证

该项目根据 Apache License 2.0 许可 - 有关详细信息,请参阅 LICENSE 文件。

致谢

本 README 的内容是在生成式 AI 的协助下生成的,确保了理解所需信息的准确性和效率。

(再说一遍,我真的不是懒人,绝对不是)