2017-07-16 2 views
0

Je commence à apprendre à utiliser Scrapy www.scrapy.org.Scrapy - Comment extraire des informations de liens imbriqués

Mon problème est que j'essaie d'extraire des informations à partir d'un lien dans un autre lien.

Le flux est comme ceci:

Nous entrons www.imdb.com, puis sur le menu cliquez sur Liste> IMDbtop250, après que nous finirons dans http://www.imdb.com/chart/top où nous trouverons une liste de films; J'essaie d'entrer chaque film qui a un lien comme celui-ci www.imdb.com/title/tt0111161/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=1EX7BT4EGCE6HVGF919H&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_1 puis entre le film complet qui ressemble à ceci www.imdb.com/title/tt0111161/fullcredits?ref_=tt_cl_sm#cast, et commence à extraire tous les acteurs du dernier lien, donc le problème est que je savoir comment extraire l'info mais aux prises avec la navigation des liens, voici le code que j'ai en ce moment

# -*- coding: utf-8 -*- 
from scrapy import item 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 


class ActorsSpider(CrawlSpider): 
    name = "actors" 
    allowed_domains = ["www.imdb.com"] 
    start_urls = ['http://www.imdb.com/chart/top', 
        'http://www.imdb.com/title/'] 

    def parse(self, response): 
     rules = { 
      Rule(LinkExtractor(allow=r'/title/tt0111161/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=0BP5GZ1CWDNT2NFAWKDN&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_1')), 
      Rule(LinkExtractor(allow=r'fullcredits?ref_=tt_cl_sm#cast'), callback='parse_actor'), 
     } 

    def parse_actor(self, response): 
     item['title'] = response.css('title').extract()[0] 
     return item 

Je suis conscient que cela est censé être fait d'une manière récursive mais d'abord je suis en train d'essayer de faire fonctionner les liens, et que les deux liens que j'essaie d'entrer partagent cette caractéristique /title/tt0111161/ au moins pour le premier lien.

Aussi, je suis en train d'extraire le titre, pour l'instant, pour savoir si je suis là où je veux être.

Merci à l'avance pour toute aide.

Suppression de certains liens parce que je n'ai pas 10 réputation ENCORE.

Répondre

0

Votre allowed_domains est faux, il doit être:

allowed_domains = ["imdb.com"] 

Commencez avec les films les mieux notés

start_urls = ['http://www.imdb.com/chart/top/'] 

Parse chaque film et préparer l'URL pour la liste des acteurs

def parse(self, response): 
     for film in response.css('.titleColumn'): 
      url = film.css('a::attr(href)').extract_first() 
      actors_url = 'http://imdb.com' + url[:17] + 'fullcredits?ref_=tt_cl_sm#cast' 
      yield scrapy.Request(actors_url, self.parse_actor) 

Ensuite, trouvez tous les acteurs

def parse_actor(self, response): 
     item = ImdbItem() 
     item['title'] = response.css('h3[itemprop~=name] a::text').extract_first() 
     item['actors'] = response.css('td[itemprop~=actor] span::text').extract() 
     return item 
+0

C'est ce que j'essayais de faire, maintenant je mets juste à jour pour ajouter aussi l'affiche dans mon objet JSON, au fait, pouvez-vous expliquer comment fonctionne h3 [itemprop ~ = name] a :: text', Je comprends que itemProp n'est pas égal au nom? – ricardoNava

+0

Vous pouvez utiliser 'shell scrapy (lien)' – Surkal

+0

Ma question concernait l'opérateur ~ = – ricardoNava