实战案例:采集 51job 企业招聘信息
本文将带你从零开始,借助 Feapder 快速搭建一个企业级招聘信息数据管道。在“基础概念”部分,我们先了解什么是数据管道和 Feapder;“生动比喻”用日常场景帮助你快速理解爬虫组件;“技术场景”介绍本项目中如何使用代理等采集策略;“实战案例”通过完整代码演示采集 51job 招聘信息并分类存储;最后在“扩展阅读”推荐一些进一步学习的资源。无论你是非技术背景的产品经理,还是校园里的同学,都能轻松上手,快速构建自己的企业级爬虫管道。
一、基础概念
1. 什么是数据管道?
- 数据管道(Data Pipeline)指的是从数据源(如网页、API)到数据仓库(如数据库、文件)的整个流转过程,通常包括数据获取、清洗、存储和监控。
- 在企业级场景下,管道需要稳定可靠、易于扩展,并支持重试、分布式、监控告警等能力。
2. 为什么选 Feapder?
- 轻量易用:基于 Scrapy 设计理念,但更贴合现代 Python 开发习惯。
- 分布式支持:内置分布式队列和调度,水平扩展无压力。
- 插件丰富:支持自定义中间件、Pipeline,持久化、监控简单接入。
- 示例生态:官方及社区提供多种行业示例,快速上手。
二、生动比喻
想象你要送快递:
- 分拣中心:接收并整理包裹(任务调度)
- 配送员:拿着包裹去各个地址(爬虫 Worker)
- 快递柜:存放收集好的包裹(Pipeline 存储)
- 后台系统:监控每个包裹的状态(监控告警)
Feapder 就是整个快递系统的“物流总控”,帮你把每个环节串起来,保证数据顺利、稳定地流转到最终存储。
三、技术场景
在企业级爬虫中,我们常常会遇到以下需求:
1. 使用代理 IP
- 提升并发时避免 IP 限流和封禁
- 引入爬虫代理:
# 亿牛云爬虫代理示例 www.16yun.cn
域名: proxy.16yun.cn
端口: 12345
用户名: 16YUN
密码: 16IP
2. 设置 Cookie 和 User-Agent
- Cookie:保持登录态或跑通多页
- User-Agent:模拟浏览器请求,降低反爬几率
Feapder 支持在中间件中统一管理这些参数,代码简洁、易维护。
四、实战案例:采集 51job 企业招聘信息
下面我们以 https://www.51job.com 为例,演示如何用 Feapder 搭建完整的爬虫管道,采集岗位名称、职位信息、工作地址、薪资待遇,并分类存储到本地 JSON 文件。
1. 环境准备
# 安装 Feapder 及依赖
pip install feapder requests
2. 项目结构
feapder_job_pipeline/
├── spider.py # 主爬虫脚本
├── settings.py # 配置文件
└── pipelines.py # 数据存储模块
3. 配置文件 settings.py
# settings.py# ---------- 分布式及队列配置(可选) ----------
# REDIS_HOST = "127.0.0.1"
# REDIS_PORT = 6379
# REDIS_PASSWORD = None# ---------- 代理设置 亿牛云代理示例 www.16yun.cn------
PROXY = {"domain": "proxy.16yun.cn", # 亿牛云代理域名"port": 8100, # 代理端口"username": "16YUN", # 代理用户名"password": "16IP", # 代理密码
}# ---------- 中间件配置 ----------
DOWNLOADER_MIDDLEWARES = {# 自定义代理中间件"middlewares.ProxyMiddleware": 500,# Feapder 默认 UserAgent 中间件# "feapder.downloadermiddleware.useragent.UserAgentMiddleware": 400,
}# ---------- Pipeline 配置 ----------
ITEM_PIPELINES = {"pipelines.JsonPipeline": 300,
}
4. 自定义中间件 middlewares.py
# middlewares.py
import base64
from feapder import Requestclass ProxyMiddleware:"""通过亿牛云代理发送请求的中间件"""def process_request(self, request: Request):# 构造代理认证字符串auth_str = f"{request.setting.PROXY['username']}:{request.setting.PROXY['password']}"b64_auth = base64.b64encode(auth_str.encode()).decode()# 设置 request.meta 中的 proxyrequest.request_kwargs.setdefault("proxies", {"http": f"http://{request.setting.PROXY['domain']}:{request.setting.PROXY['port']}","https": f"http://{request.setting.PROXY['domain']}:{request.setting.PROXY['port']}"})# 注入 Proxy-Authorization 头request.request_kwargs.setdefault("headers", {})["Proxy-Authorization"] = f"Basic {b64_auth}"return request
5. 数据存储 pipelines.py
# pipelines.py
import json
import os
from feapder import Itemclass JobItem(Item):"""定义岗位信息结构"""def __init__(self):self.position = Noneself.company = Noneself.location = Noneself.salary = Noneclass JsonPipeline:"""将数据按照公司分类存储到 JSON 文件"""def open_spider(self, spider):# 创建存储目录self.base_path = spider.setting.get("DATA_PATH", "./data")os.makedirs(self.base_path, exist_ok=True)def process_item(self, item: JobItem, spider):# 按公司名称分类存储company = item.company or "unknown"file_path = os.path.join(self.base_path, f"{company}.json")# 追加写入with open(file_path, "a", encoding="utf-8") as f:f.write(json.dumps(dict(item), ensure_ascii=False) + "\n")return item
6. 爬虫脚本 spider.py
# spider.py
from feapder import Spider, Request
from pipelines import JobItem
import randomclass JobSpider(Spider):"""Feapder 爬虫:采集 51job 企业招聘信息"""def start_requests(self):# 入口 URL,搜索“Python 开发”岗位url = "https://search.51job.com/list/000000,000000,0000,00,9,99,Python开发,2,1.html"yield Request(url, callback=self.parse_list)def parse_list(self, request, response):# 解析列表页中的每个岗位链接for job in response.xpath("//div[@class='el']/p[@class='t1']/span/a"):job_url = job.xpath("./@href").extract_first()yield Request(job_url, callback=self.parse_detail)# 分页(示例:最多采集前 5 页)if int(request.url.split(",")[-1].split(".")[0]) < 5:next_page = int(request.url.split(",")[-1].split(".")[0]) + 1next_url = request.url.replace(f",{int(request.url.split(',')[-1].split('.')[0])}.html", f",{next_page}.html")yield Request(next_url, callback=self.parse_list)def parse_detail(self, request, response):"""解析岗位详情页"""item = JobItem()item.position = response.xpath("//h1/text()").extract_first().strip() # 岗位名称item.company = response.xpath("//a[@class='catn']/text()").extract_first().strip() # 公司名称item.location = response.xpath("//span[@class='lname']/text()").extract_first().strip() # 工作地点item.salary = response.xpath("//span[@class='salary']/text()").extract_first().strip() # 薪资待遇yield itemdef download_midware(self, request):"""在请求中注入 Cookie 与 User-Agent"""headers = {# 随机选择常见浏览器 UA"User-Agent": random.choice(["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."]),# 示例 Cookie,可根据需要替换"Cookie": "your_cookie_string_here"}request.request_kwargs.setdefault("headers", {}).update(headers)return requestif __name__ == "__main__":JobSpider(**{"project_name": "feapder_job_pipeline",# 可选:指定本地分布式队列# "redis_key": "job_spider_requests",# "processes": 4,}).start()
7. 运行与结果
python spider.py
- 运行后,
./data/
目录下会出现以公司名命名的 JSON 文件,每行一条岗位信息。
五、扩展阅读
- Feapder 官方文档:https://feapder.com/
- Scrapy 官方文档(原理参考):https://docs.scrapy.org/
- 爬虫代理使用指引:登录亿牛云官网查看“文档中心”
- 同类案例:使用 Playwright 架构多语言爬虫(可对比)
通过本文演示,你已经掌握了如何用 Feapder 快速构建一个带有代理、Cookie、User-Agent 的企业级爬虫管道,并能将数据分类存储。接下来可以尝试接入数据库、监控告警,或将爬虫部署到 Kubernetes 集群,打造真正的生产级数据管道。
相关文章:

