Parsing sitemap with scrapy
Для парсинга на основе сайтмапа есть стандартный паук - смотри тут
Можно задать следующие параметры:
sitemap_urls
- список адресов сайтмапов (парсер может выполнить поиск вrobots.txt
если указать урл на роботс в этом списке)sitemap_rules
- список кортежей, содержащих два объекта - строку регулярного выражения для поиска соответствий в урле и имя метода, котоырй будет использован для парсинга данного урла (колбек). В качестве вторго объекта можно передать непосредственно объект колбекаsitemap_follow
cписок регулярных выражений для сайтмапов, которым следует следовать. Это можно реализовать для nested sitemaps в ситуации, когда мы не хотим исследовать часть пространстваsitemap_alternate_links
обычно альтернативные урлы подразумевают ссылки на зеркала и другие ресурсы, дублирующие или предосталяющие альтернативный контент. По дефолту отключеноsitemap_filter(entries)
- эта функция переопредяляет фильтрацию контента
Пример
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
Как скомбинировать сайтмап с другими сорсами
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 здась
Некоторые проблемы парсинга sitemap
Иногда нужно создать специфические фильтры для очистки sitemap. В данном примере паук собирает урлы в список. В следующем примере паук проверят даты перезаписи строк в сайтмапе. Оба решения потребовали переопределить scrapy.spiders.sitemap.iterloc
Смотри еще: