爬虫框架Scrapy 之(五) --- scrapy运行原理(中间件)

创建项目

  创建一个爬虫项目,爬取蘑菇街数据。

1 cd 到存放项目的目录下
2 scrapy  startproject MogujiePro 
3 在pycharm中打开项目
4 scrapy genspider mogu mogujie.com

文件介绍

  • settings.py 文件
 1 # Enable or disable downloader middlewares
 2 # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
 3 DOWNLOADER_MIDDLEWARES = {
 4    # 这个组件是 下载中间件,此时开启了自定义的下载中间件(自定义和系统原生-源码中)
 5    # 下载中间件的作用:下载器向服务器发起请求的过程中会按照中间件的优先级顺序,分别将请求对象传递到每个中间件中进行相关的处理
 6    'MogujiePro.middlewares.MogujieproDownloaderMiddleware': None,
 7    # 使用selenium后,由于浏览器可以代替下面的中间件功能,可以禁掉一些用不到的系统默认的中间件
 8    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
 9    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware':None,
10    'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware':None,
11 
12    # 加入自定义的中间件
13    'MogujiePro.middlewares.SeleniumDownloaderMiddleware': 545,
14 }
  • middleware.py 文件
  1 # -*- coding: utf-8 -*-
  2 
  3 # Define here the models for your spider middleware
  4 #
  5 # See documentation in:
  6 # https://docs.scrapy.org/en/latest/topics/spider-middleware.html
  7 
  8 from scrapy import signals
  9 
 10 # 爬虫中间件。本身是一个普通类,当把其加载到中间件组件中,就变成了组件类
 11 class MogujieproSpiderMiddleware(object):
 12     # Not all methods need to be defined. If a method is not defined,
 13     # scrapy acts as if the spider middleware does not modify the
 14     # passed objects.
 15 
 16     @classmethod
 17     def from_crawler(cls, crawler):
 18         # This method is used by Scrapy to create your spiders.
 19         s = cls()
 20         crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
 21         return s
 22 
 23     def process_spider_input(self, response, spider):
 24         # Called for each response that goes through the spider
 25         # middleware and into the spider.
 26 
 27         # Should return None or raise an exception.
 28         return None
 29 
 30     def process_spider_output(self, response, result, spider):
 31         # Called with the results returned from the Spider, after
 32         # it has processed the response.
 33 
 34         # Must return an iterable of Request, dict or Item objects.
 35         for i in result:
 36             yield i
 37 
 38     def process_spider_exception(self, response, exception, spider):
 39         # Called when a spider or process_spider_input() method
 40         # (from other spider middleware) raises an exception.
 41 
 42         # Should return either None or an iterable of Request, dict
 43         # or Item objects.
 44         pass
 45 
 46     def process_start_requests(self, start_requests, spider):
 47         # Called with the start requests of the spider, and works
 48         # similarly to the process_spider_output() method, except
 49         # that it doesn’t have a response associated.
 50 
 51         # Must return only requests (not items).
 52         for r in start_requests:
 53             yield r
 54 
 55     def spider_opened(self, spider):
 56         spider.logger.info('Spider opened: %s' % spider.name)
 57 
 58 # 下载中间件。本身是一个普通类,当把其加载到中间件组件中,就变成了组件类
 59 class MogujieproDownloaderMiddleware(object):
 60     # Not all methods need to be defined. If a method is not defined,
 61     # scrapy acts as if the downloader middleware does not modify the
 62     # passed objects.
 63 
 64     @classmethod
 65     def from_crawler(cls, crawler): #类方法---创建了一个爬虫
 66         # This method is used by Scrapy to create your spiders.
 67         s = cls()
 68         crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
 69         print("创建了一个爬虫!")
 70         return s
 71 
 72     def process_request(self, request, spider): # 有请求经过当前下载中间件时调用
 73         print("我是process_request方法,有请求经过当前中间件的时候调用")
 74         # Called for each request that goes through the downloader
 75         # middleware.
 76         print("Request对象为:",request)
 77         print("spider对象为:",spider)
 78         # Must either:
 79         # - return None: continue processing this request
 80         # - or return a Response object
 81         # - or return a Request object
 82         # - or raise IgnoreRequest: process_exception() methods of
 83         #   installed downloader middleware will be called
 84         return None
 85 
 86     def process_response(self, request, response, spider):
 87         print("我是process_response方法,当有响应经过当前中间件的时候调用")
 88         # Called with the response returned from the downloader.
 89         # Must either;
 90         # - return a Response object
 91         # - return a Request object
 92         # - or raise IgnoreRequest
 93         return response
 94 
 95     def process_exception(self, request, exception, spider):
 96         print("我是process_exception方法,当有异常的时候调用")
 97         # Called when a download handler or a process_request()
 98         # (from other downloader middleware) raises an exception.
 99 
