Source: Parsing sitemap with scrapy

← Rendered

markdown source:

---
description: Извлечение данных из sitemaps в scrapy
tags: crawlers python
title: Parsing sitemap with scrapy
---
Для парсинга на основе сайтмапа есть стандартный паук - [смотри тут](https://docs.scrapy.org/en/latest/topics/spiders.html#sitemapspider)

Можно задать следующие параметры:

- `sitemap_urls` - список адресов сайтмапов (парсер может выполнить поиск в `robots.txt` если указать урл на роботс в этом списке)
- `sitemap_rules` - список кортежей, содержащих два объекта - строку регулярного выражения для поиска соответствий в урле и имя метода, котоырй будет использован для парсинга данного урла (колбек). В качестве вторго объекта можно передать непосредственно объект колбека
- `sitemap_follow` cписок регулярных выражений для сайтмапов, которым следует следовать. Это можно реализовать для [nested sitemaps](https://www.sitemaps.org/protocol.html#index) в ситуации, когда мы не хотим исследовать часть пространства
- `sitemap_alternate_links` обычно альтернативные урлы подразумевают ссылки на зеркала и другие ресурсы, дублирующие или предосталяющие альтернативный контент. По дефолту отключено
- `sitemap_filter(entries)` - эта функция переопредяляет фильтрацию контента

Пример

```python
from datetime import datetime
from scrapy.spiders import SitemapSpider

class FilteredSitemapSpider(SitemapSpider):
    name = 'filtered_sitemap_spider'
    allowed_domains = ['example.com']
    sitemap_urls = ['http://example.com/sitemap.xml']

    def sitemap_filter(self, entries):
        for entry in entries:
            date_time = datetime.strptime(entry['lastmod'], '%Y-%m-%d')
            if date_time.year >= 2005:
                yield entry
```

[Больше примеров тут](https://docs.scrapy.org/en/latest/topics/spiders.html#sitemapspider-examples)

Как скомбинировать сайтмап с другими сорсами

```python
from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/robots.txt']
    sitemap_rules = [
        ('/shop/', 'parse_shop'),
    ]

    other_urls = ['http://www.example.com/about']

    def start_requests(self):
        requests = list(super(MySpider, self).start_requests())
        requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]
        return requests

    def parse_shop(self, response):
        pass # ... scrape shop here ...

    def parse_other(self, response):
        pass # ... scrape other here ...
```

Исходный код scrapy.spiders.sitemap [здась](https://docs.scrapy.org/en/latest/_modules/scrapy/spiders/sitemap.html)

## Некоторые проблемы парсинга sitemap

Иногда нужно создать специфические фильтры для очистки sitemap. В данном примере паук [собирает урлы в список](https://stackoverflow.com/a/46236452/15966204). В следующем примере паук [проверят даты перезаписи строк в сайтмапе](https://stackoverflow.com/a/46236452/15966204). Оба решения потребовали переопределить `scrapy.spiders.sitemap.iterloc`

Смотри еще:

- [[scrapy]]
- [[crawlers]]
- [[parsing-robots-txt-with-scrapy]]
- [про файлы sitemap у google](https://developers.google.com/search/docs/advanced/sitemaps/overview?hl=ru)
- [XML Sitemaps for News Websites in CSV Format](https://www.kaggle.com/eliasdabbas/news-sitemaps) kaggle dataset


[scrapy]: scrapy "Scrapy"
[crawlers]: ../lists/crawlers "Crawlers"
[parsing-robots-txt-with-scrapy]: parsing-robots-txt-with-scrapy "Parsing robots txt with scrapy"