scrapy框架知识重点

下载中间件

  • 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架。

  • 它是一个轻量级的底层系统,用来全局修改scrapy的request和response。

  • scrapy框架中的下载中间件,是实现了特殊方法的

内置中间件

  • scrapy系统自带的中间件被放在DOWNLOADER_MIDDLEWARES_BASE设置中

    可以通过命令 scrapy settings --get=DOWNLOADER_MIDDLEWARES_BASE 查看

  • 用户自定义的中间件需要在DOWNLOADER_MIDDLEWARES中进行设置 该设置是一个dict,键是中间件类路径,其值是中间件的顺序,是一个正整数0-1000.越小越靠近引擎。

例:"scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100, 数字越小,优先级越高 即越靠近引擎

  • 各中间件含义

详见官方文档

https://docs.scrapy.org/en/latest/topics/downloader-middleware.html

常见下载中间件

  • CookieMiddleware 支持cookie,通过设置COOKIES_ENABLED 来开启和关闭
  • HttpProxyMiddleware HTTP代理,通过设置request.meta['proxy']的值来设置
  • UserAgentMiddleware 与用户代理中间件

下载中间件API

每个中间件都是Python的一个类,它定义了以下一个或多个方法:

  • process_request(request,spider) 处理请求,对于通过中间件的每个请求调用此方法

  • process_response(request, response, spider) 处理响应,对于通过中间件的每个响应,调用此方法

  • process_exception(request, exception, spider) 处理请求时发生了异常调用

  • from_crawler(cls,crawler ) 访问Scrapy API和核心组件的入口函数,也是用来创建爬虫的方法

这里需要提醒的是,要注意每个方法的返回值,返回值内容的不同,决定着请求或响应进一步在哪里执行

自定义中间件

用户代理池

settings文件 user_agent_list

#user_agent
user_agent_list = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
        "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
        "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
        "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
        "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
        "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]

middlewares文件设置用户代理

IP代理池

settings中ip 代理池

(此处是示例,以下的代理基本无法使用的,同时不建议大家去找免费的代理,会不安全)

#IP代理池
IPPOOL=[
    {"ipaddr":"61.129.70.131:8080"},
    {"ipaddr":"61.152.81.193:9100"},
    {"ipaddr":"120.204.85.29:3128"},
    {"ipaddr":"219.228.126.86:8123"},
    {"ipaddr":"61.152.81.193:9100"},
    {"ipaddr":"218.82.33.225:53853"},
    {"ipaddr":"223.167.190.17:42789"}
]

middlewares文件设置用户代理

Scrapy.settings

BOT_NAME = 'baidu' #scrapy 项目名字

SPIDER_MODULES = ['baidu.spiders']#爬虫模块 NEWSPIDER_MODULE = 'baidu.spiders'#使用genspider 命令创建的爬虫模块

1.基本配置

  1. 项目名称,默认的USER_AGENT由它来构成,也作为日志记录的日志名

    #BOT_NAME = 'baidu'

  2. 爬虫应用路径

    #SPIDER_MODULES = ['Amazon.spiders']

    #NEWSPIDER_MODULE = 'Amazon.spiders'

  3. 客户端User-Agent请求头

    USER_AGENT = ' '

  4. 是否遵循爬虫协议

    #Obey robots.txt rules

    ROBOTSTXT_OBEY = False

  5. 是否支持cookie,cookiejar进行操作cookie,默认开启

    #Disable cookies (enabled by default)

    #COOKIES_ENABLED = False

  6. Telnet用于查看当前爬虫的信息,操作爬虫等...使用telnet ip port ,然后通过命令操作

    #TELNETCONSOLE_ENABLED = False

    #TELNETCONSOLE_HOST = '127.0.0.1'

    #TELNETCONSOLE_PORT = [6023,]

  7. Scrapy发送HTTP请求默认使用的请求头

    #DEFAULT_REQUEST_HEADERS = {

    #'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',

    'Accept-Language': 'en',

    }

  8. 请求失败后(retry)

    scrapy自带scrapy.downloadermiddlewares.retry.RetryMiddleware中间件,如果想通过重试次数,可以进行如下操作:

    参数配置:

    #RETRY_ENABLED: 是否开启retry

    #RETRY_TIMES: 重试次数

    #RETRY_HTTP_CODECS: 遇到什么http code时需要重试,默认是500,502,503,504,408,其他的,网络连接超时等问题也会自动retry的

2.并发与延迟

  1. 下载器总共最大处理的并发请求数,默认值16

    #CONCURRENT_REQUESTS = 32

  2. 每个域名能够被执行的最大并发请求数目,默认值8

    #CONCURRENT_REQUESTS_PER_DOMAIN = 16

  3. 能够被单个IP处理的并发请求数,默认值0,代表无限制,需要注意两点

    #I、如果不为零,那CONCURRENT_REQUESTS_PER_DOMAIN将被忽略,即并发数的限制是按照每个IP来计算,而不是每个域名

    #II、该设置也影响DOWNLOAD_DELAY,如果该值不为零,那么DOWNLOAD_DELAY下载延迟是限制每个IP而不是每个域 #CONCURRENT_REQUESTS_PER_IP = 16

  4. 如果没有开启智能限速,这个值就代表一个规定死的值,代表对同一网址延迟请求的秒数

    #DOWNLOAD_DELAY = 3