100         # Must either:
101         # - return None: continue processing this exception
102         # - return a Response object: stops process_exception() chain
103         # - return a Request object: stops process_exception() chain
104         pass
105 
106     def spider_opened(self, spider):
107         print("我是spider_opened方法,当有打开的时候调用")
108         spider.logger.info('Spider opened: %s' % spider.name)

  在middleware.py 文件自定义一个中间件,用于植入selenium + webdriiver机制。将不能直接加载返回的数据用selenium加载出来

 1 from scrapy import signals
 2 
 3 from selenium import webdriver
 4 from time import sleep
 5 from scrapy.http import HtmlResponse
 6 
 7 # 自定义一个中间件,用于植入selenium + webdriiver机制
 8 class SeleniumDownloaderMiddleware(object):
 9 
10     # 重写请求过程处理方法
11     def process_request(self, request, spider):
12         print("我是selenium中间件!")
13 
14         # 无头操作,浏览器界面不会被调起来
15         opt = webdriver.ChromeOptions()
16         opt.add_argument("--headless")
17         opt.add_argument("--disable-gpu")
18         driver = webdriver.Chrome(options=opt)
19         print("浏览器正在访问页面:",request.url)
20         driver.get(url=request.url)
21         sleep(1)
22 
23         # 如果想获取更多内容,需要下拉加载
24         for i in range(1,100):
25             js = "document.documentElement.scrollTop=%d"%(i*100)
26             driver.execute_scirt(js)
27             sleep(1)
28 
29         # 提取出driver中的响应体
30         body = driver.page_source
31         # 将响应体封装到一个响应对象中然后返回给下载器
32         return HtmlResponse(url=driver.current_url, body=body, encoding="utf-8", request=request)
  • items.py 文件
 1 # -*- coding: utf-8 -*-
 2 # Define here the models for your scraped items
 3 # See documentation in:
 4 # https://docs.scrapy.org/en/latest/topics/items.html
 5 
 6 import scrapy
 7 
 8 # 此文件对待爬取的数据进行模型化,主要用于对接需求分析。有了这个文件后,格式化数据后就无需再spilder文件中创建字典
 9 class MogujieproItem(scrapy.Item):
10     title = scrapy.Field()
11     org_price = scrapy.Field()
12     price = scrapy.Field()
13     pic = scrapy.Field()
  •  mogu.py 文件
 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from MogujiePro.items import MogujieproItem
 4 
 5 
 6 class MoguSpider(scrapy.Spider):
 7     name = 'mogu'
 8     allowed_domains = ['mogujie.com']
 9     start_urls = ['https://list.mogu.com/book/skirt/50004?acm=3.mce.1_10_1lrec.128038.0.t8Z0frzoVgpJo.pos_1-m_507614-sd_119&ptp=31.v5mL0b.0.0.wyZwwn6Y']
10 
11     def parse(self, response):
12         # 使用scrapy的css进行解析selenium获取的json数据
13         goods_list = response.css(".iwf")  # css语法和bs4基本一致
14         for goods in goods_list:
15             # 定义一个数据模型
16             item = MogujieproItem()
17             # item是一个字典对象
18             item["title"] = goods.css(".title::text").extract_first()  # 获取内容值
19             item["org_price"] = goods.css(".org_price > span::text").extract_first()
20             item["price"] = goods.css(".price_info::text").extract_first()
21             item["pic"] = goods.css("[rel='nofollow']::attr('img-src')").extract_first() # 获取属性值
22             yield item
  • 在 pipelines.py文件中编写存储代码
 1 import redis
 2 import json
 3 
 4 class MogujieproPipeline(object):
 5 
 6     def open_spider(self,spider):
 7         self.rds = redis.StrictRedis(host="www.fnajainbo",port=6379,db=2)
 8 
 9     def process_item(self, item, spider):
10         self.rds.lpush("mogujie",json.dumps(dict(item))) # 转json存redis
11         return item
12 
13     def close_spider(self,spider):
14         pass

 

转载于:https://www.cnblogs.com/TMMM/p/11369539.html

Python 爬虫框架Scrapy 在scrapy中,会专门定义一个用于记录数据的类,实例化一个对象,利用这个对象来记录数据。每一次,当数据完成记录,它会离开spiders,来到Scrapy Engine(引擎),引擎将它送入Item Pipeline(数据管道)处理。定义这个类的py文件,是items.py。 阅读详情

相关推荐

Scrapy爬虫框架

