我已经遇到了一个我放在一起的蜘蛛问题。我试图从this site上的脚本中找到单行,并找到了一些合适的选择器,但是在运行时,蜘蛛的输出只是一遍又一遍的重复。我见过其他类似问题的其他人(like this),但还没有找到解决我的问题的答案。Scrapy Spider一次又一次地返回相同的元素
(作为一个说明,我认为这可能是我的基地Python的编码和for
环路建设的问题,而不是一个问题与scrapy
本身)。
这里是蜘蛛:
# -*- 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
这里是该.csv输出 which shows the repeated output.
的问题似乎在于在for
循环的屏幕抓取。我的想法是这样的:对于这个选择器列表中的每个选择器,拉一个由for循环中的项定义的元素的子集。相反,它似乎在执行:对于此列表中的177个选择器中的每一个,返回每个定义的项目的第一个元素。
我很高兴澄清任何这些问题,并将不胜感激任何人都可以提供的帮助!
你只需要在循环内用一个点来启动你的xpath表达式,使它们与上下文相关。 – alecxe