Avancemos en el raspado de la BMI. Abramos la página detallada de cada película de la lista de las 250 películas y busquemos todas las características importantes, como el nombre del director, el género, los miembros del reparto, etc.
Antes de sumergirnos en la creación de la araña, tenemos que crear objetos de película y de reparto en itmes.py.
Para más detalles, lea la documentación del artículo aquí.
12345678910111213141516importar clase de desguaceMovieItem(desguace.Item): título = desguace.Campo() calificación = desguace.Campo() resumen = desguace.Campo() género = desguace.Campo() tiempo de ejecución = desguace. Campo() directores = raspadura.Campo() escritores = raspadura.Campo() elenco = raspadura.Campo()classCastItem(raspadura.Item): nombre = raspadura.Campo() personaje = raspadura.Campo()
pitón
Ahora que los artículos están creados, extendamos la araña.
Con esta araña, buscamos el URL de cada elemento de la película y solicitamos ese URL llamando a parseDetailItem, que recoge todos los datos de la película de la página de detalles de la película.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748# importación de la chatarraimportación de webscrapy.items import MovieItem, CastItemclassImdbSpider(scrapy.Spider): nombre ="imdb" allowed_domains =["imdb. com"] base_url ="https://imdb.com" start_urls =[$0027https://www.imdb.com/chart/top$0027,]defparse(self, response):# tabla coloums de todas las películas columnas = response.css($0027table[data-caller-name="chart-top250movie"] tbody[] tr$0027)for col in columns:# rating of the movie i.e., posición en la tabla clasificación = col.css("td[class=$0027titleColumn$0027]::text").extract_first().strip()# url de la página de detalles de esa película. rel_url = col.css("td[class=$0027titleColumn$0027] a::attr($0027href$0027)"). extract_first().strip()# añadir el dominio a rel. url col_url = self.base_url + rel_url # Hacer una petición a la url anterior, y llamar al parseDetailItemyield scrapy.Request(col_url, callback=self. parseDetailItem, meta={$0027rating$0027: rating})# llama cada vez, cuando la película se obtiene de table.defparseDetailItem(self, response):# crea un objeto de la película. item = MovieItem()# obtiene el meta de rating. item["rating"]= response.meta["rating"]# Obtener el texto requerido del elemento. item[$0027title$0027]= response.css($0027div[] h1::text$0027).extract_first().strip() item["summary"]= response.css("div[class=$0027summary_text$0027]::text").extract_first(). strip() item[$0027directores$0027]= respuesta.css($0027div[] a::texto$0027).extract()[0].strip() item[$0027escritores$0027]= respuesta.css($0027div[] a::texto$0027).extract()[1].strip() item["género"]= respuesta. xpath("//*[@id=$0027title-overview-widget$0027]/div[1]/div[2]/div/div[2]/div[2]/div/a[1]/text()").extract_first(). strip() item["runtime"]= response.xpath("//*[@id=$0027title-overview-widget$0027]/div[1]/div[2]/div/div[2]/div[2]/div/time/text()"). extract_first().strip()# crear una lista de reparto de la película. item["cast"]=list()# recuperar todo el reparto de la película de la tabla, excepto la primera fila.for cast en response.css("table[class=$0027cast_list$0027] tr")[1:]: castItem = CastItem() castItem["nombre"]= cast. xpath("td[2]/a/text()").extract_first().strip() castItem["character"]= cast.css("td[class=$0027character$0027] a::text").extract_first() item["cast"].append(castItem)return item
pitón
Obtener todos los datos en la línea de comandos es agradable, pero como científico de datos, es preferible tener datos en ciertos formatos como CSV, Excel, JSON, etc. que puedan ser importados en los programas. Scrapy proporciona esta pequeña funcionalidad donde se puede exportar el contenido descargado en varios formatos. Muchos de los formatos populares ya están soportados.
Exportemos nuestros datos en formato JSON usando el siguiente comando.
1$ scrapy crawl imdb -o imdbdata.json -t json
Shell
Obtendrás este tipo de salida en el archivo imdbdata.json.:
12345678910111213141516171819[ ... {"rating": "4", "title": "El Caballero Oscuro", "summary": "When the threat ...", "directors": "Christopher Nolan", "writers": "Jonathan Nolan", "genre": "Action", "runtime": "2h 32min", "cast":[{"name": "Christian Bale", "character": "Bruce Wayne"}, ... }, ...]
json