《Python实战进阶》No20: 网络爬虫开发:Scrapy框架详解

news/2025/3/12 0:28:27/

No20: 网络爬虫开发:Scrapy框架详解

摘要

本文深入解析Scrapy核心架构,通过中间件链式处理布隆过滤器增量爬取Splash动态渲染分布式指纹策略四大核心技术,结合政府数据爬取与动态API逆向工程实战案例,构建企业级爬虫系统。提供完整代码与运行结果,包含法律合规设计与反爬对抗方案。


Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

在这里插入图片描述

运行环境与依赖说明

# 环境要求
Python 3.8+
Redis 6.0+ (分布式场景)# 依赖安装
pip install scrapy==2.8.0 scrapy-splash==0.9.0 scrapy-redis==0.7.2
pip install redis==4.5.5 requests==2.31.0 beautifulsoup4==4.12.2

核心概念与实战代码

1. 中间件链式处理机制

核心逻辑:通过process_requestprocess_response实现请求/响应预处理

python"># 中间件实现示例:随机User-Agent
class RandomUserAgentMiddleware:def __init__(self):self.user_agents = ["Mozilla/5.0 (Windows NT 10.0...)","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15...)"]def process_request(self, request, spider):request.headers['User-Agent'] = random.choice(self.user_agents)spider.logger.info(f"Using User-Agent: {request.headers['User-Agent']}")# settings.py配置
DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.RandomUserAgentMiddleware': 543,
}

输出日志

