Parsing robots txt with scrapy
За проверку robots.txt
в [scrapy] отвечает встреонный middlewire, с самым высоким приоритетом
{
'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100, # here
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
}
Рекомендуется не влезать в эту часть, а управлять ею за счет настройки параметров и парсера.
Исходный код обработчика robots.txt
находится тут: обработчик инициализирует класс и получает строки из robots.txt
, после чего преобразует их в объект RobotFileParser
из urllib.robotparser, который хранить распарсенные данные и позволяет сравниваться с ними при проверке запрашиваемого урла в дальнейшем.
В scrapy
реализовано несколько парсеров robots.txt
:
- Protego parser основан на пакете protego для парсинга в соответствии с google спецификацией
- RobotFileParser совместимый с Martijn Koster’s 1996 draft specification парсер
- Reppy parser python реализация парсера reppy для c++ либы
- Robotexclusionrulesparser реализует вот этот парсер
Два последних парсера так-же реализуют Martijn Koster’s 1996 draft specification
Иногда нужно написать свой парсер (например когда необходимо сохзранять строки, содержащиеся в robots.txt
или извдлекать и обрабатывать sitemap). Это можно сделать унаследовавшись от абстрактного базового класса вот так
Смотри еще:
- [scrapy]
- [crawlers]
- Robots exclusion standard (wiki)
- Описание и настройка директивы Clean-param для
robots.txt
- google спецификацией для
robots.txt
- Martijn Koster’s 1996 draft specification
- про файлы robots.txt у google
- [parsing-sitemap-with-scrapy]
- [urllibparse]