当前位置: 首页 > news >正文

探索Scrapy中间件:自定义Selenium中间件实例解析

简介

Scrapy是一个强大的Python爬虫框架,可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中,中间件是其重要特性之一,允许开发者在爬取过程中拦截和处理请求与响应,实现个性化的爬虫行为。

本篇博客将深入探讨Scrapy中间件的关键作用,并以一个实例详细介绍了自定义的Selenium中间件。我们将从Scrapy的基本设置开始,逐步讲解各项常用设置的作用与配置方法。随后,重点关注中间件的重要性,介绍了下载器中间件和Spider中间件的作用,并通过一个自定义Selenium中间件的示例,演示了如何利用Selenium实现页面渲染,并在Scrapy中应用该中间件。
如果对您对scrapy不了解,建议先了解一下:
初识Scrapy:Python中的网页抓取神器 - 掘金 (juejin.cn)

编写settings.py

本文件为scrapy的配置文件.

以下是有关Scrapy设置的详细介绍:

  1. BOT_NAME: 设置爬虫的名称。
  2. SPIDER_MODULESNEWSPIDER_MODULE: 定义了包含爬虫代码的模块路径。
  3. ROBOTSTXT_OBEY: 设置为True时,遵守Robots协议,爬虫将会尊重网站的robots.txt文件。
  4. USER_AGENT: 设置用户代理(User-Agent),模拟浏览器访问。
  5. DOWNLOAD_DELAYCONCURRENT_REQUESTS_PER_IP: 控制下载延迟和每个IP的并发请求数,用于避免过度访问网站。
  6. COOKIES_ENABLED: 设置为True时,启用Cookies。
  7. DEFAULT_REQUEST_HEADERS: 设置默认的HTTP请求头。
  8. ITEM_PIPELINES: 定义项目管道,用于处理爬取的数据。
  9. DOWNLOADER_MIDDLEWARESSPIDER_MIDDLEWARES: 分别定义下载器中间件和Spider中间件,用于在请求和响应过程中执行特定操作。
  10. AUTOTHROTTLE_ENABLEDAUTOTHROTTLE_TARGET_CONCURRENCY: 自动限速功能,帮助动态调整请求速率,以防止被封IP。

这些设置可以在Scrapy项目中的settings.py文件中进行配置。例如:


BOT_NAME = 'mybot'SPIDER_MODULES = ['mybot.spiders']
NEWSPIDER_MODULE = 'mybot.spiders'ROBOTSTXT_OBEY = TrueUSER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'DOWNLOAD_DELAY = 2
CONCURRENT_REQUESTS_PER_IP = 4COOKIES_ENABLED = FalseDEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}ITEM_PIPELINES = {'mybot.pipelines.MyPipeline': 300,
}DOWNLOADER_MIDDLEWARES = {'mybot.middlewares.MyDownloaderMiddleware': 543,
}SPIDER_MIDDLEWARES = {'mybot.middlewares.MySpiderMiddleware': 543,
}AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

以上是一些常用的Scrapy设置,可以根据需要进行调整和扩展,以满足特定爬虫的要求。

其中DEFAULT_REQUEST_HEADERS中设置默认的请求头只是整个scrapy的默认爬虫,可以具体的spider里覆盖,仅作用于该spider。

例如:

header={'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','Cookie':"*****************************************************"
}
for i in range(1, 2):key = scenic_namelist[i]newurl = 'https:/www.***********.com/ticket/list.htm?keyword=' + key + '&region=&from=mpl_search_suggest'print(newurl)yield Request(url=newurl,headers=header)

该操作可用于一个scrapy项目里有多个网站的爬虫的情况下,需要设置不同的请求头。
可以在生成request时去添加header,将覆盖setting里配置的默认header。

而文章中PIP管道和各个中间件之中的配置后边的数字是指优先度。数字越小优先度越高,若同时启动多个中间件,请求将从优先度高的中间件->优先度低的中间件的顺序全部处理一遍。

自定义中间件

Scrapy中间件是在Scrapy引擎处理请求和响应的过程中,允许你在特定的点上自定义处理逻辑的组件。它们在整个爬取过程中能够拦截并处理Scrapy引擎发送和接收的请求和响应。中间件可以用于以下几个方面:

  1. 全局性处理请求和响应: 中间件可以截取所有请求和响应,允许你对它们进行全局性的修改,例如添加自定义的请求头、代理设置或处理响应数据等。
  2. 自定义爬取过程: 通过中间件,你可以自定义爬取的逻辑。例如,在请求被发送之前,可以通过中间件对请求进行处理,或者在收到响应后对响应进行预处理,以适应特定需求或网站的要求。
  3. 处理下载器(Downloader)和Spider之间的通信: 中间件允许你在下载器和Spider之间进行通信,并在其中植入处理逻辑。这可以用于在请求下载之前或响应到达Spider之后执行额外的操作。
  4. 实现和管理代理、用户认证等: 中间件也常用于处理代理设置、用户认证等功能。这些功能可能是整个爬取过程中必不可少的一部分。
  5. 处理异常和错误: 中间件可以用于捕获请求过程中可能出现的异常或错误,以执行相应的错误处理逻辑,比如重试请求或记录错误日志等。

