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
Vous devez vous connecter pour publier un commentaire.
Analyse d'araignée peut être trop limité pour vos besoins ici. Si vous avez besoin de beaucoup de logique, vous êtes habituellement mieux héritant de l'Araignée.
Scrapy fournit CloseSpider exception qui peut être soulevée si vous avez besoin d'arrêter l'analyse sous certaines conditions. La page que vous analysez renvoie un message "Il n'existe pas d'articles sur des actions", lorsque vous dépassez la limite de page, vous pouvez vérifier pour ce message et arrêter l'itération lorsque ce message apparaît.
Dans votre cas, vous pouvez aller avec quelque chose comme ceci:
OriginalL'auteur Pawel Miech