实战案例:采集 51job 企业招聘信息
本文将带你从零开始,借助 Feapder 快速搭建一个企业级招聘信息数据管道。在“基础概念”部分,我们先了解什么是数据管道和 Feapder;“生动比喻”用日常场景帮助你快速理解爬虫组件;“技术场景”介绍本项目中如何使用代理等采集策略…...

从AlphaGo到ChatGPT:AI技术如何一步步改变世界?
从AlphaGo到ChatGPT:AI技术如何一步步改变世界? 这里给大家分享一个人工智能学习网站。点击跳转到网站。 https://www.captainbed.cn/ccc 前言 在科技发展的历史长河中,人工智能(AI)技术无疑是最为璀璨的明珠之一。从…...
推荐6大wordpress模板资源网站
1. 模板之家 模板之家是一个提供丰富网站模板资源的平台。它涵盖了多种类型的模板,包括企业官网、个人博客、电商网站等,能够满足不同用户对于网站搭建的需求。其模板设计精美,功能多样,且注重用户体验,方便用户快速搭…...

AI 编程革命:腾讯云 CodeBuddy 如何重塑开发效率?
引言 在传统开发流程中,开发者常需依赖 SDK 文档或反复调试来获取云资源信息。而随着 AI 技术爆发式发展,腾讯云推出的 CodeBuddy 正以对话式编程颠覆这一模式 —— 只需自然语言描述需求,即可直接生成可执行代码。作为腾讯混元大模型与 Dee…...

