Scrapy crawl spider 只像 DEPTH = 1 一样爬行,并以 reason = finished 停止

Scrapy crawl spider only crawls as if DEPTH = 1 and stops with reason = finished

我有一个相当简单的蜘蛛,它从文件(工作)加载 URLs,然后应该开始爬行并存档 HTML 响应。

它以前工作得很好,从那以后,我再也想不通我做了什么让它停止工作。 现在,蜘蛛只抓取每个 URL 的第一页,然后停止:

'finish_reason': 'finished',

蜘蛛:

    class TesterSpider(CrawlSpider):
        name = 'tester'

        allowed_domains = []

        rules = (
            Rule(LinkExtractor(allow=(), deny=(r'.*Zahlung.*', r'.*Cookies.*', r'.*Login.*', r'.*Datenschutz.*', r'.*Registrieren.*', r'.*Kontaktformular.*', )),callback='parse_item'),
        )

        def __init__(self, *a, **kw):
            super(CrawlSpider, self).__init__(*a, **kw)

        def start_requests(self):
            logging.log(logging.INFO, "======== Starting with start_requests")
            self._compile_rules()

            smgt = Sourcemanagement()

            rootdir = smgt.get_root_dir()
            file_list = smgt.list_all_files ( rootdir + "/sources" )
            links = smgt.get_all_domains()

            links = list(set(links))
            request_list = []
            for link in links:
                o = urlparse(link)
                result = '{uri.netloc}'.format(uri=o)
                self.allowed_domains.append(result)
                request_list.append ( Request(url=link, callback=self.parse_item) )

            return ( request_list )

        def parse_item(self, response):
            item = {}
            self.write_html_file ( response )
            return item

以及设置:

BOT_NAME = 'crawlerscrapy'
SPIDER_MODULES = ['crawlerscrapy.spiders']
NEWSPIDER_MODULE = 'crawlerscrapy.spiders'
USER_AGENT_LIST = "useragents.txt"
ROBOTSTXT_OBEY = True
CONCURRENT_REQUESTS = 150
DOWNLOAD_DELAY = 43
CONCURRENT_REQUESTS_PER_DOMAIN = 1
COOKIES_ENABLED = False
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
   'Accept-Encoding':'gzip, deflate, sdch',
   'Connection':'keep-alive',
   'Cache-Control':'max-age=0',
   'Accept-Language': 'de',
}
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
    'random_useragent.RandomUserAgentMiddleware': 400
}
AUTOTHROTTLE_ENABLED = False
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'
REACTOR_THREADPOOL_MAXSIZE = 20
LOG_LEVEL = 'DEBUG'
DEPTH_LIMIT = 0
DOWNLOAD_TIMEOUT = 15
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

知道吗,我做错了什么?

编辑:

我找到了答案:

request_list.append ( Request(url=link, callback=self.parse_item) )
# to be replaced by:
request_list.append ( Request(url=link, callback=self.parse) )

但我不太明白为什么。 https://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.spiders.Spider.parse 所以我可以在 parse_item 中 return 一个空的字典,但我不应该这样做,因为它会破坏事情的流程?

CrawlSpider.parse 是负责将规则应用于响应的方法。只有您发送给 CrawlSpider.parse 的回复才会应用您的规则,从而生成更多回复。

通过使用不同的回调生成请求,即表明您不希望将规则应用于对该请求的响应。

使用 CrawlSpider 子类(与 Spider 相对)时,放置 parse_item 回调的正确位置是您的规则。你已经做到了。

如果您希望通过规则和不同的回调来处理对启动请求的响应,您最好使用常规蜘蛛。 CrawlSpider 是一个非常专业的爬虫,用例集有限;一旦你需要做一些它不支持的事情,你需要切换到一个普通的蜘蛛。