Scrapy CrawlSpider pour le contenu AJAX

Je suis tenter d'analyser un site pour articles de presse. Mon start_url contient:

(1) des liens vers chaque article: http://example.com/symbol/TSLA

et

(2) un bouton "Plus" qui fait un appel AJAX qui charge dynamiquement plus d'articles dans la même start_url: http://example.com/account/ajax_headlines_content?type=in_focus_articles&page=0&slugs=tsla&is_symbol_page=true

Un paramètre à l'appel AJAX est "page", qui est incrémenté chaque fois que le bouton "Plus" est cliqué. Par exemple, en cliquant sur "Plus" une fois une charge supplémentaire de n d'articles et mise à jour de la page de paramètres dans le bouton "Plus" de l'événement onClick, de sorte que la prochaine fois "Plus" est cliqué, la page "" deux articles seront chargés (en supposant que "page", 0, a été chargé initialement, et "page" 1 a été chargé sur le premier clic).

Pour chaque "page" je tiens à gratter le contenu de chaque article à l'aide de Règles, mais je ne sais pas combien de pages il y a et je ne veux pas choisir arbitrairement m (par exemple, 10k). Je n'arrive pas à comprendre comment mettre cela en place.

À partir de cette question, Scrapy Analyser des Url Afin, j'ai essayé de créer une liste d'URL de potentiel Url, mais je ne peut pas déterminer comment et où envoyer une nouvelle URL à partir de la piscine après l'analyse de l'URL précédente et s'assurer qu'il contient des nouvelles liens pour un CrawlSpider. Mes Règles envoyer des réponses à un parse_items de rappel, lorsque le contenu de l'article sont analysés.

Est-il un moyen d'observer le contenu de la page de liens (similaire à la BaseSpider exemple) avant l'application des Règles et de l'appel de parse_items afin que je puisse savoir quand arrêter de ramper?

Simplifié le code (j'ai supprimé plusieurs des champs je suis d'analyse pour plus de clarté):

class ExampleSite(CrawlSpider):

    name = "so"
    download_delay = 2

    more_pages = True
    current_page = 0

    allowed_domains = ['example.com']

    start_urls = ['http://example.com/account/ajax_headlines_content?type=in_focus_articles&page=0'+
                      '&slugs=tsla&is_symbol_page=true']

    ##could also use
    ##start_urls = ['http://example.com/symbol/tsla']

    ajax_urls = []                                                                                                                                                                                                                                                                                                                                                                                                                          
    for i in range(1,1000):
        ajax_urls.append('http://example.com/account/ajax_headlines_content?type=in_focus_articles&page='+str(i)+
                      '&slugs=tsla&is_symbol_page=true')

    rules = (
             Rule(SgmlLinkExtractor(allow=('/symbol/tsla', ))),
             Rule(SgmlLinkExtractor(allow=('/news-article.*tesla.*', '/article.*tesla.*', )), callback='parse_item')
            )

        ##need something like this??
        ##override parse?
        ## if response.body == 'no results':
            ## self.more_pages = False
            ## ##stop crawler??   
        ## else: 
            ## self.current_page = self.current_page + 1
            ## yield Request(self.ajax_urls[self.current_page], callback=self.parse_start_url)


    def parse_item(self, response):

        self.log("Scraping: %s" % response.url, level=log.INFO)

        hxs = Selector(response)

        item = NewsItem()

        item['url'] = response.url
        item['source'] = 'example'
        item['title'] = hxs.xpath('//title/text()')
        item['date'] = hxs.xpath('//div[@class="article_info_pos"]/span/text()')

        yield item

OriginalL'auteur BadgerBadgerBadger | 2014-05-16