1.scrapy中间件类型介绍

爬虫中间件介绍

  • 爬虫处理后的对象,都需要经过爬虫中间件后再传出
  • 爬虫中间件负责爬虫的行为规范,例如请求网址符号host

下载器中间件介绍

  • 爬虫将请求丢给下载器,需要经过下载器中间件
  • 下载器接收响应并反给爬虫,需要经过下载器中间件
  • 下载器中间件负责对请求和响应预处理

2.scrapy中间件的内置函数

中间件的内置函数

  • process_request:处理请求
  • process_response: 处理响应
  • process_exeception:处理异常

中间件的信号函数

  • def from_crawler(cls,crawler):类方法,传递爬虫信号
    • spider_opened:爬虫启动时通过信号传递并调用的方法

3.scrapy内置爬虫中间件

HttpErrorMiddleware

  • scrapy.spidermiddlewares.httperror.HttpErrorMiddleware
  • 负责解析响应的状态码,判断状态以及执行对应操作
  • 操作:200成功;301再次请求;400失败重试等

OffsiteMiddleware

  • scrapy.spidermiddlewares.offsite.OffsiteMiddleware
  • 读取请求的网址,并对比爬虫的allowed_domains
  • 在允许范围内,则允许请求;不在范围内则丢弃请求

RefererMiddleware

  • scrapy.spidermiddlewares.referer.RefererMiddleware
  • 解析请求,并自动读取和标记请求的Referer字段
  • 模拟浏览器,自动跟进Referer字段的内容更新

UrlLengthMiddleware

  • scrapy.spidermiddlewares.urllength.UrlLengthMiddleware
  • 读取请求的网址,统计请求网址的长度
  • 通常是没有长度限制的,可以自行设置

DepthMiddleware

  • scrapy.spidermiddlewares.depth.DepthMiddleware
  • 读取并记录请求的深度,方便对深度进行限制
  • 关键词:DETH_LIMIT

4.下载器中间件内置函数介绍

中间件的信号函数

  • def from_crawler(cls,crawler);类方法,传递爬虫信号
  • spider_opened: 爬虫启动时通过信号传递并掉用的方法

中间件的内置函数

  • process_request:处理请求
  • process_response: 处理响应
  • process_exeception:处理异常

process_request函数的返回值

  • 正常情况:None,Request,Response
  • 异常情况:ignoreRequest->process_exeception

process_response函数的返回值

  • 正常情况:Response,Request
  • 异常情况:IgnoreRequest->process_exeception

process_exeception函数的返回值

  • 正常情况:None,Request,Response
  • 异常情况:无

5.scrapy框架内置的下载器中间件

1.HttpAuthMiddleware

  • scrapy.downloadermiddleware.shttpauth.HttpAuthMiddleware
  • 负责HTTP请求头的认证信息,例如代理,账号密码等信息

2.DownloadTimeMiddleware

  • scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware
  • 设置请求的等待时间,默认180秒

3.DefaultHeadersMiddleware

  • scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware
  • 默认的请求头字段信息,settings.py可以选择设置

4.UserAgentMiddleware

  • scrapy.downloadermiddlewares.useragent.UserAgentMiddleware
  • 用户代理信息,专门存放浏览器和内核信息
  • 常用固定的UserAgent和可变化的UserAgent
  • UA顺序在默认请求头的后面,

5.RetryMiddleware

  • scrapy.Downloadermiddlewares.retry.RetryMiddleware
  • 下载器重试中间件,负责重新请求失败的响应,默认3次

6.MetaRefreshMiddleware

  • scrapy.downloadermiddlewares.redirect.MetaRefresh
  • 自动处理基于meta-refresh html重定向的响应内容

7.HTTPCompressionMiddleware

  • scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware
  • 主动压缩与目标站相互发送和接收的HTTP包

8.RedirectMiddleware

  • scrapy。Downloadermiddlewares.redirect.RedirectMiddleware
  • 基于响应状态信息,自动处理需要跳转的响应

