Ваше регулярное выражение верно, а проблема в другом. у вашего кода есть небольшие проблемы.
Я изменил код на это:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'quotes.toscrape.com'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
rules = (
Rule(LinkExtractor(allow=r'.*page.*'),
callback='parse_page', follow=True),
)
def parse_page(self, response):
yield {'url': response.url} # It just for test. can be omitted.
for span in response.css('span'):
yield {
'span': span.css('span::text').get(),
}
for div in response.css('div'):
yield {
'div': div.css('div::text').get(),
}
Сначала в LinkExtractor
вы должны использовать allow=
, а не restrict_text=
, потому что allow=
для URL-адресов, а restrict_text=
для текста ссылки, а не для URL-адресов.
Во-вторых, вы не можете вызвать метод parse
из-за этого предупреждения здесь :
При написании правил паука для обхода избегайте использования parse в качестве обратного вызова, поскольку CrawlSpider использует сам метод parse для реализации своей логики c. Так что если вы переопределите метод разбора, паук сканирования больше не будет работать.
Поэтому я изменил parse
на parse_page
и перезвонил ему.
В-третьих, Вам не нужно извлекать ссылки в методе parse
и отправлять запрос оттуда. CrawlSpider
сделать это автоматически. запросы, отправленные методом parse вручную, не соответствуют определенному вами rules
.
Наконец, я предлагаю использовать это регулярное выражение. Это проще и чаще:
rules = (
Rule(LinkExtractor(allow='page'),
callback='parse_page', follow=True),
)
Удачи!