我正在从Imdb列表中提取数据,并且工作正常。我提供了与imdb标题相关的所有列表的链接,该代码打开了所有列表,并可以很方便地提取我想要的数据。
class lisTopSpider(scrapy.Spider):
name= 'ImdbListsSpider'
allowed_domains = ['imdb.com']
start_urls = [
'https://www.imdb.com/lists/tt2218988'
]
#lists related to given title
def parse(self, response):
#Grab list link section
listsLinks = response.xpath('//div[2]/strong')
for link in listsLinks:
list_url = response.urljoin(link.xpath('.//a/@href').get())
yield scrapy.Request(list_url, callback=self.parse_list, meta={'list_url': list_url})
现在的问题是,我希望这段代码跳过标题超过50个的所有列表,并获取列表标题少于50个的数据。
问题在于列表链接在xpath的单独块中,标题数量在另一个块中。
所以我尝试了以下方法。
for link in listsLinks:
list_url = response.urljoin(link.xpath('.//a/@href').get())
numOfTitlesString = response.xpath('//div[@class="list_meta"]/text()[1]').get()
numOfTitles = int(''.join(filter(lambda i: i.isdigit(), numOfTitlesString)))
print ('numOfTitles' , numOfTitles)
if numOfTitles < 51:
yield scrapy.Request(list_url, callback=self.parse_list, meta={'list_url': list_url})
但是它给了我一个空的csv文件。当我尝试在for循环中打印numOfTitles时,它给我的结果是在循环的所有回合中都找到了第一个xpath。
请为此提出解决方案。
答案 0 :(得分:1)
正如Gallaecio所说,这只是一个xpath问题。通常,您总是得到相同的数字,因为您正在对完全相同的响应对象执行完全相同的xpath。在下面的代码中,我们获得了整个块(而不仅仅是包含url的部分),并且对于每个块,我们都获得了url和标题数量。
list_blocks = response.xpath('//*[has-class("list-preview")]')
for block in list_blocks:
list_url = response.urljoin(block.xpath('./*[@class="list_name"]//@href').get())
number_of_titles_string = block.xpath('./*[@class="list_meta"]/text()').get()
number_of_titles = int(''.join(filter(lambda i: i.isdigit(), number_of_titles_string)))