Scrapy是一个基于Python的开源网络爬虫框架,用于从网页中提取数据。它提供了一套高效、灵活和可扩展的工具,可以帮助开发者快速构建和部署爬虫程序Scrapy是一个由Python语言开发的适用爬取网站数据、提取结构性数据的Web应用程序框架。主要用于数据挖掘、信息处理、数据存储和自动化测试等。通过Scrapy框架实现一个爬虫,只需要少量的代码,就能够快速的网络抓取Scrapy基于Twisted,Twisted是一个异步网络框架,主要用于提高爬虫的下载速度。

Java/Python大数据随笔 2651

scrapy中间件详解

scrapy中间件:scrapy中间件介绍下载器中间件添加ip代理 scrapy中间件介绍 = = scrapy中间件是scrapy框架的重要组成部分 分为两大种类:下载器中间件(DownloaderMiddleware)和爬虫中间件(SpiderMiddleware) 图中4、5为下载器中间件 图中6、7为爬虫中间件 下载器中间件是Scrapy请求/响应处理的钩子框架。这是一个轻,低层次的系统,全球范围内改变斯拉皮的请求和响应。 下载器中间件主要功能: 1、添加ip代理 2、添加cookie 3、添

weixin_44457673的博客 4406

精通 Python 网络爬虫:核心技术、框架与项目实战

内容简介 本书从技术、工具与实战3个维度讲解了 Python 网络爬虫: 技术维度:详细讲解了 Python 网络爬虫实现的核心技术,包括网络爬虫的工作原理、如何用 urllib 库编写网络爬虫、爬虫的异常处理、正则表达式、爬虫中 Cookie 的使用、爬虫的浏览器伪装技术、定向爬取技术、反爬虫技术,以及如何自己动手编写网络爬虫; 工具维度:以流行的 Python 网络爬虫框架 Scrapy 为...

GitChat 7519

Scrapy详解之中间件(Middleware)

概述   >>>阅读全文

sweetfire的博客 750

Python爬虫框架Scrapy应用实战解析

Scrapy是一个为了爬取网站数据,提取结构化数据而编写的应用程序框架,可以应用在包括数据挖掘、信息处理或存储历史数据等一系列功能的程序中。 该框架也可以应用在获取API(如Amazon Associates Web Services的API)所返回的数据或通用的网络爬虫中。

sinat_30844883的博客 1847

Python爬虫进阶——Scrapy框架原理及分布式爬虫构建

1 Scrapy简介 1.1 概念 Scrapy是由Python语言开发的一个快速、高层次的屏幕抓取和web信息抓取框架,用于抓取web站点并从页面中提取结构化的数据。 Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试, Scrapy还使用了Twisted异步网络库来处理网络通讯。 Scrapy最便捷的地方在于,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。 通过scrapy框

学习服务 4091

Scrapy工作原理

一、Scrapy架构图 Scrapy框架主要由六大组件组成,它们分别是调试器(Scheduler)、下载器(Downloader)、爬虫(Spider)、中间件(Middleware)、实体管道(Item Pipeline)和Scrapy引擎(Scrapy Engine) 1、Scrapy Engine(引擎): 引擎负责控制数据流在系统的所有组件中流动,并在相应动作发生时触发事件。 2、...

可爱程序员 1万+

Python Scrapy的爬虫中间件开发

本文系统解析Scrapy爬虫中间件(Spider Middleware)的开发方法论,覆盖从基础概念到高级实践的全链路知识。通过第一性原理推导中间件的核心机制,结合层次化架构分析(理论→设计→实现→应用),提供生产级代码示例与可视化流程模型。重点解决中间件开发中的关键问题:请求/响应拦截策略、反爬对抗优化、多中间件协作顺序、分布式场景适配等。适合从初级开发者到架构师的全技术栈读者,兼具理论深度与工程实践价值。爬虫中间件解决的核心问题是在蜘蛛处理响应前后注入自定义逻辑。

AI天才研究院 2386

Scrapy爬虫(八):中间件的使用实例

Scrapy爬虫(八):中间件的使用实例Scrapy爬虫八中间件的使用实例 user-agent 最简单的中间件 settingspy中配置中间件 本章将介绍最简单的中间件user-agent中间件的使用。 user-agentuser-agent是咱们模拟浏览器比较重要的参数,主要是防止爬虫被ban,前几章我们了解到在settings.py中可以设置user-agent,如:USER_AGEN

李燕西的博客 1万+

基于Scrapy爬虫框架的运行原理

Scrapy是一个非常强大的第三方库,也是一个提高爬虫效率的框架,入门较难。 Requests和Scrapy两个有所不同,requests为网页级爬虫,而SCrapy为网站级,Requests注重页面下载,Scrapy注重爬虫结构, 能够对多个网站发起请求,并发性高,因此是网络爬虫的重要部分。 框架内部包含模块可以描述为“5+2”模块,包含: Spiders, Item Piplines Engi...

