2017-07-16 6 views
0

Ich beginne zu lernen, wie man Scrapy www.scrapy.org verwendet.Scrapy - Wie extrahiere ich Informationen aus verschachtelten Links

Mein Problem ist, dass ich versuche, Informationen aus einem Link in einem anderen Link zu extrahieren.

Der Fluss ist wie folgt:

Wir geben www.imdb.com, dann im Menü klicken Sie auf Watchlist> IMDbtop250, danach werden wir bis in http://www.imdb.com/chart/top enden, wo wir eine Liste finden von Filmen;

Ich versuche, jeden Film, der einen Link wie folgt hat 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 und dann tritt Vollbild-Link aus dem Film, der so aussieht www.imdb.com/title/tt0111161/fullcredits?ref_=tt_cl_sm#cast, und fängt an, alle Akteure aus dem letzten Link zu extrahieren, so ist das Problem, dass ich wissen, wie die Informationen zu extrahieren, aber mit der Navigation der Links zu kämpfen, das ist der Code, den ich jetzt

# -*- 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 

ich bin mir bewusst, dass diese haben soll, in einer rekursiven Weise getan werden, aber zuerst ich bin tatsächlich versuchen, die Links funktionieren zu lassen, und dass beide Links, die ich eingeben möchte, dieses Merkmal /title/tt0111161/ zumindest für den ersten Link teilen.

Auch ich extrahiere gerade Titel, für jetzt, um zu wissen, wenn ich bin, wo ich sein will.

Vielen Dank im Voraus für jede Hilfe.

Einige Links entfernt, weil ich 10 Ruf noch nicht habe.

Antwort

0

Ihre allowed_domains falsch ist, muss es sein:

allowed_domains = ["imdb.com"] 

beginnen mit den am besten bewerteten Filme

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

Parse jeder Film und bereiten Sie die URL für die Liste Akteure

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) 

Dann finden Sie alle Schauspieler

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

Dies ist, was ich zu tun versuchte, jetzt krank nur zu aktualisieren, um auch das Poster in meinem JSON-Objekt hinzuzufügen, können Sie übrigens erklären, wie 'h3 [itemprop ~ = Name] a :: text' funktioniert, Ich verstehe, dass itemProp nicht gleich Name ist? – ricardoNava

+0

Sie können 'scrapy shell (link)' – Surkal

+0

Meine Frage war über die ~ = Operator – ricardoNava

Verwandte Themen