3.智能限速/自动节流:AutoThrottle extension

  1. 介绍

    from scrapy.contrib.throttle import AutoThrottle

    http://scrapy.readthedocs.io/en/latest/topics/autothrottle.html

    #topics-autothrottle

    设置目标:

    1.比使用默认的下载延迟对站点更好

    2.自动调整scrapy到最佳的爬取速度,所以用户无需自己调整下载延迟到最佳状态。用户只需要定义允许最大并发的请求,剩下的事情由该扩展组件自动完成

  2. 如何实现?

在Scrapy中,下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的。 注意,由于Scrapy可能在忙着处理spider的回调函数或者无法下载,因此在合作的多任务环境下准确测量这些延迟是十分困难的。 不过,这些延迟仍然是对Scrapy(甚至是服务器)繁忙程度的合理测量,而这扩展就是以此为前提进行编写的。

  1. 限速算法

    自动限速算法基于以下规则调整下载延迟

    1. spiders开始时的下载延迟是基于AUTOTHROTTLE_START_DELAY的值

    2. 当收到一个response,对目标站点的下载延迟=收到响应的延迟时间/AUTOTHROTTLE_TARGET_CONCURRENCY

    3. 下一次请求的下载延迟就被设置成:对目标站点下载延迟时间和过去的下载延迟时间的平均值

    4. 没有达到200个response则不允许降低延迟

    5. 下载延迟不能变的比DOWNLOAD_DELAY更低或者比AUTOTHROTTLE_MAX_DELAY更高

  2. 配置使用

    开启True,默认False

    #AUTOTHROTTLE_ENABLED = True

    起始的延迟

    #AUTOTHROTTLE_START_DELAY = 5

    最小延迟

    #DOWNLOAD_DELAY = 3

    最大延迟

    #AUTOTHROTTLE_MAX_DELAY = 10

    每秒并发请求数的平均值,不能高于 CONCURRENT_REQUESTS_PER_DOMAIN或CONCURRENT_REQUESTS_PER_IP,调高了则吞吐量增大请求目标站点,调低了则对目标站点更加”礼貌“

    每个特定的时间点,scrapy并发请求的数目都可能高于或低于该值,这是爬虫试图达到的建议值而不是硬限制

    AUTOTHROTTLE_TARGET_CONCURRENCY = 16.0

    调试

    #AUTOTHROTTLE_DEBUG = True

    #CONCURRENT_REQUESTS_PER_DOMAIN = 16

    #CONCURRENT_REQUESTS_PER_IP = 16

4.爬取深度与爬取方式

  1. 爬虫允许的最大深度,可以通过meta查看当前深度;0表示无深度

#DEPTH_LIMIT = 3

  1. 爬取时,0表示深度优先Lifo(默认);1表示广度优先FiFo

    后进先出,深度优先

#DEPTH_PRIORITY = 0

#SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleLifoDiskQueue'

#SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.LifoMemoryQueue'

先进先出,广度优先

#DEPTH_PRIORITY = 1

#SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'

#SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

  1. 调度器队列

    #SCHEDULER = 'scrapy.core.scheduler.Scheduler'

    #from scrapy.core.scheduler import Scheduler

  2. 访问URL去重

    #DUPEFILTER_CLASS = 'step8_king.duplication.RepeatUrl'

5.中间件、Pipelines、扩展

  1. Enable or disable spider middlewares

    #See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

    #SPIDER_MIDDLEWARES = {'baidu.middlewares.AmazonSpiderMiddleware': 543,}

  2. Enable or disable downloader middlewares

    See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { # 'baidu.middlewares.DownMiddleware1': 543, }

  3. Enable or disable extensions # See http://scrapy.readthedocs.org/en/latest/topics/extensions.html

    #EXTENSIONS = {#'scrapy.extensions.telnet.TelnetConsole': None,#}

  4. Configure item pipelines

    #See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html

    ITEM_PIPELINES = {'baidu.pipelines.CustomPipeline': 200, }

6.缓存

"""

启用缓存

目的用于将已经发送的请求或相应缓存下来,以便以后使用

from scrapy.downloadermiddlewares.httpcache import HttpCacheMiddleware

from scrapy.extensions.httpcache import DummyPolicy

from scrapy.extensions.httpcache import FilesystemCacheStorage

"""

是否启用缓存策略

#HTTPCACHE_ENABLED = True

缓存策略:所有请求均缓存,下次在请求直接访问原来的缓存即可

#HTTPCACHE_POLICY = "scrapy.extensions.httpcache.DummyPolicy"

缓存策略:

根据Http响应头:Cache-Control、Last-Modified 等进行缓存的策略

#HTTPCACHE_POLICY = "scrapy.extensions.httpcache.RFC2616Policy"

缓存超时时间

#HTTPCACHE_EXPIRATION_SECS = 0

缓存保存路径

#HTTPCACHE_DIR = 'httpcache'

缓存忽略的Http状态码

#HTTPCACHE_IGNORE_HTTP_CODES = []

缓存存储的插件

#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值