爬虫学习 Scrapy中间件&代理&UA随机&selenium使用

这篇具有很好参考价值的文章主要介绍了爬虫学习 Scrapy中间件&代理&UA随机&selenium使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


中间件

控制台操作 (百度只起个名

scrapy startproject mid
scrapy genspider baidu baidu.com

setting.py内

ROBOTSTXT_OBEY = False

LOG_LEVEL = "WARNING"

运行

scrapy crawl baidu

middlewares.py 中间件
爬虫学习 Scrapy中间件&代理&UA随机&selenium使用,Python爬虫,爬虫,学习,scrapy

先看下载器中间件

# Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

重点在 process_request

在引擎将请求的信息交给下载器之前,自动的调用该方法

process_response…
process_exception 异常 (看名就知道了…)
spider_open 爬虫开始

setting.py内 DOWNLOADER_MIDDLEWARES

运行顺序
爬虫学习 Scrapy中间件&代理&UA随机&selenium使用,Python爬虫,爬虫,学习,scrapy


UA、代理处理—process_request

process_request 返回值有规定

  1. 如果返回的 None,不做拦截,继续向后面的中间件执行.(多个中间件,权重大越往后)
  2. 如果返回的是Request.后续的中间件将不再执行.将请求重新交给引擎.引擎重新扔给调度器
  3. 如果返回的是Response,后续的中间件将不再执行.将响应信息交给引擎,引擎将响应丢给spider.进行数据处理

一个请求return ;yield一群

弄2个中间件???e.g.权重544 545

UA随机

老样子:

scrapy startproject douban
cd…
scrapy genspider movie douban.com
改setting

ROBOTSTXT_OBEY = False
LOG_LEVEL = “WARNING”

scrapy crawl movie

豆瓣UA 失败

setting 内有
USER_AGENT =

动态UA

可以使用useragentsring.com设置一个USER_AGENT_LIST
middlewares只留process_request即可

def process_request(self, request, spider):
        UA = choice(USER_AGENT_LIST)
        request.headers['User-Agent'] = UA
        return None

开启setting内的

DOWNLOADER_MIDDLEWARES = {
   "douban.middlewares.DoubanDownloaderMiddleware": 543,
}

代理处理

setting内

DOWNLOADER_MIDDLEWARES = {
   "douban.middlewares.DoubanDownloaderMiddleware": 543,
   "douban.middlewares.ProxyDownloaderMiddleware": 545, #加
}

PROXY_IP_LIST = {
    "IP:端口","IP:端口"
}

middlewares.py内

from douban.settings import PROXY_IP_LIST
from random import choice #随机

......

class ProxyDOwnloaderMiddleware:
    def process_request(self,request,spider)
        ip = choice(ProxyDOwnloaderMiddleware)
        request.meta['proxy'] = "https://"+ip
        return None  #放行


selenium+scrapy

selenium作为下载器

由于想要替换掉原来的downloader,原中间件无意义

原最大中间价最大优先级100

DOWNLOADER_MIDDLEWARES = {
   "zhipin.middlewares.ZhipinDownloaderMiddleware": 99,
}

如果有多个spider,替换掉的下载器可能占全局

想办法适配判断是否使用selenium 处理请求

新建request.py

from scrapy import Request


class SeleniumRequest(Request): #继承Request ,导致功能与scrapy一致
    pass

爬虫内

from typing import Iterable
import scrapy

from zhipin.request import SeleniumRequest


class ZpSpider(scrapy.Spider):
    name = "zp"
    allowed_domains = ["zhipin.com"]
    start_urls = ["https://zhipin.com"]


    def start_requests(self):
        yield SeleniumRequest(
            url=self.start_urls[0],
            callback=self.parse
        )
    def parse(self, response):
        pass

middleware

from zhipin.request import SeleniumRequest

......

def process_request(self, request, spider):
        #所有请求都回到这里
        #需要进行判断。判断出是否需要用selenium来处理请求
        #开始selenium的操作,返回页面源代码组装的response
        #isinstance 判断xxx , 是不是 xxx类型
        if isinstance(request,SeleniumRequest):
            pass
        else:
            return None
        return None

isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

isinstance() 与 type() 区别:

  • type() 不会认为子类是一种父类类型,不考虑继承关系。
  • isinstance() 会认为子类是一种父类类型,考虑继承关系。

如果要判断两个类型是否相同推荐使用 isinstance()。

不能以原来的思路写selenium ,因为只有3个返回值–None、 Request、 Response、

封装一个响应对象

在middlewares.py 导入一个类文章来源地址https://www.toymoban.com/news/detail-842624.html

from scrapy.http.response.html import HtmlResponse

......

def process_request(self, request, spider):
        if isinstance(request,SeleniumRequest):
       		self.web.get(request.url)
        	page_source = self.web.page_source
        	return HtmlResponse(
                url = request.url,
                status=200,
                headers=None,
                body=page_source,
                flags=None,
                request=request,
                Encoding = "utf-8"
                ) #来源于父类
            return None

到了这里,关于爬虫学习 Scrapy中间件&代理&UA随机&selenium使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云计算学习教程】什么是中间件?常见中间件有哪些?

    3)最后 Apache 把这个临时的静态网页文件发给用户。 采用 Perl、Python 和 Ruby 脚本语言编写的动态网页,其工作过程与 PHP 类似。 Apache 是最流行的开源网站服务器,在世界排名前 100 万的网站中,有 60.6% 的网站采用 Apache;在排名前 1000 的大型网站中,Apache 占到了 34.5%,而 N

    2024年04月22日
    浏览(42)
  • NestJS 的 中间件 学习

    中间件是在路由处理程序之前调用的函数。中间件函数可以访问 请求 和 响应 对象。在程序中我们可以让多个中间件串起来一起使用,当多个中间件一起使用时我们可以使用 next() 调用下一个中间件。 中间件主要是可以实现如下功能: 执行任何代码 更改请求和响应对象 结束

    2024年02月15日
    浏览(37)
  • hyperf 学习 三、中间件

    文档地址:Hyperf 中间件的原理就是请求时拦截并进行处理,再传到对应的回调,处理返回数据。 流程:request- middleware-response。 中间件在路由定义时配置。所以根据上一篇文章hyperf 学习 二、路由_lsswear的博客-CSDN博客 中注释路由 Controller、AutoController可以配置 options。 后来查

    2024年02月12日
    浏览(45)
  • 消息中间件Kafuka学习——初次配置使用

    MQ本质 : 例如 ActiveMQ、RabbitMQ、RocketMQ 等中间件。采用这种模型,本质就是将要推送的数据,不在存放在当前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。 kafuka模型 : 如果你看不懂这些概念没关系,我会带着大家一起梳理

    2023年04月10日
    浏览(36)
  • Python学习(3)- 消息中间件rabbitmq

    消息队列中间件是分布式系统中重要的组件,主要解决 应用解耦 , 异步消息 , 流量削锋 等问题,实现高性能,高可用,可伸缩和最终一致性架构 rabbitmq 简单模式 生产者: 链接rabbitmq 创建队列 向指定的队列中插入数据 交换机模式 发布订阅模式 模式 模糊匹配模式

    2024年02月22日
    浏览(50)
  • 六、用 ChatGPT 学习 Eureka 中间件源码

    目录 一、实验介绍 二、背景 三、ChatGPT 帮助分析 Eureka 源码 3.1 Eureka 源码在哪

    2024年02月16日
    浏览(46)
  • express学习笔记5 - 自定义路由异常处理中间件

    修改router/index.js,添加异常处理中间件 完整代码 创建 utils/constant:(为了方便后期统一维护,单独拉出来定义) 然后刷新http://localhost:8000/user  这就完成了

    2024年02月14日
    浏览(48)
  • Nginx 学习(十)高可用中间件的配置与实现

    调度器出现单点故障,如何解决? Keepalived实现了高可用集群 Keepalived最初是为LVS设计的,专门监控各服务器节点的状态 Keepalived后来加入了VRRP功能,防止单点故障 Keepalived检测每个服务器节点状态,当服务器节点异常或工作出现故障, Keepalived将故障节点从集群系统中剔除,故

    2024年02月09日
    浏览(109)
  • Go学习第十七章——Gin中间件与路由

    Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如,如果访问一个网页的话,不管访问什么路径都需要进行登录,

    2024年02月07日
    浏览(47)
  • 《分布式中间件技术实战:Java版》学习笔记(一):抢红包

    数据库建表 (1)red_send_record 记录用户发送了若干总金额的若干个红包。 (2)red_detail 记录用户发送的红包被分成的小红包金额。 (3)red_rob_record 记录用户抢到的红包金额。 随机生成红包金额 红包金额的最小单位是分,将红包金额放大100倍到int类型(为了方便生成随机数),保证

    2024年02月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包