Scrapy Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

Всем доброго дня!

Написал простенький паучек. Код ниже:

import scrapy


class SpiderProsyr(scrapy.Spider):
    name = 'SpiderProsyr'
    starturl = ['https://pro-syr.ru/zakvaski-dlya-syra/']

    def parse(self, response):
        links = [data.get() for data in response.css('div.item_img1 a::attr(href)')]  # все ссылки на товары
        # после yield код продолжит работать у нас произойдет асинхронная работа в callback передаем что делаем в карточке
        for link in links:
            yield response.follow(link, callback=self.parse_card)

    def parse_card(self, response):
        name = response.css('h1::text').get()
        price = response.css('span.autocalc-product-price::text').get()
        availability = response.css('div.product-description b.outstock::text').get()
        type_of_starter = response.css('table tbody tr td:nth-child(n+2)::text').get()
        per_volume_of_milk = response.css('table tbody:nth-child(n+3) tr td:nth-child(n+2)::text').get()
        suitable_for_cheeses = response.css(
            'table tbody:nth-child(n+4) tr:nth-child(n+2) td:nth-child(n+2)::text').get()
        сountry_of_origin = response.css('table tbody:nth-child(n+5) tr:nth-child(n+2) td:nth-child(n+2)::text').get()
        company = response.css('table tbody:nth-child(n+5) tr:nth-child(n+1) td:nth-child(n+2)::text').get()
        yield {
            'name': name,
            'price': price,
            'availability': availability,
            'type_of_starter': type_of_starter,
            'per_volume_of_milk': per_volume_of_milk,
            'suitable_for_cheeses': suitable_for_cheeses,
            'сountry_of_origin': сountry_of_origin,
            'company': company
        }

# response.css('h1::text').get() заголовок
# response.css('span.autocalc-product-price::text').get() цена
# response.css('div.product-description b.outstock::text').get() наличие
# response.css('table tbody tr td:nth-child(n+2)::text').get() тип закваски n+2 второй вложенный блок
# response.css('table tbody:nth-child(n+3) tr td:nth-child(n+2)::text').get() на обьем молока
# response.css('table tbody:nth-child(n+4) tr:nth-child(n+2) td:nth-child(n+2)::text').get() подходит для сыров
# response.css('table tbody:nth-child(n+5) tr:nth-child(n+2) td:nth-child(n+2)::text').get() страна производитель
# response.css('table tbody:nth-child(n+5) tr:nth-child(n+1) td:nth-child(n+2)::text').get() компания

# Достаем с главной странички https://pro-syr.ru/zakvaski-dlya-syra/ все ссылки на товары response.css('div.item_img1 a::attr(href)')
# Что бы получить список ссылок: [data.get() for data in response.css('div.item_img1 a::attr(href)')]

При запуске сразу же получаю ошибку, точнее не ошибку, он попросту не хочет работать.

2024-08-13 15:00:54 [scrapy.utils.log] INFO: Scrapy 2.11.0 started (bot: ddproject)
2024-08-13 15:00:54 [scrapy.utils.log] INFO: Versions: lxml 5.3.0.0, libxml2 2.11.7, cssselect 1.2.0, parsel 1.9.1, w3lib 2.2.1, Twisted 22.10.0, Python 3.12.4 | packaged by Anaconda, Inc. | (main, Jun 18 2024, 15:03:56) [MSC v.1929 64 bit (AMD64)], pyOpenSSL 24.2.1 (OpenSSL 3.3.1 4 Jun 2024), cryptography 43.0.0, Platform Windows-10-10.0.19045-SP0
2024-08-13 15:00:54 [scrapy.addons] INFO: Enabled addons:
[]
2024-08-13 15:00:54 [asyncio] DEBUG: Using selector: SelectSelector
2024-08-13 15:00:54 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor
2024-08-13 15:00:54 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop
2024-08-13 15:00:54 [scrapy.extensions.telnet] INFO: Telnet Password: c3fb4cf0cc746ec0
2024-08-13 15:00:54 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2024-08-13 15:00:54 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'ddproject',
 'FEED_EXPORT_ENCODING': 'utf-8',
 'NEWSPIDER_MODULE': 'ddproject.spiders',
 'REQUEST_FINGERPRINTER_IMPLEMENTATION': '2.7',
 'ROBOTSTXT_OBEY': True,
 'SPIDER_MODULES': ['ddproject.spiders'],
 'TWISTED_REACTOR': 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'}
2024-08-13 15:00:55 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2024-08-13 15:00:55 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2024-08-13 15:00:55 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2024-08-13 15:00:55 [scrapy.core.engine] INFO: Spider opened
2024-08-13 15:00:55 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2024-08-13 15:00:55 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2024-08-13 15:00:55 [scrapy.core.engine] INFO: Closing spider (finished)
2024-08-13 15:00:55 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'elapsed_time_seconds': 0.001999,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2024, 8, 13, 11, 0, 55, 33915, tzinfo=datetime.timezone.utc),
 'log_count/DEBUG': 3,
 'log_count/INFO': 10,
 'start_time': datetime.datetime(2024, 8, 13, 11, 0, 55, 31916, tzinfo=datetime.timezone.utc)}
2024-08-13 15:00:55 [scrapy.core.engine] INFO: Spider closed (finished)

Пробовал отладку, плучаю сообщение, которое указанно выше в момент когда наследуюсь.

class SpiderProsyr(scrapy.Spider):

Так же проверял все селекторы, проверял по одному - все работает.

Подскажите как пофиксить пожалуйста, кто сталкивался с таким. Буду очень благодарен.


Ответы (1 шт):

Автор решения: Черный Сергей Николаевич

В ходе долгих изучений документации стало ясно, что:

При запуске паука запускается наш класс, который мы наследуем, и в нем обязательные поля следующие:

name
start_urls

Данный код рабочий, полностью. Ошибка была в starturl. Будьте внимательнее, и будет Вам счатье.

→ Ссылка