2016-03-21 14 views
0

Ich bin neu in Scrapy und Python. Ich versuchte, die Daten von https://in.bookmyshow.com/movies wiederzuerlangen, da ich die Informationen aller Filme benötige, die ich versuchte, die Daten zu extrahieren. Aber dort ist etwas mit meinem Code falsch, ich möchte wissen, wo ich falsch gegangen bin.Daten aus mehreren Links mit scrapy

rules = (Rule(SgmlLinkExtractor(allow=('https://in\.bookmyshow\.com/movies/.*',)), callback="parse_items", follow= True),) 


def parse_items(self, response): 
    for sel in response.xpath('//div[contains(@class, "movie-card")]'): 
     item = Ex1Item() 
     item['Moviename'] = sel.xpath('.//a[@class="__movie-name"]/text()').extract() 
     item['Language'] = sel.xpath('/html/body/div[1]/div[2]/div/div[1]/div[2]/section[1]/div/div[2]/div[1]/div[1]/div/div/div[2]/div[2]/ul/li/text()').extract() 
     item['Info'] = sel.xpath('.//div[@class="__rounded-box __genre"]/text()').extract() 
     item['Synopsis'] = sel.xpath('/html/body/div[1]/div[2]/div[1]/div[2]/div[4]/div[2]/div[2]/blockquote/text()').extract() 
     item['Release'] = sel.xpath('.//span[@class="__release-date"]/text()').extract() 
     yield item 

Antwort

1

Sie Code scheint in Ordnung zu sein. Vielleicht liegt das Problem außerhalb des Teils, den Sie hier gepostet haben.

Das ist für mich gearbeitet:

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 


class BookmyshowSpider(CrawlSpider): 
    name = "bookmyshow" 
    start_urls = ['https://in.bookmyshow.com/movies'] 
    allowed_domains = ['bookmyshow.com'] 
    rules = (Rule(SgmlLinkExtractor(allow=('https://in\.bookmyshow\.com/movies/.*',)), callback="parse_items", follow= True),) 

    def parse_items(self, response): 
     for sel in response.xpath('//div[contains(@class, "movie-card")]'): 
      item = Ex1Item() 
      item['Moviename'] = sel.xpath('.//a[@class="__movie-name"]/text()').extract() 
      item['Language'] = sel.xpath('/html/body/div[1]/div[2]/div/div[1]/div[2]/section[1]/div/div[2]/div[1]/div[1]/div/div/div[2]/div[2]/ul/li/text()').extract() 
      item['Info'] = sel.xpath('.//div[@class="__rounded-box __genre"]/text()').extract() 
      item['Synopsis'] = sel.xpath('/html/body/div[1]/div[2]/div[1]/div[2]/div[4]/div[2]/div[2]/blockquote/text()').extract() 
      item['Release'] = sel.xpath('.//span[@class="__release-date"]/text()').extract() 
      yield item 

EDIT: Version der Standard-Spinne-Klasse scrapy.Spider()

import scrapy 

class BookmyshowSpider(scrapy.Spider): 
    name = "bookmyshow" 
    start_urls = ['https://in.bookmyshow.com/movies'] 
    allowed_domains = ['bookmyshow.com'] 

    def parse(self, response): 
     links = response.xpath('//a/@href').re('movies/[^\/]+\/.*$') 
     for url in set(links): 
      url = response.urljoin(url) 
      yield scrapy.Request(url, callback=self.parse_movie) 

    def parse_movie(self, response): 
     for sel in response.xpath('//div[contains(@class, "movie-card")]'): 
      item = {} 
      item['Moviename'] = sel.xpath('.//a[@class="__movie-name"]/text()').extract() 
      item['Language'] = sel.xpath('/html/body/div[1]/div[2]/div/div[1]/div[2]/section[1]/div/div[2]/div[1]/div[1]/div/div/div[2]/div[2]/ul/li/text()').extract() 
      item['Info'] = sel.xpath('.//div[@class="__rounded-box __genre"]/text()').extract() 
      item['Synopsis'] = sel.xpath('/html/body/div[1]/div[2]/div[1]/div[2]/div[4]/div[2]/div[2]/blockquote/text()').extract() 
      item['Release'] = sel.xpath('.//span[@class="__release-date"]/text()').extract() 
      yield item 

parse() alle Links zu Filmseite von der Startseite analysiert. parse_movie() wird als Rückruf für alle Anfragen zu bestimmten Filmseiten verwendet. Mit dieser Version haben Sie sicherlich mehr Kontrolle über das Verhalten der Spinne.

+0

Der Code wiederholt mehrmals und auch als Endlosschleife. Ich bin in der Lage, die Daten zu extrahieren, aber nicht in der richtigen Reihenfolge. Wie auch immer, danke, dass du meine Frage durchgehst – Shraddha

+1

Du verwendest Regeln und eine Spinne vom Typ CrawlSpider. Diese Art von Spider beginnt bei start_urls und folgt allen Links, die zu deiner Regel passen. Die Spinne in meinem Beispiel wird nicht in einer Endlosschleife stecken bleiben, obwohl es einige Zeit dauert, da sie> 1000 Filmseiten durchsucht. Ist das das Verhalten, das du wirklich willst? Wenn nicht, beschreibe bitte ein bisschen genauer, was du willst und ich kann dir sagen, welcher andere Spidertyp besser passt. – dron22

+0

Ich möchte Informationen von jedem Film von seiner Seite nehmen. Es ist eher so, als würde man den Filmnamen von der Hauptseite und dessen Informationen von einer anderen Seite holen, und es muss für jeden auf der Hauptseite vorhandenen Film gemacht werden. Ich glaube nicht, dass ich dafür CrawlSpider benutzen muss. Danke für die Hilfe. – Shraddha