尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python爬虫框架Scrapy实战:从入门到分布式抓取
1. Scrapy框架概述与核心价值Scrapy是一个基于Python的高性能网络爬虫框架专为大规模数据抓取而设计。不同于简单的requestsBeautifulSoup组合Scrapy提供了完整的爬虫开发生命周期管理包括请求调度、数据提取、持久化存储等模块化组件。我在实际项目中多次使用Scrapy处理千万级数据抓取任务其异步处理机制能轻松实现单机日抓取百万页面。框架的核心优势在于其Batteries included设计理念内置CSS选择器和XPath解析器自动的请求去重与优先级队列完善的中间件扩展机制支持分布式爬取和增量抓取丰富的导出格式JSON/CSV/XML等注意Scrapy最新稳定版2.11要求Python 3.8环境与部分旧版扩展插件可能存在兼容性问题。2. 环境配置与项目初始化2.1 基础环境准备推荐使用conda创建独立Python环境避免包冲突conda create -n scrapy_env python3.10 conda activate scrapy_env pip install scrapy验证安装scrapy version # 应输出类似Scrapy 2.11.02.2 创建第一个爬虫项目执行项目生成命令scrapy startproject lagou_jobs cd lagou_jobs scrapy genspider lagou www.lagou.com生成的项目结构解析lagou_jobs/ ├── scrapy.cfg # 部署配置文件 └── lagou_jobs/ # 项目主目录 ├── __init__.py ├── items.py # 数据模型定义 ├── middlewares.py # 中间件配置 ├── pipelines.py # 数据处理管道 ├── settings.py # 爬虫配置 └── spiders/ # 爬虫代码目录 ├── __init__.py └── lagou.py # 生成的爬虫模板3. 核心组件深度解析3.1 数据模型定义items.py以拉勾网职位数据为例import scrapy class LagouJobItem(scrapy.Item): position scrapy.Field() # 职位名称 salary scrapy.Field() # 薪资范围 company scrapy.Field() # 公司名称 experience scrapy.Field() # 经验要求 education scrapy.Field() # 学历要求 skills scrapy.Field() # 技能标签 pub_date scrapy.Field() # 发布日期 job_url scrapy.Field() # 职位链接经验提示字段命名建议采用全小写下划线风格与后续数据库存储字段保持一致。3.2 爬虫逻辑实现spiders/lagou.pyimport scrapy from lagou_jobs.items import LagouJobItem class LagouSpider(scrapy.Spider): name lagou allowed_domains [www.lagou.com] start_urls [https://www.lagou.com/zhaopin/Python/] custom_settings { DOWNLOAD_DELAY: 2, # 爬取间隔(秒) CONCURRENT_REQUESTS: 8 # 并发请求数 } def parse(self, response): jobs response.css(.item__10RTO) for job in jobs: item LagouJobItem() item[position] job.css(h3::text).get().strip() item[salary] job.css(.money__3Lkgq::text).get() yield item # 翻页处理 next_page response.css(.next::attr(href)).get() if next_page: yield response.follow(next_page, self.parse)3.3 数据处理管道pipelines.py典型的数据清洗与存储实现import pymongo from itemadapter import ItemAdapter class LagouJobsPipeline: def __init__(self, mongo_uri, mongo_db): self.mongo_uri mongo_uri self.mongo_db mongo_db classmethod def from_crawler(cls, crawler): return cls( mongo_uricrawler.settings.get(MONGO_URI), mongo_dbcrawler.settings.get(MONGO_DATABASE) ) def open_spider(self, spider): self.client pymongo.MongoClient(self.mongo_uri) self.db self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): # 薪资范围标准化处理 if salary in item: item[salary] self._normalize_salary(item[salary]) self.db[jobs].insert_one(ItemAdapter(item).asdict()) return item def _normalize_salary(self, salary_str): # 实现薪资字符串的标准化逻辑 pass4. 高级配置与优化技巧4.1 反爬策略应对方案在settings.py中配置DOWNLOADER_MIDDLEWARES { scrapy.downloadermiddlewares.useragent.UserAgentMiddleware: None, scrapy_user_agents.middlewares.RandomUserAgentMiddleware: 400, scrapy.downloadermiddlewares.retry.RetryMiddleware: 500, } RETRY_TIMES 3 RETRY_HTTP_CODES [500, 502, 503, 504, 522, 524, 408, 429] DOWNLOAD_DELAY 3 AUTOTHROTTLE_ENABLED True4.2 分布式爬虫实现使用scrapy-redis组件安装依赖pip install scrapy-redis修改爬虫继承类from scrapy_redis.spiders import RedisSpider class LagouRedisSpider(RedisSpider): name lagou_redis redis_key lagou:start_urls配置Redis连接SCHEDULER scrapy_redis.scheduler.Scheduler DUPEFILTER_CLASS scrapy_redis.dupefilter.RFPDupeFilter REDIS_URL redis://:passwordlocalhost:6379/05. 数据分析实战案例5.1 数据清洗与转换使用Pandas进行数据分析import pandas as pd from pymongo import MongoClient client MongoClient(mongodb://localhost:27017/) db client[lagou] df pd.DataFrame(list(db.jobs.find())) # 薪资分析 df[min_salary] df[salary].str.extract(r(\d)k-).astype(float) df[max_salary] df[salary].str.extract(r-(\d)k).astype(float) df[avg_salary] (df[min_salary] df[max_salary]) / 2 # 热门技能统计 skills_count pd.Series( sum([s.split(,) for s in df[skills].dropna()], []) ).value_counts()5.2 可视化展示使用Matplotlib生成图表import matplotlib.pyplot as plt plt.figure(figsize(12,6)) skills_count[:10].plot(kindbarh) plt.title(Top 10 Required Skills for Python Jobs) plt.xlabel(Count) plt.tight_layout() plt.savefig(skills_distribution.png)6. 常见问题排查手册问题现象可能原因解决方案返回403错误被目标网站封禁1. 增加DOWNLOAD_DELAY2. 使用代理中间件3. 更换User-Agent数据提取为空页面结构变更1. 更新CSS/XPath选择器2. 检查JavaScript渲染需求MongoDB连接失败认证配置错误1. 检查MONGO_URI格式2. 确认服务已启动内存占用过高未及时清理缓存1. 调整CONCURRENT_REQUESTS2. 启用AUTOTHROTTLE实战经验遇到页面解析问题时建议先用scrapy shell命令交互式调试scrapy shell https://www.lagou.com/zhaopin/Python/ # 然后在交互环境中测试选择器 response.css(h3::text).get()
RELATED

