Ich bin auf ein Problem mit einer Spinne gestoßen, die ich zusammengestellt habe. Ich versuche, einzelne Zeilen aus dem Transkript auf this site zu kratzen, und habe einige geeignete Selektoren gefunden, aber wenn er ausgeführt wird, ist die Ausgabe des Spiders einfach die gleiche Zeile, die immer wieder wiederholt wird. Ich habe ein paar andere mit ähnlichen Problemen gesehen (like this), aber habe noch keine Antwort gefunden, die mein Problem löst.Scrapy Spider, die immer wieder die gleichen Elemente zurückgeben
(Als Hinweis, glaube ich, das ein Problem mit meiner Base Python-Codierung und for
Schleife Gebäuden sein kann, wie mit scrapy
selbst zu einem Problem gegenüber.)
Hier ist die Spinne:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class TalSpider(CrawlSpider):
name = 'tal'
allowed_domains = ['https://www.thisamericanlife.org/radio-archives/episode/']
start_urls = ['https://www.thisamericanlife.org/radio-archives/episode/1/transcript/']
def parse(self, response):
for line in response.xpath('//div'):
episode_num_text = line.xpath('//div[contains(@class, "radio-wrapper")]/@id').extract()
radio_date_text = line.xpath('//div[contains(@class, "radio-date")]/text()').extract()
episode_title = line.xpath('//h2').xpath('a[contains(@href, *)]/text()').extract()
begin_timestamp = line.xpath('//p[contains(@begin, *)]/@begin').extract()
speaker_class = line.xpath('//div/@class').extract()
speaker_name = line.xpath('//h4/text()').extract()
line_text = line.xpath('//p[contains(@begin, *)]/text()').extract()
full_audio_link = line.xpath('//p[contains(@class, "full-audio")]/text()').extract()
for item in zip(episode_num_text, radio_date_text, episode_title, begin_timestamp, speaker_class, speaker_name, line_text, full_audio_link):
scraped_info = {
'episode_num_text' : item[0],
'radio_date_text' : item[1],
'episode_title' : item[2],
'begin_timestamp' : item[3],
'speaker_class' : item[4],
'speaker_name' : item[5],
'line_text' : item[6],
'full_audio_link' : item[7],
}
yield scraped_info
Und hier ist ein Screen Grab der CSV-Ausgabe which shows the repeated output.
Das Problem in der for
Schleife zu liegen scheint. Mein Gedanke ist dies: Für jeden Selektor in dieser Liste von Selektoren ziehen Sie eine Teilmenge dieses Elements, wie durch die Elemente in der for-Schleife definiert. Stattdessen scheint es ausgeführt zu werden: Für jeden der 177 Selektoren in dieser Liste geben Sie das erste Element jedes definierten Elements zurück.
Ich bin glücklich, irgendwelche dieser Fragen zu klären, und würde jede Hilfe sehr schätzen, die jeder anbieten kann!
Sie müssen nur Ihre Xpath-Ausdrücke innerhalb der Schleife mit einem Punkt beginnen, so dass sie kontextspezifisch sind. – alecxe