實戰案例:采集 51job 企業招聘信息

爬蟲代理

本文將帶你從零開始,借助 Feapder 快速搭建一個企業級招聘信息數據管道。在“基礎概念”部分,我們先了解什么是數據管道和 Feapder;“生動比喻”用日常場景幫助你快速理解爬蟲組件;“技術場景”介紹本項目中如何使用代理等采集策略;“實戰案例”通過完整代碼演示采集 51job 招聘信息并分類存儲;最后在“擴展閱讀”推薦一些進一步學習的資源。無論你是非技術背景的產品經理,還是校園里的同學,都能輕松上手,快速構建自己的企業級爬蟲管道。

一、基礎概念

1. 什么是數據管道?

  • 數據管道(Data Pipeline)指的是從數據源(如網頁、API)到數據倉庫(如數據庫、文件)的整個流轉過程,通常包括數據獲取、清洗、存儲和監控。
  • 在企業級場景下,管道需要穩定可靠、易于擴展,并支持重試、分布式、監控告警等能力。

2. 為什么選 Feapder?

  • 輕量易用:基于 Scrapy 設計理念,但更貼合現代 Python 開發習慣。
  • 分布式支持:內置分布式隊列和調度,水平擴展無壓力。
  • 插件豐富:支持自定義中間件、Pipeline,持久化、監控簡單接入。
  • 示例生態:官方及社區提供多種行業示例,快速上手。

二、生動比喻

想象你要送快遞:

  1. 分揀中心:接收并整理包裹(任務調度)
  2. 配送員:拿著包裹去各個地址(爬蟲 Worker)
  3. 快遞柜:存放收集好的包裹(Pipeline 存儲)
  4. 后臺系統:監控每個包裹的狀態(監控告警)

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 集群,打造真正的生產級數據管道。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905720.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GMT之Bash語言使用

GMT的操作有自己的邏輯和“命令”&#xff0c;但GMT是可以用Bash語言控制的&#xff0c;所以常常以.sh為后綴寫GMT程序。 GMT程序運行步驟如下&#xff1a; 采用cd &#xff0c;定位到指定文件夾&#xff1b;以sh ***.sh運行GMT&#xff0c;得到結果。 另外&#xff0c;遇到…

整合Redis

整合Redis 引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><art…

Vue3——Watch偵聽器

目錄 手動指定監聽對象 偵聽ref對象 偵聽ref對象中的某個屬性 reactive寫法 watchEffect 自動偵聽 多源偵聽 一次性偵聽器 watch 是?個?于觀察和響應Vue響應式系統中數據變化的?法。它允許你指定?個數據源&#xff08;可以是 響應式引?、計算屬性、組件的屬性等&#xf…

1、數據結構與算法(Python版-啃書)-緒論

1.1 計算機問題求解 一般而言&#xff0c;人們需要的不是解決一個具體問題的程序&#xff0c;而是解決一類問題的程序。 對于求平方根這樣的簡單問題&#xff0c;人們希望的也不是專用于求某個數(例如2)的平方根的函數&#xff0c;而是能求任何數的平方根的函數。 用計算機解…

微信小程序之將輪播圖設計為組件

在components文件夾上點右鍵&#xff0c;新建component&#xff0c;命名為swiper 然后將我們之前的代碼都拷貝到對應文件中&#xff0c; 然后我們的頁面要引用這個組件&#xff0c; 在pages\index\index.json中引入&#xff1a; { "usingComponents": {"van…

【視頻】解決FFmpeg將RTSP轉RTMP流時,出現的卡死、出錯等問題

【視頻】郭老二博文之:圖像視頻匯總 1、簡述 如果不修改圖像內容,可以使用FFmpeg命令來將RTSP轉RTMP流。 SRS視頻服務器就是這么干的,它沒有使用FFmpeg接口,而是直接使用FFmpeg命令來轉流。 但是在使用中,約到了一些問題,比如轉流時卡死、轉流出錯等等,下面描述怎么解…

報銷單業務筆記

文章目錄 業務點業務點-對公對私業務點-多系統標志 特殊業務入參入參報文 出參出參報文中間的邏輯多對多關系 其他應該是整體成功還是可以部分成功這種多對多關多關系有沒有優雅的判斷方式 報銷單是個通用場景&#xff0c;有通用邏輯&#xff0c;在此基礎上進行適度定制&#x…

25軟考【軟件評測師】:10天極限沖刺攻略(附知識點解析+沖刺攻略)

距離2025上半年“軟件評測師”考試已經只剩最后一周多了&#xff0c;還沒有準備好的小伙伴趕緊行動起來。為了幫助大家更好的沖刺學習&#xff0c;特此提供一份考前沖刺攻略。本指南包括考情分析、沖刺攻略兩個部分&#xff0c;可以參考此指南進行最后的復習要領&#xff0c;相…

