scrapy 通过API更改剪贴设置

8nuwlpux  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(147)

我使用scrapy和scrapyd,并通过api(与 Postman 软件)发送一些自定义设置。
请求的照片:

例如,我通过api发送start_urls的值,它工作正常。
现在的问题是,我无法在爬行中应用通过API发送的设置。
例如,我发送了CONCURRENT_REQUESTS的值,但是它没有被应用,如果我们可以在update_settings函数中引入self,问题就解决了,但是会出现错误。
我的代码:

from scrapy.spiders import CrawlSpider, Rule
from scrapy.loader import ItemLoader
from kavoush.lxmlhtml import LxmlLinkExtractor as LinkExtractor
from kavoush.items import PageLevelItem

my_settings = {}

class PageSpider(CrawlSpider):
 name = 'github'

 def __init__(self, *args, **kwargs):
   self.start_urls = kwargs.get('host_name')
   self.allowed_domains = [self.start_urls]
   my_settings['CONCURRENT_REQUESTS']= int(kwargs.get('num_con_req'))
   self.logger.info(f'CONCURRENT_REQUESTS? {my_settings}')

   self.rules = (
        Rule(LinkExtractor(allow=(self.start_urls),deny=('\.webp'),unique=True),
        callback='parse',
        follow=True),
    )
   super(PageSpider, self).__init__(*args, **kwargs)

   #custom_settings = {
   #  'CONCURRENT_REQUESTS': 4,
   #}

 @classmethod
 def update_settings(cls, settings):
    cls.custom_settings.update(my_settings)
    settings.setdict(cls.custom_settings or {}, priority='spider')

 def parse(self,response):
    loader = ItemLoader(item=PageLevelItem(), response=response)
    loader.add_xpath('page_source_html_lang', "//html/@lang")
    yield loader.load_item()

 def errback_domain(self, failure):
    self.logger.error(repr(failure))

期望值:
如何透过api及postman更改设定?
我在上面的例子中以CONCURRENT_REQUESTS设置为例,在某些情况下,可能需要通过api更改多达10个设置。
更新:
如果我们删除my_settings = {}update_settings,并且命令如下所示,则在运行scrapyd-deploy时会发生错误(KeyError: 'CONCURRENT_REQUESTS'),因为CONCURRENT_REQUESTS此时没有值。
上述场景代码的一部分:

class PageSpider(CrawlSpider):
 name = 'github'

 def __init__(self, *args, **kwargs):
  self.start_urls = kwargs.get('host_name')
  self.allowed_domains = [self.start_urls]
  my_settings['CONCURRENT_REQUESTS']= int(kwargs.get('num_con_req'))
  self.logger.info(f'CONCURRENT_REQUESTS? {my_settings}')

  self.rules = (
        Rule(LinkExtractor(allow=(self.start_urls),deny=('\.webp'),unique=True),
        callback='parse',
        follow=True),
  )
  super(PageSpider, self).__init__(*args, **kwargs)

 custom_settings = {
  'CONCURRENT_REQUESTS': my_settings['CONCURRENT_REQUESTS'],
  }

感谢大家

hgncfbus

hgncfbus1#

我可以100%自信地说,在scrappy中,用户不可能在运行时更新spider设置(来自spider.__init,如问题代码所证明)
当调用scrappy应用程序的spider.__init__方法已使用之前接收的设置初始化过程时:从基本设置、项目设置、spider的custom_settings(硬编码在spider的源代码中)。
scrappy github问题追踪器上的相关问题:

根据scrapyd文档,需要将查询中的setting=DOWNLOAD_DELAY=2设置为scrapyd/schedule才能传输scrapy设置。据我所知,这是scrapyd中唯一支持的传输设置的方式。

ggazkfy8

ggazkfy82#

删除my_settings = {}update_settings类函数。
你试过这个吗?

class PageSpider(CrawlSpider):
  name = 'github'

  def __init__(self, *args, **kwargs):
    super(PageSpider, self).__init__(*args, **kwargs)
    self.start_urls = kwargs.get('host_name')
    self.allowed_domains = [self.start_urls]

    self.rules = (
        Rule(LinkExtractor(allow=(self.start_urls),deny=('\.webp'),unique=True),
        callback='parse',
        follow=True),
    )

    self.my_settings = {
        'CONCURRENT_REQUESTS': int(kwargs.get('num_con_req'))
    } 
    self.logger.info(f'CONCURRENT_REQUESTS? {self.my_settings["CONCURRENT_REQUESTS"}')

相关问题