[scrapy.core.engine] INFO: Using User-Agent: Mozilla/5.0 (Windows NT 10.0...

2. 增量爬取与布隆过滤器

实现方案:基于Scrapy-Redis的BloomFilter去重

python"># 布隆过滤器配置(settings.py)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.BloomFilter"
REDIS_URL = 'redis://localhost:6379'# 启动爬虫(保留历史指纹)
scrapy crawl gov_spider -s SCHEDULER_PERSIST=True

运行效果

[scrapy_redis.scheduler] INFO: Resuming crawl (5678 requests scheduled)

3. Splash渲染与自动代理池

动态页面处理:集成Splash渲染JavaScript

python"># 使用SplashRequest爬取动态页面
import scrapy
from scrapy_splash import SplashRequestclass DynamicSpider(scrapy.Spider):name = 'dynamic_spider'def start_requests(self):yield SplashRequest(url="https://example.com/ajax-page",callback=self.parse,args={'wait': 2})def parse(self, response):yield {'content': response.xpath('//div[@class="dynamic-content"]/text()').get()}

输出结果

{'content': '这是动态加载的内容'}

4. 分布式爬虫指纹策略

分布式架构:通过Redis共享指纹和队列

python"># 分布式配置(settings.py)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
REDIS_HOST = '192.168.1.100'

运行命令

# 在多台机器上启动
scrapy runspider myspider.py -a slave_id=1
scrapy runspider myspider.py -a slave_id=2

在这里插入图片描述

实战案例

案例1:政府公开数据结构化爬取

目标:爬取国家统计局季度GDP数据

python"># items.py定义结构
class GovDataItem(scrapy.Item):quarter = scrapy.Field()gdp = scrapy.Field()growth_rate = scrapy.Field()# spiders/gov_spider.py
class GovSpider(scrapy.Spider):name = 'gov_spider'start_urls = ['http://www.stats.gov.cn/tjsj/zxfb/']def parse(self, response):for row in response.css('table.data-table tr'):yield GovDataItem({'quarter': row.xpath('td[1]/text()').get(),'gdp': row.xpath('td[2]/text()').get(),'growth_rate': row.xpath('td[3]/text()').get()})

输出示例

[{"quarter": "2023-Q1", "gdp": "284997", "growth_rate": "4.5%"},{"quarter": "2023-Q2", "gdp": "308038", "growth_rate": "6.3%"}
]

案例2:动态API逆向工程

目标:破解某电商商品列表加密参数

python"># 逆向分析加密参数
import requests
from bs4 import BeautifulSoupdef get_token():response = requests.get('https://api.example.com/init')soup = BeautifulSoup(response.text, 'html.parser')return soup.find('script')['data-token']# 在Scrapy中使用
class ApiSpider(scrapy.Spider):def parse(self, response):token = get_token()yield scrapy.FormRequest(url="https://api.example.com/data",formdata={'token': token, 'page': '1'},callback=self.parse_data)

响应示例

{"data": [{"id": 1001, "name": "智能手机", "price": 2999},{"id": 1002, "name": "笔记本电脑", "price": 8999}]
}

扩展思考

1. 法律合规设计

python"># robots.txt遵守中间件
class RobotsTxtMiddleware:def process_request(self, request, spider):if not spider.allowed_domains:return# 校验robots协议rp = RobotFileParser()rp.set_url(f"http://{spider.allowed_domains[0]}/robots.txt")rp.read()if not rp.can_fetch("*", request.url):spider.logger.warning(f"Blocked by robots.txt: {request.url}")return scrapy.Request(url=request.url, dont_filter=True, callback=lambda _: None)

2. 反爬虫对抗测试框架

测试方案:模拟IP封禁、验证码场景

python"># 使用Selenium测试反爬
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://example.com/protected-page")# 检测是否出现验证码
if "验证码" in driver.page_source:print("触发验证码防护")# 调用第三方验证码识别APIcaptcha = solve_captcha(driver.find_element(By.ID, "captcha-img"))driver.find_element(By.ID, "captcha-input").send_keys(captcha)

总结

本文构建了完整的Scrapy技术体系:

  1. 中间件系统:实现请求指纹管理、动态渲染、代理切换
  2. 增量机制:通过Redis+BloomFilter实现百亿级URL去重
  3. 合规设计:内置robots协议校验与速率限制
  4. 分布式扩展:支持跨服务器协同爬取

📌 实战建议:

  • 优先使用scrapy shell调试Selector
  • 动态页面优先尝试逆向API而非直接渲染
  • 企业级项目建议结合Scrapy-Redis+Gerapy分布式部署

相关阅读:No19-时间序列预测 | No21-微服务架构设计


http://www.ppmy.cn/news/1578487.html

相关文章

分类学习(加入半监督学习)

#随机种子固定,随机结果也固定 def seed_everything(seed):torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark Falsetorch.backends.cudnn.deterministic Truerandom.seed(seed)np.random.see…

【高分论文密码】AI大模型和R语言的全类型科研图形绘制,从画图、标注、改图、美化、组合、排序分解科研绘图每个步骤

在科研成果竞争日益激烈的当下,「一图胜千言」已成为高水平SCI期刊的硬性门槛——数据显示很多情况的拒稿与图表质量直接相关。科研人员普遍面临的工具效率低、设计规范缺失、多维数据呈现难等痛点,因此科研绘图已成为成果撰写中的至关重要的一个环节&am…

正则表达式,idea,插件anyrule

​​​​package lx;import java.util.regex.Pattern;public class lxx {public static void main(String[] args) {//正则表达式//写一个电话号码的正则表达式String regex "1[3-9]\\d{9}";//第一个数字是1,第二个数字是3-9,后面跟着9个数字…

【大模型】DeepSeek-R1-Distill-Qwen部署及API调用

DeepSeek-R1-Distill-Qwen 是由中国人工智能公司深度求索(DeepSeek)开发的轻量化大语言模型,基于阿里巴巴的Qwen系列模型通过知识蒸馏技术优化而来。当前模型开源后,我们可以将其部署,使用API方式进行本地调用 1.部署…

MyBatis-Plus 与 Spring Boot 的最佳实践

在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…

【二分算法】-- 三种二分模板总结

文章目录 1. 特点2. 学习中的侧重点2.1 算法原理2.2 模板2.2.1 朴素二分模板(easy-->有局限)2.2.2 查找左边界的二分模板2.2.3 查找右边界的二分模板 1. 特点 二分算法是最恶心,细节最多,最容易写出死循环的算法但是&#xff…

案例分析:安防5G低代码开发网关如何提升城市监控效率

在现代城市管理中,安防监控中心扮演着至关重要的角色。作为城市安全的“神经中枢”,它需要高效、稳定且智能化的设备来支撑其日常运作。而安防工控机(又称“智能安防中枢”)正是这一场景中的核心设备之一。它不仅能够处理海量数据…

云服务运维智能时代:阿里云操作系统控制台

阿里云操作系统控制台 引言需求介绍操作系统使用实例获得的帮助与提升建议 引言 阿里云操作系统控制台是一款创新型云服务器运维工具,专为简化用户的运维工作而设计。它采用智能化和可视化的方式,让运维变得更加高效、直观。借助AI技术,控制…