Принцип работы LinkExtractor в Scrapy

Всем привет! Нужно спарсить сайт с помощью Scrapy. Почитал документацию, посмотрел несколько роликов, но что-то я запутался с LinkExtractor в Scrapy. Вот смотрите, один из примеров, на котором обучался:

class SpiderSpider(CrawlSpider):

    name = 'prodpar'
    allowed_domains = ['sipwhiskey.com']
    start_urls = ['https://sipwhiskey.com/']

    rules = [Rule(LinkExtractor(allow='japanese'),
                  callback='parse_filter', follow=True), ]

    def parse_filter(self, response):
        item = Product()
        item['product_url'] = response.url
        yield item

Получилось около 230 ссылок, вот пример ответов:

   https://sipwhiskey.com/collections/japanese-whisky/nikka,,
   https://sipwhiskey.com/collections/japanese-whisky/mars-iwai-japanese-whisky,,
   https://sipwhiskey.com/collections/japanese-whisky?page=3,,

Scrapy выдал все ссылки на сайте, где упоминается слово "japanese". Верно ли я понимаю, что LinkExtractor ищет по всему сайту, начиная с start_urls, т.е. перебирает все ссылки на сайте, где присутствует слово "japanese" и выдает мне их?

Если это так, то не могу сделать подобное на сайте, который мне нужен.

class SpiderSpider(CrawlSpider):
name = 'sbermega'
allowed_domains = ['sbermegamarket.ru']
start_urls = ['https://sbermegamarket.ru/catalog/']

rules = [Rule(LinkExtractor(allow='kingxbar'),
              callback = 'parse_prod', follow = True),]

def parse_prod(self, response):
    item = SberMegaItem()
    item['product_url'] = response.url
    yield item

Мне нужно взять все ссылки с сайта, где упоминается бренд Kingxbar. Т.е. я тоже самое (наверно) указываю стартовый url, указываю в LinkExtractor по какому слову искать. Но реальном примере паук проходит и ничего не выдает. А ссылок на сайте с данным словом много, например, вот такие:

     https://sbermegamarket.ru/catalog/chehly-dlya-sotovogo-telefona/brand-kingxbar/
     https://sbermegamarket.ru/catalog/details/chehol-kingxbar-epoxy-series-colorful-dlya-iphone-13-pro-600005916434/

Может кто-нибудь помочь объяснить принцип работы LinkExtractor? Т.е. если я укажу start_urls = ['https://sbermegamarket.ru/catalog/'] и ключевое слово "kingxbar" и follow = True, означает ли, что паук начиная с этой страницы посмотрит ВСЕ ссылки на сайте, которые начинаются с sbermegamarket.ru/catalog (например, https://sbermegamarket.ru/catalog/chehly-dlya-sotovogo-telefona/brand-**kingxbar** или https://sbermegamarket.ru/catalog/chehly-dlya-sotovogo-telefona/brand-**apple**). Если это так, то почему паук не скрапит во втором примере. А если это не так, то как работает LinkExtractor в первом примере?

Вот ответ паука во втором примере:

2022-04-21 10:00:03 [scrapy.utils.log] INFO: Scrapy 2.6.1 started (bot: sbermega) 2022-04-21 10:00:03 [scrapy.utils.log] INFO: Versions: lxml 4.8.0.0, libxml2 2.9.12, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 22.4.0, Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)], pyOpenSSL 22.0.0 (OpenSSL 1.1.1n 15 Mar 2022), cryptography 36.0.2, Platform Windows-10-10.0.19044-SP0 2022-04-21 10:00:03 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'sbermega', 'DOWNLOAD_DELAY': 0.5, 'FEED_EXPORT_ENCODING': 'utf-8', 'FEED_EXPORT_FIELDS': ['product_url', 'code', 'price', 'shop', 'name'], 'NEWSPIDER_MODULE': 'sbermega.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['sbermega.spiders']} 2022-04-21 10:00:03 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor 2022-04-21 10:00:03 [scrapy.extensions.telnet] INFO: Telnet Password: e2f3495172556346 2022-04-21 10:00:03 [py.warnings] WARNING: c:\users\purchase\pycharmprojects\sbermegamerket\venv\lib\site-packages\scrapy\extensions\feedexport.py:289: ScrapyDeprecationWarning: The FE ED_URI and FEED_FORMAT settings have been deprecated in favor of the FEEDS setting. Please see the FEEDS setting docs for more details exporter = cls(crawler)

2022-04-21 10:00:03 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.feedexport.FeedExporter', 'scrapy.extensions.logstats.LogStats'] 2022-04-21 10:00:03 [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'] 2022-04-21 10:00:03 [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'] 2022-04-21 10:00:03 [scrapy.middleware] INFO: Enabled item pipelines: [] 2022-04-21 10:00:03 [scrapy.core.engine] INFO: Spider opened 2022-04-21 10:00:03 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2022-04-21 10:00:03 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023 2022-04-21 10:00:04 [filelock] DEBUG: Attempting to acquire lock 2231374258336 on c:\users\purchase\pycharmprojects\sbermegamerket\venv\lib\site-packages\tldextract.suffix_cache/public suffix.org-tlds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock 2022-04-21 10:00:04 [filelock] DEBUG: Lock 2231374258336 acquired on c:\users\purchase\pycharmprojects\sbermegamerket\venv\lib\site-packages\tldextract.suffix_cache/publicsuffix.org-tl ds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock 2022-04-21 10:00:04 [filelock] DEBUG: Attempting to release lock 2231374258336 on c:\users\purchase\pycharmprojects\sbermegamerket\venv\lib\site-packages\tldextract.suffix_cache/public suffix.org-tlds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock 2022-04-21 10:00:04 [filelock] DEBUG: Lock 2231374258336 released on c:\users\purchase\pycharmprojects\sbermegamerket\venv\lib\site-packages\tldextract.suffix_cache/publicsuffix.org-tl ds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock 2022-04-21 10:00:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://sbermegamarket.ru/robots.txt> (referer: None) 2022-04-21 10:00:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://sbermegamarket.ru/catalog/> (referer: None) 2022-04-21 10:00:05 [scrapy.core.engine] INFO: Closing spider (finished) 2022-04-21 10:00:05 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 553, 'downloader/request_count': 2, 'downloader/request_method_count/GET': 2, 'downloader/response_bytes': 242207, 'downloader/response_count': 2, 'downloader/response_status_count/200': 2, 'elapsed_time_seconds': 2.02061, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2022, 4, 21, 7, 0, 5, 922735), 'httpcompression/response_bytes': 1125518, 'httpcompression/response_count': 2, 'log_count/DEBUG': 7, 'log_count/INFO': 10, 'log_count/WARNING': 1, 'response_received_count': 2, 'robotstxt/request_count': 1, 'robotstxt/response_count': 1, 'robotstxt/response_status_count/200': 1, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2022, 4, 21, 7, 0, 3, 902125)} 2022-04-21 10:00:05 [scrapy.core.engine] INFO: Spider closed (finished)

Добавляю спустя время.

Попробовал в start_url записать одну из страниц каталога данного бренда:

      https://sbermegamarket.ru/catalog/details/chehol-kingxbar-epoxy-series-colorful-dlya-iphone-13-pro-600005916434/

все ок, спарсил все страницы с сайта (их там около 180). Вот сейчас совсем запутался. Не пойму, как он работает - что в итоге нужно указывать start_url и по какому принципу он проходит страницы.

Всем откликнувшимся - спасибо!


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