相关推荐

孤能子视角:周易篇·04 卦序论——六十四卦作为关系场能效演化的完整周期

孤能子视角:周易篇·04 卦序论——六十四卦作为关系场能效演化的完整周期

(在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (已由信兄整理成文)孤能子视角:周易篇04 卦序论 ——六十四卦作为关系场能效演化的完整周期 EIS理论库老祖宗关系文化分…

📅 2026/10/8 10:30:57
孤能子视角:周易篇·03 八卦论——三维耦合空间的八个基态

孤能子视角:周易篇·03 八卦论——三维耦合空间的八个基态

(在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (已由信兄整理成文)孤能子视角:周易篇03 八卦论 ——三维耦合空间的八个基态 EIS理论库老祖宗关系文化分册道层&#x…

📅 2026/10/9 5:58:31
拒绝 Demo 幻觉:大模型工程师的护城河是权限与可观测

拒绝 Demo 幻觉:大模型工程师的护城河是权限与可观测

聊《程序员职业规划不只看课程,项目证据才是分水岭》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&#…

📅 2026/9/12 1:12:37
MORE NEWS

更多资讯

📰

胶南上哪学电工证含金量高吗怎么选培训机构

胶南上哪学电工证含金量高吗怎么选培训机构 证书过期了不知道怎么复审延期,是不是你最近遇到的烦心事?别急,先搞清楚你的电工证还能不能用,再考虑怎么操作。如果你在胶南,正在找一个靠谱的地方学习电工证,或者准备复审延期,那这篇文章就为你梳理清楚流…

📰

你学历不高怕报不上名?十堰安监局电工证复审全知道,上岗必备干货在这儿

你学历不高怕报不上名?十堰安监局电工证复审全知道,上岗必备干货在这儿 你学历不高怕报不上名?十堰安监局电工证复审流程、要求和通过率,很多人第一次接触时都一头雾水。其实,电工证复审是 上岗必备…

📰

芜湖考电工作业证过期了怎么复审?全国通用证书延期全攻略

芜湖考电工作业证过期了怎么复审?全国通用证书延期全攻略 证书过期了不知道怎么复审延期?别慌!今天就来带你搞清楚芜湖考电工作业证到期后的换证流程,特别是 全国通用…

📰

河北任丘电工证报名全攻略,良心建议助你快速取证上岗

河北任丘电工证报名全攻略,良心建议助你快速取证上岗 你是不是正在为找不到工作发愁?是不是因为 没有特种作业证 ,连面试资格都没拿到?别急,这期内容就是 河北任丘电工证 的全面干货,从报名到考试、从复审到查询, 良心建议…

📰

周至县电工证在哪考取多久拿证 周至县电工证过期别慌 一文教你解决

周至县电工证在哪考取多久拿证 周至县电工证过期别慌 一文教你解决 证书过期了不知道怎么复审延期,这是很多电工朋友最头疼的问题。特别是像周至县这类地区,电工证如果没及时办理复审,不仅影响工作,还可能被单位追责。别急,今天我就从三门峡房建工程从…

📰

郑州电工证年审多少钱?实操考试心里没底怕挂科?避坑指南来了!

郑州电工证年审多少钱?实操考试心里没底怕挂科?避坑指南来了! 实操考试心里没底怕挂科?郑州金水区不少转岗从业者都遇到过这个问题。尤其是在考电工证年审时,流程复杂、费用不明、考试内容模糊,一不留神就踩坑。本文就是为像你这样准备或正在年审电工证…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