星海智算云平台部署GPT-SoVITS模型教程
背景 随着 GPT-SoVITS 在 AI 语音合成领域的广泛应用,越来越多的个人和团队开始关注这项前沿技术。你是否也在思考,如何快速、高效地部署并体验这款强大的声音克隆模型?遗憾的是,许多本地部署方案不仅配置复杂,而且对…...

15:00开始面试,15:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
python 的 uv、pip 和 conda 对比和技术选型
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...

20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤
20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤 2025/5/15 20:26 缘起:荣品的PRO-RK3566适配视熙科技 的4800W的机芯。 1080p出图预览的时候没图了。 通过105的机芯出图确认 荣品的PRO-RK3566 的硬件正常。 然后要确认 视熙科技 的4800W的机芯是否出…...
GPU异步执行漏洞攻防实战:从CUDA Stream竞争到安全编程规范
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 引言 在高校实验室的GPU加速计算研究中,多卡并行编程已成为提升深度学习训练效…...

UE5.3 C++ 房屋管理系统(二)
三.当房屋生成成功,我们就需要把TMap里的数据存到数据库里。不然一点停止运行,就会所以数据都不见了。这里使用DataTable来存储。 1.DataTable是UE常用的表,虽然不是专门用来存档的,但也可以这么用。 DataTable表,实…...

VSCode1.101.0便携版|中英文|编辑器|安装教程
软件介绍 Visual Studio Code是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,设计得很人性化,旨在为所有开发者提供一款专注于代码本身的免费的编辑器。 软件安装 1、 下载安装包…...

Linux系统发布.net core程序
前端 前端用的Vue3,发布的话需要Nginx下载安装Nginx 麒麟:这里我麒麟用的是桌面版,我直接把操作流程写在下面,写的比较简单,具体的可以具体搜这一块内容学习一下。打包vue程序,通过MobaXterm将打包后的程序…...
当需要在一个方法中清除多个缓存时,@CacheEvict注解能否实现这个需求
想清除Redis中的多个缓存数据,如何实现? CacheEvict清除一个缓存,但现在想知道如何处理多个缓存的情况。场景:可能有一个更新用户信息的方法,这个方法执行后,不仅需要清除某个特定的用户缓存,还…...

极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎
在生成式AI与行业大模型的双重驱动下,人工智能正以前所未有的速度重构互联网产业生态。从内容创作、用户交互到商业决策,AI技术渗透至产品研发、运营的全链条,推动效率跃升与创新模式变革。然而,面对AI技术迭代的爆发期࿰…...
Score-CAM:卷积神经网络的评分加权视觉解释
摘要 最近,越来越多的关注被引向卷积神经网络的内部机制,以及网络为何会做出特定决策。本文中,我们开发了一种基于类别激活映射的新颖事后可视化解释方法,称为Score-CAM。与以往基于类别激活映射的方法不同,Score-CAM通过前向传递得分获取每个激活图的权重,从而摆脱了对…...
Python刷题练习
文章目录 1.寻找相同字串2.密钥格式化3.五键键盘的输出4.单词重量5.输出指定字母在字符串的中的索引6.污染水域7.九宫格按键输入8.任务最优调度9.高效的任务规划 1.寻找相同字串 题目描述: 给你两个字符串t和p,要求从t中找到一个和p相同的连续子串,并输…...