在Scrapy中,有两种类型的中间件:

  • Downloader Middleware:用于处理引擎发送给下载器的请求和下载器返回的响应。
  • Spider Middleware:处理引擎发送给Spider的响应和Spider返回的请求。

通过编写和配置这些中间件,我们可以高度定制Scrapy爬虫的行为,从而更有效地处理网站数据并应对不同的场景和需求。
下面我们以一个自定义的Selenium中间件为例子来让大家更加深入的了解中间件。

from selenium import webdriver
from scrapy.http import HtmlResponse
from selenium.common.exceptions import TimeoutException
from scrapy import signalsclass SeleniumMiddleware(object):def __init__(self):self.driver = webdriver.Chrome(executable_path='path_to_chromedriver')@classmethoddef from_crawler(cls, crawler):middleware = cls()crawler.signals.connect(middleware.spider_closed, signals.spider_closed)return middlewaredef process_request(self, request, spider):if request.meta.get('selenium'):try:self.driver.get(request.url)body = self.driver.page_source.encode('utf-8')return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)except TimeoutException:return HtmlResponse(self.driver.current_url, status=504, request=request)return Nonedef spider_closed(self, spider):self.driver.quit()

这个中间件示例使用了Selenium库,它会在处理Scrapy请求时,检查请求的元数据中是否包含selenium字段。如果包含,它将使用Selenium打开浏览器并加载页面,然后返回页面的HTML内容给Spider。request.meta.get也是我们判断某个中间件是否启动常用操作。

要使用这个中间件,需要在settings.py中进行相应的配置:

DOWNLOADER_MIDDLEWARES = {'your_project_name.middlewares.SeleniumMiddleware': 543,
}SELENIUM_BROWSER = 'Chrome'  # 设置浏览器类型,可以是Chrome/Firefox等

在使用selenium中间件时有一些需要注意的地方。
如果使用场景是某个搜索框,若我们使用显示等待的方式等待结果元素的动态加载时要考虑到,若搜索结果为空的情况,此时显示等待就会报时间超限的异常。我们要提前想好处理逻辑。

下面是一个此种场景下的真实样例:

image.png

当然我们的生成URL列表的逻辑也可以放在中间件中,在def init(self):中执行。

相关文章:

探索Scrapy中间件:自定义Selenium中间件实例解析

简介 Scrapy是一个强大的Python爬虫框架,可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中,中间件是其重要特性之一,允许开发者在爬取过程中拦截和处理请求与响应,实现个性化的爬虫行为。 本篇博客将深入探讨…...

渗透测试--3.中间人攻击

渗透测试--3.中间人攻击 一 .中间人攻击arp欺骗DNS欺骗无线局域网漏洞利用使用 Ettercap 执行欺骗攻击arp欺骗实例1、首先查看欺骗之前靶机ip以及默认网关,2、查看kali的IP地址(192.168.76.134),MAC:000c294079903、使用Ettercap,将A主机和B主机加入到target中4、点击右上…...

nginx/html关闭网页缓存方法

【问题】 通常代理服务器默认是有缓存的,即用户访问网址的时候默认获取到的是缓存,只有刷新之后才能得到服务器端的最新文件 【解决】 以nginx为例,找到配置文件nginx.conf,找到http {},在其花括号之内添加命令&…...

华为防火墙 Radius认证

实现的功能:本地内网用户上网时必须要进行Radius验证,通过后才能上网 前置工作请按这个配置:华为防火墙 DMZ 设置-CSDN博客 Windows 服务器安装 Radius 实现上网认证 拓扑图如下: 一、服务器配置 WinRadius 1、安装WinRadius …...

用spring发送http请求

在Spring中&#xff0c;你可以使用RestTemplate或WebClient来发送HTTP请求。下面分别给出使用这两个类的简单示例。 现在pom.xml中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artif…...

赴日开发工程师是做什么的?

日本的软件开发岗位对技术要求和沟通能力都有较高的要求&#xff0c;赴日开发工程师主要负责软件设计、开发和测试&#xff0c;包括编写代码、测试代码和修复漏洞等工作。开发人员必须对软件架构、设计模式和业务逻辑有深入的理解&#xff0c;并能做出合适的技术决策。 当然&a…...

Wireshark的数据包它来啦!

通过Wireshark工具&#xff0c;可以轻松的看到网卡的数据信息。通过Wireshark显示的数据包内容信息&#xff0c;通常分七栏&#xff0c;介绍一下&#xff1a; 1No.&#xff1a; 数据包编号。 2.Time Time显示时间&#xff0c;以1号数据包发生开始计时。 3.Source Source显示内容…...

接口测试需要验证数据库么?