weixin_45596008的博客 1899

达梦数据库与sharding-jdbc的深度适配实践

本文详细介绍了达梦数据库与sharding-jdbc的深度适配实践,包括驱动与依赖管理、核心适配实现、注册与配置等关键步骤。通过扩展shardingSphere的方式,成功实现了达梦数据库的分库分表功能,并提供了常见问题解决方案和性能优化建议,助力企业级应用高效处理海量数据。

weixin_30300225的博客 623

基于Scrapy框架实现网络爬虫-Python

网络爬虫原理 互联网上大量的信息以网页形式提供给用户,用户通过浏览器从服务器获得网页数据并经过浏览器解析后,进行网页阅读、内容复制、链接单击等操作。用户与网页服务器的通信是通过HTTP或者HTTPS实现的,网络浏览器是用户向服务器发送请求数据、接收服务器回应数据、解析并呈现服务器回应数据的客户端软件。 用户不通过浏览器而是通过程序自动获取网页内容,有两种办法:一是当服务器提供API方法时,可以调用API获取网页数据;二是当服务器没有提供API方法时,需要使用爬虫程序从服务器获取网页数据并从中过滤提取所需数据

weixin_43845524的博客 6340

OpenCode:开源代码智能代理平台的全面解析

OpenCode是一个开源代码智能代理平台,采用模块化微服务架构,支持多种AI模型集成。该系统包含前端交互层、代理服务层和模型集成层,提供Build、Plan和General三种代理模式,分别负责代码编写、分析和复杂任务处理。OpenCode支持跨平台安装,具备权限验证、上下文感知等安全机制,并集成LSP协议实现深度代码理解。相比竞品,其开源特性、终端优先设计和提供商无关架构具有明显优势,适用于个人开发、团队协作等多种场景,为开发者提供强大的AI辅助编程能力。

Aaron_945的博客 1424

Scrapy网络爬虫框架学习

Scrapy是一个用Python编写的开源爬虫框架,目标是帮助开发者高效地从网站上提取数据。它和单纯用 requests + BeautifulSoup 不一样,Scrapy提供了一整套完整的“爬虫解决方案”,非常适合做中大型爬虫项目。

YoungLime的博客 2808

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5405

光耦CTR参数实战:如何避免误触发与功耗陷阱(附计算公式)

本文深入解析光耦CTR参数在电路设计中的关键作用,探讨如何平衡误触发风险与功耗表现。通过TLP521、PC817等常见型号的实测数据对比,提供不同工作状态下的选型策略和计算公式,帮助工程师优化设计,提升系统稳定性和能效。

2a4s6d8f0g的博客 323

17.网络爬虫—Scrapy入门与实战

Scrapy基础Scrapy是一个用于爬取网站数据和提取结构化数据的Python应用程序框架。Scrapy的设计是用于Web爬虫,也可以用于提取数据和自动化测试。 Scrapy提供了一个内置的HTTP请求处理器,可以通过编写自定义的中间件来扩展其功能。Scrapy使用Twisted事件驱动框架,可以同时处理数千个并发请求。 🧾 Scrapy的主要组件包括: ScrapyEngine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信

weixin_50804299的博客 7611

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 921

网络爬虫框架Scrapy

Scrapy是一个用Python编写的网络爬虫框架,它提供了许多工具和功能,使得开发者可以轻松地构建强大的网络爬虫。

2302_80048824的博客 2466

Python RK3588 MPP 8路视频硬解码!全体目光向我看齐!

本文重写了官方demo、加入了Zlmediakit进行拉流并通过pybind11将代码封装成so库,现在,在python中直接通过import的方式,就能完成基础的拉流解码操作,目前支持8路拉流解码!!!

m0_46303486的博客 4880

rtpengine 项目

rtpengine 项目

原来45的博客 1789

python网络爬虫知识---Scrapy框架

什么是Scrapy?Scrapy是用来干嘛的?怎么使用Scrapy?这篇让我们一起来认识。

x702604121的博客 2456

AI硬件加速:CPU vs GPU性能对比

AI硬件加速:CPU vs GPU性能对比 关键词:人工智能、硬件加速、CPU、GPU、性能对比、硬件架构、并行计算、优化策略、项目实战 摘要: 本文将深入探讨AI

AI天才研究院 1914

Scrapy 爬虫框架:原理与使用指南

在spiders目录下创建一个新的 Python 文件,并在文件中定义你的爬虫类。例如,在# 在这里编写解析网页内容并提取数据的代码# 使用 XPath 或 CSS 选择器来提取数据# ...pass。

Aaron_945的博客 2631

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: python基础 之(一) --- 基础语法1
下一篇: 爬虫框架Scrapy 之(六) --- scrapy增量爬虫
baoding4359
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值