【发布时间】:2016-07-06 15:47:20
【问题描述】:
这涉及到几乎相同的代码,我今天早上刚刚问了一个不同的问题,所以如果它看起来很熟悉,那是因为它是。
class LbcSubtopicSpider(scrapy.Spider):
...irrelevant/sensitive code...
rawTranscripts = []
rawTranslations = []
def parse(self, response):
rawTitles = []
rawVideos = []
for sel in response.xpath('//ul[1]'): #only scrape the first list
...irrelevant code...
index = 0
for sub in sel.xpath('li/ul/li/a'): #scrape the sublist items
index += 1
if index%2!=0: #odd numbered entries are the transcripts
transcriptLink = sub.xpath('@href').extract()
#url = response.urljoin(transcriptLink[0])
#yield scrapy.Request(url, callback=self.parse_transcript)
else: #even numbered entries are the translations
translationLink = sub.xpath('@href').extract()
url = response.urljoin(translationLink[0])
yield scrapy.Request(url, callback=self.parse_translation)
print rawTitles
print rawVideos
print "translations:"
print self.rawTranslations
def parse_translation(self, response):
for sel in response.xpath('//p[not(@class)]'):
rawTranslation = sel.xpath('text()').extract()
rawTranslation = ''.join(rawTranslation)
#print rawTranslation
self.rawTranslations.append(rawTranslation)
#print self.rawTranslations
我的问题是parse(...) 方法中的“print self.rawTranslations”只打印"[]"。这可能意味着以下两种情况之一:它可能在打印之前重置列表,或者它可能在从链接parse(...) 填充列表的parse_translation(...) 调用完成之前打印。我倾向于怀疑是后者,因为我看不到任何会重置列表的代码,除非类主体中的"rawTranslations = []" 运行多次。
值得注意的是,如果我取消注释 parse_translation(...) 中的同一行,它将打印所需的输出,这意味着它正在正确提取文本,并且问题似乎是主要的 parse(...) 方法所独有的。
我试图解决我认为是同步问题的尝试非常漫无目的——我只是根据我能找到的尽可能多的 Google 教程尝试使用 RLock 对象,结果我 99% 肯定我滥用了它是一样的。
【问题讨论】:
-
在过去的一个小时里,我一直在网上搜索,试图更好地理解 Python 中的锁,但并没有走得太远。我的想法是在最后一次子页面访问完成后释放锁定,但我发现的语法示例非常少。
标签: python-2.7 synchronization scrapy web-crawler scrapy-spider