对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景
文章目录 对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景HTTP-REST 与 gRPC 的核心区别gRPC 的优缺点HTTP-REST 的优缺点适用场景 模糊点什么是 Protobuf?HTTP/2 会将 HTTP 消息拆分并封装为二进制帧,那还能过使用 HTTP/2 构建 RESTful …...

Git - 1( 14000 字详解 )
一: Git 初识 1.1 提出问题 在工作或学习中,我们常常会面临文档管理的问题,尤其是在编写各种文档时。为了防止文档丢失或因更改失误而无法恢复,我们常常会创建多个版本的副本,例如:“报告-v1”、“报告-v…...

TCPIP详解 卷1协议 九 广播和本地组播(IGMP 和 MLD)
9.1——广播和本地组播(IGMP 和 MLD) IPv4可以使用4种IP地址:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。 IPv6可以使用…...

16.1 - VDMA视频转发实验之TPG
文章目录 1 实验任务2 系统框图3 硬件设计3.1 IP核配置3.2 注意事项 4 软件设计4.1 注意事项4.2 工程源码4.2.1 main.c文件 1 实验任务 基于14.1,使用Xilinx TPG(Test Pattern Generator) IP提供视频源,将视频数据通过VDMA写入PS…...

cocos creator 3.8 下的 2D 改动
在B站找到的系统性cocos视频教程,纯2D开发入门,链接如下: zzehz黑马程序员6天实战游戏开发微信小程序(Cocos2d的升级版 CocosCreator JavaScript)_哔哩哔哩_bilibili黑马程序员6天实战游戏开发微信小程序(Cocos2d的升级版 CocosCreator Ja…...
Vue3 + Element Plus 动态表单实现
完整代码 <template><div class"dynamic-form-container"><el-formref"dynamicFormRef":model"formData":rules"formRules"label-width"auto"label-position"top"v-loading"loading"&g…...
【WPF】Opacity 属性的使用
在WPF(Windows Presentation Foundation)中,Opacity 属性是定义一个元素透明度的属性,其值范围是从 0.0(完全透明)到 1.0(完全不透明)。由于 Opacity 是在 UIElement 类中定义的&…...

Unity光照笔记
问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章:…...
Linux中安装samba服务
在Linux服务器上安装Samba可以实现文件共享功能,下面为你详细介绍安装步骤: 一、安装Samba 不同的Linux发行版使用不同的命令来安装Samba: Debian/Ubuntu: sudo apt update sudo apt install sambaCentOS/RHEL: s…...
猫咪如厕检测与分类识别系统系列~进阶【三】网页端算法启动架构及数据库实现
前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如…...
Elasticsearch性能调优全攻略:从日志分析到集群优化
#作者:猎人 文章目录 前言搜索慢查询日志索引慢写入日志性能调优之基本优化建议性能调优之索引写入性能优化提升es集群写入性能方法:性能调优之集群读性能优化性能调优之搜索性能优化性能调优之GC优化性能调优之路由优化性能调优之分片优化 前言 es里面…...

嵌入式学习的第二十天-数据结构-调试+链表的一般操作
一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…...
Leetcode 3548. Equal Sum Grid Partition II
Leetcode 3548. Equal Sum Grid Partition II 1. 解题思路2. 代码实现 题目链接:3548. Equal Sum Grid Partition II 1. 解题思路 这一题是题目3546. Equal Sum Grid Partition I的进阶版本,不过本质上还是差不多的。 相较于题目3546,这里…...

家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级
在家具制造行业,从原木切割到成品出厂,质检环节贯穿始终 —— 木材含水率是否达标、板材甲醛释放量是否合规、涂层耐磨性能否通过标准…… 这些看似琐碎的检测项目,实则是企业把控产品品质、规避市场风险的核心关卡。传统人工质检模式在效率、…...