python 的 ?uv、pip? 和 ?conda? 對比和技術選型

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 一…

Python logging模塊使用指南

Python 的 logging 模塊是一個靈活且強大的日志記錄工具&#xff0c;廣泛應用于應用程序的調試、運行監控和問題排查。它提供了豐富的功能&#xff0c;包括多級日志記錄、多種輸出方式、靈活的格式配置等。以下是詳細介紹&#xff1a; 一、為什么使用 logging 模塊&#xff1f;…

開發技術.前端開發相關問題

第一部分 響應式布局 1. 幾個布局單位概念 PX: px像素&#xff08;Pixel&#xff09; 相對長度單位。像素px是相對于顯示器屏幕分辨率而言的。 PX特點 1. IE無法調整那些使用px作為單位的字體大小&#xff1b; 2. 國外的大部分網站能夠調整的原因在于其使用了em或rem作為字體…

1. Go 語言環境安裝

&#x1f451; 博主簡介&#xff1a;高級開發工程師 &#x1f463; 出沒地點&#xff1a;北京 &#x1f48a; 人生目標&#xff1a;自由 ——————————————————————————————————————————— 版權聲明&#xff1a;本文為原創文章&#xf…

WPF自定義控件開發全指南:多內容切換與動畫集成

WPF自定義控件開發全指南&#xff1a;多內容切換與動畫集成 一、控件基礎架構設計1.1 選擇控件基類1.2 定義關鍵屬性 二、動畫系統集成2.1 淡入淡出動畫實現2.2 滑動動畫實現 三、視覺狀態管理四、完整使用示例4.1 XAML聲明4.2 動畫觸發邏輯 五、擴展與優化5.1 性能優化建議5.2…

數據結構 -- 順序查找和折半查找

查找的基本概念 基本概念 查找&#xff1a;在數據集合中尋找滿足某種條件的數據元素的過程 查找表&#xff08;查找結構&#xff09;&#xff1a;用于查找的數據集合稱為查找表&#xff0c;它由同一類型的數據結構元素&#xff08;或記錄&#xff09;組成 關鍵字&#xff1…

汽車功能安全--TC3xx MBIST設計要點

英飛凌針對硬件故障的自測&#xff0c;提供了四種機制&#xff1a;PBIST、LBIST、MONBIST和MBIST。 LBIST和MONBIST我們已經聊過了&#xff0c;今天就快速介紹下MBIST。 MBIST&#xff0c;全程Memory Built-in Self Test&#xff0c;用于檢測SRAM數據單元的完整性。 在26262…

openpi 入門教程

系列文章目錄 目錄 系列文章目錄 前言 一、運行要求 二、安裝 三、模型檢查點 3.1 基礎模型 3.2 微調模型 四、運行預訓練模型的推理 五、在自己的數據上微調基礎模型 5.1. 將數據轉換為 LeRobot 數據集 5.3. 啟動策略服務器并運行推理 5.4 更多示例 六、故障排除…

java加強 -Collection集合

集合是一種容器&#xff0c;類似于數組&#xff0c;但集合的大小可變&#xff0c;開發中也非常常用。Collection代表單列集合&#xff0c;每個元素&#xff08;數據&#xff09;只包含1個值。Collection集合分為兩類&#xff0c;List集合與set集合。 特點 List系列集合&#…

深入理解ThingsBoard的Actor模型

1、ThingsBoard系統中定義了哪些Actor ? ThingsBoard Actor 創建機制與作用對照表: Actor 類型 何時創建 由誰創建 是否緩存 作用描述 SystemActor 系統啟動時 DefaultActorService / ActorSystem ? 是 ★ ThingsBoard 平臺服務級別管理器:負責創建所有的Actor AppActor

WPS一旦打開,就會修改默認打開方式,怎么解?

目錄 前言 解決方法 結語 前言 電腦上同時存在WPS和微軟的Office全家桶&#xff0c;但是我更喜歡用Office全家桶。前幾天剛在設置改過來&#xff0c;忘記更改pdf文件打開默認應用。結果沒過幾天&#xff0c;不小心用WPS打開pdf文件時候&#xff0c;給我把默認設置全改回去了…

深度學習中--模型調試與可視化

第一部分&#xff1a;損失函數與準確率的監控&#xff08;Loss / Accuracy Curve&#xff09; 1. 為什么要監控 Loss 與 Accuracy&#xff1f; Loss 是模型優化的依據&#xff0c;但它可能下降了 Accuracy 反而沒變&#xff08;過擬合信號&#xff09; Accuracy 才是評估效果的…