我使用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'],
}
感谢大家
2条答案
按热度按时间hgncfbus1#
我可以100%自信地说,在scrappy中,用户不可能在运行时更新spider设置(来自
spider.__init
,如问题代码所证明)当调用scrappy应用程序的
spider.__init__
方法已使用之前接收的设置初始化过程时:从基本设置、项目设置、spider的custom_settings(硬编码在spider的源代码中)。scrappy github问题追踪器上的相关问题:
__init__
or from_crawler根据scrapyd文档,需要将查询中的
setting=DOWNLOAD_DELAY=2
设置为scrapyd/schedule才能传输scrapy设置。据我所知,这是scrapyd中唯一支持的传输设置的方式。ggazkfy82#
删除
my_settings = {}
和update_settings
类函数。你试过这个吗?