Я не уверен, правильно ли я вас здесь понял, но, похоже, вы сбиваете с толку LinkExtractor
с CrawlSpider.rules
. LinkExtractor - это просто объект, который извлекает ссылки из ответа, где атрибут правил описывает правила обхода для CrawlSpider
.
Если вы хотите использовать CrawlSpider в то время как вручную извлекая некоторые ссылки самостоятельно, вы можете сделать это просто:
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider
class MySpider(CrawlSpider):
name = 'myspider'
le = LinkExtractor()
rules = [Rule(le, callback='parse_page')...]
def parse_page(self, response):
items = #parse items
for item in items:
yield item
ajax_url = #find ajax url for next page or something
if ajax_url:
yield Request(ajax_url, self.parse_ajax)
def parse_ajax(self, response):
links = self.le.extract_links(response)
for link in links:
yield Request(link.url, self.parse_page)
Не документация говорят, что 'функция parse' не может быть использована с' CrawlSpider'? И я имею в виду «LinkExtractor», который используется в 'CrawlSpider.rules'. – XO39
Право, 'parse' является зарезервированным именем CrawlSpider. Я изначально написал пример с помощью scrapy.Spider и просто забыл изменить его. См. Мое редактирование сейчас. Что касается linkextractor, что здесь не так? Вы создаете экстрактор ссылок и добавляете его в свои правила и позже используете для извлечения некоторых ссылок в parse_ajax() - это один и тот же экстрактор ссылок. – Granitosaurus
Нет, пожалуйста [см. Здесь] (http://stackoverflow.com/q/38777236/587990), чтобы понять, в чем моя проблема. Я сделаю ваш код выстрелом. – XO39