2016-08-05 2 views
0

Похоже, что LinkExtractor не может извлекать ссылки из данных, которые были загружены/сгенерированы с помощью запроса ajax внутри функции (see here)!Могу ли я добавить ссылки вручную в LinkExtractor?

Итак, есть ли способ добавить ссылки ссылки в функцию, а затем добавить их вручную в LinkExtractor или заставить LinkExtractor захватить их?

ответ

1

Я не уверен, правильно ли я вас здесь понял, но, похоже, вы сбиваете с толку 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) 
+0

Не документация говорят, что 'функция parse' не может быть использована с' CrawlSpider'? И я имею в виду «LinkExtractor», который используется в 'CrawlSpider.rules'. – XO39

+0

Право, 'parse' является зарезервированным именем CrawlSpider. Я изначально написал пример с помощью scrapy.Spider и просто забыл изменить его. См. Мое редактирование сейчас. Что касается linkextractor, что здесь не так? Вы создаете экстрактор ссылок и добавляете его в свои правила и позже используете для извлечения некоторых ссылок в parse_ajax() - это один и тот же экстрактор ссылок. – Granitosaurus

+0

Нет, пожалуйста [см. Здесь] (http://stackoverflow.com/q/38777236/587990), чтобы понять, в чем моя проблема. Я сделаю ваш код выстрелом. – XO39

Смежные вопросы