从满足某些其他条件的链接中抓取下载数据

问题描述

我正在从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的单独块中,标题数量在另一个块中。

enter image description here

所以我尝试了以下方法。

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,meta={'list_url': list_url})

但是它给了我一个空的csv文件。当我尝试在for循环中打印numOfTitles时,它给我的结果是在循环的所有回合中都找到了第一个xpath。

请为此提出解决方案。

解决方法

正如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)))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...