9.CookiesMiddleware

  • scrapy.downloadermiddlewares.cookie.CookiesMiddleware
  • 模拟浏览器的网站cookie管理,并跟踪Request添加cookie
  • cookie可以包含很多信息,例如账户登录信息和广告等
    重点为UA,Cookie,proxy

10.HttpProxyMiddleware

  • scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware
  • 通过设置请求的proxy字段来给请求添加代理信息

11.DownloaderStatsMiddleware

  • scrapy.downloadermiddlewares.httpcompression.downloaderStats
  • 储存统计信息,包括请求,响应和异常处理的数量等

6.scrapy实战训练之User-Agent管理

4.UserAgentMiddleware

  • scrapy.downloadermiddlewares.useragent.UserAgentMiddleware
  • 用户代理信息,专门存放浏览器和系统内核信息
  • 常用固定的UserAgent和可变化的UserAgent
  • UA顺序在默认请求头的后面,

实战训练之UserAgent管理—代码实践

本次代码实践的目的;学习在settings.py文件中添加UA的方法
目标网站:http://www.spbeen.com/tool/request_info/
爬取内容:
在这里插入图片描述

  • 创建项目: scrapy startproject firstproject
  • 创建爬虫:scrapy genspider first www.spbeen.com/tool/request_info/
  • 编写爬虫文件spider.py
import scrapy
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware


class SecondSpider(scrapy.Spider):
    name = "second"
    allowed_domains = ["www.spbeen.com"]
    start_urls = ["http://www.spbeen.com/tool/request_info/"]

    def parse(self, response):
        ua_message = response.xpath('.//div[@class="content"]/div/div[2]/div[2]/text()').extract()
        print(ua_message)

  • 在settings.py中添加UA:
#本次代码实践的目的;
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"
  • 在项目目录下创建启动文件:
import os
from scrapy.cmdline import execute

if __name__ == "__main__":
    # execute(["scrapy", "crawl", "first"])
     execute("scrapy crawl first".split())
    
  • 运行结果:
    在这里插入图片描述

7.下载器中间件实战训练之cookie管理

9.CookiesMiddleware

  • scrapy.downloadermiddlewares.cookie.CookiesMiddleware
  • 模拟浏览器的网站cookie管理,并跟踪Request添加cookie
  • cookie可以包含很多信息,例如账户登录信息和广告等

下载器中间件实战训练之cookie管理----代码实践

  • 目标网站:shanzhi.spbeen.com

  • 创建项目:scrapy startproject cookieproject

  • 创建爬虫:scrapy genspider -t basic cookiespider shanzhi.spbeen.com

  • 查看网站:登录账号和密码:demo123,demo123
    在这里插入图片描述

  • 编写spider.py文件

import scrapy
from scrapy.downloadermiddlewares.cookies import CookiesMiddleware


class ThirdSpider(scrapy.Spider):
    name = "third"
    allowed_domains = ["shanzhi.spbeen.com"]
    start_urls = ["http://shanzhi.spbeen.com/detail/?id=2075"]

    def parse(self, response):
        print(response.text)
        print(response.url)
  • 运行会发现:爬虫爬取的网页为登录页面,而非首页详细信息
  • 在settings.py的DEFAULT_REQUEST_HEADERS添加cookie信息,运行会发现爬取的依然是登录页面信息而非首页信息

DEFAULT_REQUEST_HEADERS = {
#    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
#    "Accept-Language": "en",
   'Cookie': 'shanzhi_kmer=ckvgsj6xxkpbv0osqjrqg5g8ytm7cmjd; csrftoken=oNrfuYtcAyIoD6lui4hFpXR0erwzsG66UxEjJ3C3MF5n4Nf7eSxmLWUXQOvavubd',
}
  • 关闭下载器中间件cookie:默认下载器中间件是开启的,运行可以爬取到首页信息
# Disable cookies (enabled by default)
COOKIES_ENABLED = False
  • 具体原因:我们设置了Cookie,但Cookie中间件运行的时候会将我们设置的Cookie覆盖掉

CookieMiddlewares工作原理

  • 主动跟踪响应,并自动配置响应和请求的Cookie
  • 默认自动开启,并跟踪Cookie的变化和设置
  • 自动处理Cookie时,不支持手动添加的Cookie
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