有的接口会返回很多数据&#xff0c;有的接口可能就返回一个状态码及success之类的消息&#xff0c;这些需要验证数据库么&#xff1f;现在在写一个测试框架&#xff0c;配置接口参数和预期返回值&#xff0c;生成xml文件管理用例&#xff0c;用一个比较方法对预期和返回作比较…...

配置 `PostgreSQL` 与 `Keepalived` 以实现高可用性

配置 PostgreSQL 与 Keepalived 以实现高可用性通常包括以下步骤&#xff1a; PostgreSQL 配置 安装 PostgreSQL&#xff1a;在两台服务器上安装相同版本的 PostgreSQL。 sudo yum install postgresql-server postgresql-contrib初始化数据库&#xff1a;在两台服务器上初始化…...

C++: int转换成LPCSTR

LPCSTR类型是指向字符常量的指针&#xff0c;因此需要将int类型转换为字符串类型&#xff0c;然后再将字符串类型转换为LPCSTR类型。 以下是一个示例代码&#xff1a; int num 123; char str[10]; sprintf(str, "%d", num); // 将int类型转换为字符串类型 LPCSTR …...

kettle官网和中文网地址

整理的kettle相关的网站地址&#xff1a; github 地址&#xff1a; https://github.com/pentaho/pentaho-kettle kettle下载目录&#xff1a; https://sourceforge/projects/pentaho/files/ kettle9.2下载地址&#xff1a; https://sourceforge/projects/pentaho/files/Penta…...

纽扣电池类产品上架亚马逊澳大利站认证标准要求AS/NZS 62368

纽扣电池一般来说常见的有充电的和不充电的两种&#xff0c; 充电的包括3.6V可充锂离子扣式电池(LIR系列)&#xff0c;3V可充锂离子扣式电池(ML或VL系列)&#xff1b;不充电的包括3V锂锰扣式电池(CR系列)及1.5V碱性锌锰扣式电池(LR及SR系列)。 澳大利亚*已经发布了经批准的《消…...

网站监控的重要性及实施策略

随着互联网的快速发展&#xff0c;网站已经成为企业和个人不可或缺的在线服务平台。然而&#xff0c;网站的安全性和稳定性一直是企业及个人非常关注的问题。一旦网站出现故障或者被攻击&#xff0c;将会给企业和个人带来严重的损失。因此&#xff0c;实施有效的网站监控策略对…...

亚马逊车灯外贸出口CE认证标准办理解析

车灯是车辆夜间行驶在道路照明的工具&#xff0c;也是发出各种车辆行驶信号的提示工具。车灯一般分为前照灯、尾灯、转向灯等。车灯出口欧盟需要办理CE认证。 CE认证是欧盟对进入欧洲市场的产品强制性的认证标志&#xff0c;是指符合欧盟安全、健康、环境保护等标准和要求的产…...

windows 查看防火墙设置命令使用方法

点击键盘上windows键&#xff0c;输入cmd&#xff0c;选择以管理员身份运行 输入下面命令查看使用说明 netsh advfirewall firewall add rule ? 发现显示不全&#xff0c;不方便看 可以输入下面命令&#xff0c;生成文件&#xff0c;方便查看 netsh advfirewall firewall ad…...

[Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例

写在前面 先检查自己有没有安装使用wget的命令&#xff0c;没有的话输入下面命令安装&#xff1a; apt-get install wget -y查看gcc的安装 sudo apt install gcc #安装gcc gcc --version #查看gcc是否安装成功 #若上述命令不成功使用下面的命令尝试之后再执行上面…...

NextJS开发:解决React Hook useEffect has a missing dependency

NextJS编译出现如下错误,原因是在使用useEffect时&#xff0c;当我们将函数的声明放在useEffect函数外面时 或者使用useState定义的历史变量,会报警告 Warning: React Hook useEffect has a missing dependency解决方法&#xff1a; 1、逐个添加注释忽略警告 useEffect(() &…...

交叉编译tcpdump

1、下载libpcap源码和tcpdump源码【最后有链接】 2、先编译libpcap 解压后&#xff0c;进入目录&#xff0c;执行以下命令&#xff1a; mkdir build cd build ../configure --hostarm-linux CCarm-gcc7.3-linux-musleabi-gcc --prefix$PWD/install make make install3、再编译…...

万字解析设计模式之 装饰者模式

一、装饰者模式 1.1概述 装饰者模式是一种结构型设计模式&#xff0c;它允许在运行时动态地为一个对象添加额外的职责。它以一种透明的方式来扩展对象的功能&#xff0c;而不需要通过子类来实现。在装饰者模式中&#xff0c;有一个基本对象&#xff0c;也称为组件&#xff0c;…...

生成对抗网络Generative Adversarial Network,GAN

Basic Idea of GAN Generation&#xff08;生成器&#xff09;  Generation是一个neural network&#xff0c;它的输入是一个vector&#xff0c;它的输出是一个更高维的vector&#xff0c;以图片生成为例&#xff0c;输出就是一张图片&#xff0c;其中每个维度的值代表生…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...