scrapy组件、中间件、spider中类方法from_crawler的作用

 

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    spider = cls(*args, **kwargs)
    spider._set_crawler(crawler)
    return spider
  • cls代表这个类,因此,以下是用给定的参数创建了一个cls类的实例spider。参数会经过__init__方法,因为实例需要初始化。
spider = cls(*args, **kwargs)
  • 设置spider实例的crawler属性
spider._set_crawler(crawler)
  • 返回实例
return spider

 

crawler属性在初始化class后,由类方法 from_crawler设置, 并且链接了本spider实例对应的Crawl对象。Crawler包含了很多项目中的组件,作为单一的入口点 (例如插件,中间件,信号管理器等).可以查看Crawler API

 

from_crawler用于实例化某个对象(中间件,模块),常常出现在对象的初始化,负责提供crawler.settings

这是一个类方法,scrapy创建spider的时候会调用。调用位置在crawler.py 的类Crawler中。这个方法的源码在上面,我们可以看到,在实例化这个spider以后,这个实例才有的settings和crawler属性,所以在__init__方法中是没法访问这俩属性的。如果非要在__init__方法中使用相关属性,那么只能重写该方法,大家可以尝试写写。

重写这个类方法需要注意的几点:

  • 需要返回一个实例对象
  • 返回实例对象括号里面的参数,是会进入初始化方法__init__的

如:当我们需要通过scrapy crawl spidername -a NAME=VALUE进行传递参数时,需要以下这种写法

class MySpider(scrapy.Spider):

     def __init__(self, parms=None, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)

但是,当通过命令scrapy crawl spidername -a parms=value的时候,会出现参数传不进来的情况,那是因为继承scrapy.Spider的时候重写了from_crawler类方法了

@classmethod
def from_crawler(cls, crawler):
    settings = crawler.settings
    return cls()

重写时没有将__init__需要的参数传过去,因为scrapy crawl spidername -a parms=value命令会通过from_crawler创建spider,所以需要返回对应的参数给__init__初始化方法

@classmethod
def from_crawler(cls, crawler):
    settings = crawler.settings
    return cls(*args, **kwargs)

 

欢迎关注公众号:日常bug,每天写至少一篇技术文章,每天进步一点点。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用自定义的 Scrapy 中间件来处理 response.follow() 请求。 首先,在你的 Scrapy 项目创建一个中间件文件,然后在这个文件定义一个新的中间件类。在这个类,你需要实现以下三个方法: ``` from scrapy import signals class MyMiddleware: def __init__(self): # 在这里初始化中间件 pass @classmethod def from_crawler(cls, crawler): # 创建中间件实例,并将其绑定到信号 middleware = cls() crawler.signals.connect(middleware.spider_opened, signals.spider_opened) return middleware def process_request(self, request, spider): # 在这里处理 response.follow() 请求 if request.callback == "parse": request = request.replace(callback=self.parse) return request def parse(self, response): # 在这里处理响应数据 pass ``` 然后,你需要在 Scrapy 的设置文件启用你的中间件: ``` # settings.py DOWNLOADER_MIDDLEWARES = { "myproject.middlewares.MyMiddleware": 500, } ``` 最后,在你的爬虫文件使用 response.follow() 方法即可。 ### 回答2: Scrapy是一个用于爬取网站数据的Python框架,可以通过设置中间件对请求和响应进行处理。中间件Scrapy的一个组件,可以对请求进行修改、过滤或重定向,同时也可以对响应进行处理。 要将response.follow方法加入到中间件里,需要按照以下步骤进行操作: 1. 创建一个新的Scrapy中间件类,继承自scrapy.downloadermiddlewares.DownloaderMiddleware类。 2. 在中间件重写process_response方法,该方法会在下载器下载完网页后被调用。 3. 在process_response方法判断当前的响应是否需要进行重定向,如果需要重定向,则调用response.follow方法来跟进重定向的URL。 4. 返回处理后的响应对象。 下面是一个示例: ```python from scrapy import Request class MyMiddleware(object): def process_response(self, request, response, spider): if response.status in [301, 302]: redirected_url = response.headers.get('Location') if redirected_url: new_request = Request( url=redirected_url, headers=request.headers, cookies=request.cookies, meta=request.meta, dont_filter=True # 如果要进行重定向,需要设置dont_filter为True,避免重复访问 ) # 调用response.follow方法来跟进重定向的URL return spider.follow(new_request) return response ``` 在上述示例,我们创建了一个名为MyMiddleware的中间件类,其重写了process_response方法方法首先判断响应的状态码是否为301或302,如果是,则获取重定向的URL,并创建一个新的Request对象。然后,通过调用spider.follow方法来跟进重定向的URL。最后,返回处理后的响应对象。 需要注意的是,上述示例仅为演示如何将response.follow方法加入到中间件里,具体的实现方式可能会因具体的项目需求而有所变化。 ### 回答3: 要将`response.follow`方法添加到Scrapy中间件,你需要按照以下几个步骤进行操作: 1. 创建一个自定义的中间件类,继承自Scrapy的`DownloaderMiddleware`类,并重写`process_request`方法: ```python from scrapy import Request class MyMiddleware(object): def process_request(self, request, spider): if isinstance(request, Request): # 判断请求是否为Request类型 if 'follow' in request.meta: # 判断请求的meta是否存在'follow'字段 url = request.url callback = request.callback priority = request.priority dont_filter = request.dont_filter return Request(url=url, callback=callback, priority=priority, dont_filter=dont_filter) return None ``` 2. 在Scrapy的设置文件`settings.py`,将自定义的中间件添加到`DOWNLOADER_MIDDLEWARES`配置项: ```python DOWNLOADER_MIDDLEWARES = { 'yourproject.middlewares.MyMiddleware': 543, # 数字越小,优先级越高 } ``` 3. 在爬虫使用`response.follow`方法,并在请求的meta添加`'follow': True`,以触发中间件的处理: ```python import scrapy class MySpider(scrapy.Spider): name = 'myspider' def start_requests(self): url = 'http://example.com/page1' yield scrapy.Request(url=url, callback=self.parse, meta={'follow': True}) def parse(self, response): # 使用response.follow方法,会调用中间件的process_request方法 yield response.follow('/page2', callback=self.parse_page2) def parse_page2(self, response): # 解析爬取到的数据 pass ``` 通过以上步骤,你就可以将`response.follow`方法添加到中间件,并在需要时使用`response.follow`方法进行请求的跟进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值