Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践

06-01 1555阅读

目录

      • 一、背景:动态爬虫的工程化挑战
      • 二、技术架构设计
        • 1. 系统架构图
        • 2. 核心组件交互
        • 三、环境准备与项目搭建
          • 1. 安装依赖库
          • 2. 项目结构
          • 四、核心模块实现
            • 1. Selenium集成到Scrapy(中间件开发)
            • 2. 分布式配置(settings.py)
            • 五、实战:电商平台全站爬虫开发
              • 1. 爬虫逻辑(product_spider.py)
              • 2. 动态分页处理
              • 3. 分布式任务分发
              • 六、高级优化策略
                • 1. 浏览器资源复用
                • 2. 智能请求调度
                • 七、总结
                  • 1. 技术优势
                  • 2. 性能指标对比
                  • Python爬虫相关文章(推荐)

                    一、背景:动态爬虫的工程化挑战

                    在大规模数据采集场景中,爬虫开发者面临双重技术挑战:

                    1. ‌动态交互难题‌:超过60%的现代网站采用JavaScript动态渲染内容(如无限滚动、异步分页、登录验证)
                    2. ‌分布式扩展需求‌:单机爬虫难以应对百万级页面的抓取任务,需实现:
                    • 任务队列共享
                    • 节点状态协同
                    • 数据去重聚合

                      ‌技术方案选型‌:

                      • ‌Scrapy‌:Python生态最成熟的异步爬虫框架,具备可扩展架构
                      • ‌Selenium‌:浏览器自动化工具,破解动态交互的黄金钥匙
                      • ‌Scrapy-Redis‌:基于Redis的分布式扩展组件,实现任务分发与状态同步

                        二、技术架构设计

                        1. 系统架构图
                        ┌─────────────┐     ┌─────────────┐
                        │  Master节点 │◄───►│   RedisDB   │
                        └─────────────┘     └─────────────┘
                                ▲                 ▲
                                │                 │
                        ┌───────┴───────┐ ┌───────┴───────┐
                        │  Worker节点1  │ │  Worker节点N  │
                        └───────────────┘ └───────────────┘
                        
                        2. 核心组件交互
                        • ‌Selenium‌:嵌入Scrapy下载器,执行页面渲染与交互
                        • ‌Scrapy-Redis‌:
                          • RedisScheduler:中央任务调度
                          • RedisPipeline:数据统一存储
                          • BloomFilter:分布式去重

                            三、环境准备与项目搭建

                            1. 安装依赖库
                            pip install scrapy selenium scrapy-redis redis
                            # 下载对应版本的浏览器驱动(如chromedriver)
                            
                            2. 项目结构
                            dynamic_spider/
                            ├── scrapy.cfg
                            └── dynamic_spider/
                                ├── middlewares.py    # 自定义中间件
                                ├── settings.py       # 分布式配置
                                ├── items.py          # 数据模型
                                ├── pipelines.py      # Redis管道
                                └── spiders/
                                    └── product_spider.py  # 爬虫逻辑
                            

                            四、核心模块实现

                            1. Selenium集成到Scrapy(中间件开发)
                            # middlewares.py
                            from selenium import webdriver
                            from scrapy.http import HtmlResponse
                            class SeleniumMiddleware:
                                def __init__(self):
                                    options = webdriver.ChromeOptions()
                                    options.add_argument("--headless")  # 无头模式
                                    self.driver = webdriver.Chrome(options=options)
                                def process_request(self, request, spider):
                                    self.driver.get(request.url)
                                    # 执行动态交互(滚动/点击)
                                    self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
                                    # 渲染完成后返回HTML
                                    return HtmlResponse(
                                        url=self.driver.current_url,
                                        body=self.driver.page_source,
                                        encoding='utf-8',
                                        request=request
                                    )
                            
                            2. 分布式配置(settings.py)
                            # 启用Scrapy-Redis组件
                            SCHEDULER = "scrapy_redis.scheduler.Scheduler"
                            DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
                            ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300}
                            # Redis连接配置
                            REDIS_URL = 'redis://:password@127.0.0.1:6379/0'
                            

                            五、实战:电商平台全站爬虫开发

                            1. 爬虫逻辑(product_spider.py)
                            import scrapy
                            from scrapy_redis.spiders import RedisSpider
                            class ProductSpider(RedisSpider):
                                name = 'jd_product'
                                redis_key = 'jd:start_urls'  # 从Redis读取种子URL
                                def parse(self, response):
                                    # 提取商品列表
                                    products = response.css('.gl-item')
                                    for product in products:
                                        yield {
                                            'sku_id': product.attrib['data-sku'],
                                            'price': product.css('.p-price i::text').get(),
                                            'title': product.css('.p-name em::text').get()
                                        }
                                    # 模拟点击下一页(Selenium执行)
                                    next_page = response.css('a.pn-next::attr(href)').get()
                                    if next_page:
                                        yield scrapy.Request(url=response.urljoin(next_page))
                            
                            2. 动态分页处理
                            # 在中间件中增加分页逻辑
                            def process_request(self, request, spider):
                                self.driver.get(request.url)
                                
                                # 自动滚动加载(最多滚动5次)
                                for _ in range(5):
                                    self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
                                    time.sleep(1)
                                
                                # 点击"加载更多"按钮
                                try:
                                    load_more = self.driver.find_element(By.CSS_SELECTOR, '.load-more')
                                    load_more.click()
                                    time.sleep(2)
                                except NoSuchElementException:
                                    pass
                                
                                return HtmlResponse(...)
                            
                            3. 分布式任务分发
                            # Master节点推送初始任务
                            redis-cli lpush jd:start_urls "https://www.jd.com/search?keyword=手机"
                            # 启动多个Worker节点
                            scrapy runspider product_spider.py
                            

                            六、高级优化策略

                            1. 浏览器资源复用
                            # 使用浏览器池提升性能
                            from selenium.webdriver.chrome.options import Options
                            from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
                            class BrowserPool:
                                def __init__(self, size=5):
                                    self.browsers = []
                                    for _ in range(size):
                                        options = Options()
                                        options.add_argument("--disable-gpu")
                                        driver = webdriver.Remote(
                                            command_executor='http://localhost:4444/wd/hub',
                                            options=options
                                        )
                                        self.browsers.append(driver)
                            
                            2. 智能请求调度
                            # 根据页面类型动态选择渲染方式
                            def process_request(self, request, spider):
                                if request.meta.get('need_js'):
                                    # 需要JS渲染的页面
                                    return self.selenium_render(request)
                                else:
                                    # 静态页面直接使用Scrapy下载
                                    return None
                            

                            七、总结

                            1. 技术优势
                            1. ‌动态渲染全覆盖‌:通过Selenium处理任意复杂度交互
                            2. ‌横向扩展能力‌:基于Redis轻松实现百节点级分布式集群
                            3. ‌资源利用率提升‌:浏览器池技术降低85%的初始化开销
                            2. 性能指标对比
                            方案每秒请求数内存占用JS兼容性
                            纯Scrapy120+
                            Scrapy+Splash40-60
                            Scrapy+Selenium分布式80-100
                            Python爬虫相关文章(推荐)
                            Python爬虫介绍Python爬虫(1)Python爬虫:从原理到实战,一文掌握数据采集核心技术
                            HTTP协议解析Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战
                            HTML核心技巧Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素
                            CSS核心机制Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用
                            静态页面抓取实战Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解
                            静态页面解析实战Python爬虫(6)静态页面解析实战:BeautifulSoup与lxml(XPath)高效提取数据指南
                            Python数据存储实战 CSV文件Python爬虫(7)Python数据存储实战:CSV文件读写与复杂数据处理指南
                            Python数据存储实战 JSON文件Python爬虫(8)Python数据存储实战:JSON文件读写与复杂结构化数据处理指南
                            Python数据存储实战 MySQL数据库Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解
                            Python数据存储实战 MongoDB数据库Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南
                            Python数据存储实战 NoSQL数据库Python爬虫(11)Python数据存储实战:深入解析NoSQL数据库的核心应用与实战
                            Python爬虫数据存储必备技能:JSON Schema校验Python爬虫(12)Python爬虫数据存储必备技能:JSON Schema校验实战与数据质量守护
                            Python爬虫数据安全存储指南:AES加密Python爬虫(13)数据安全存储指南:AES加密实战与敏感数据防护策略
                            Python爬虫数据存储新范式:云原生NoSQL服务Python爬虫(14)Python爬虫数据存储新范式:云原生NoSQL服务实战与运维成本革命
                            Python爬虫数据存储新维度:AI驱动的数据库自治Python爬虫(15)Python爬虫数据存储新维度:AI驱动的数据库自治与智能优化实战
                            Python爬虫数据存储新维度:Redis Edge近端计算赋能Python爬虫(16)Python爬虫数据存储新维度:Redis Edge近端计算赋能实时数据处理革命
                            反爬攻防战:随机请求头实战指南Python爬虫(17)反爬攻防战:随机请求头实战指南(fake_useragent库深度解析)
                            反爬攻防战:动态IP池构建与代理IPPython爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率)
                            Python爬虫破局动态页面:全链路解析Python爬虫(19)Python爬虫破局动态页面:逆向工程与无头浏览器全链路解析(从原理到企业级实战)
                            Python爬虫数据存储技巧:二进制格式性能优化Python爬虫(20)Python爬虫数据存储技巧:二进制格式(Pickle/Parquet)性能优化实战
                            Python爬虫进阶:Selenium自动化处理动态页面Python爬虫(21)Python爬虫进阶:Selenium自动化处理动态页面实战解析
                            Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践
                            (图片来源网络,侵删)
                            Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践
                            (图片来源网络,侵删)
                            Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践
                            (图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码