如何在Scrapy类中制作循环?

时间:2019-04-30 11:51:02

标签: python scrapy

我正在抓取一个网站。但是我有一个问题。我做了一个类和一个变量,并给了它一个从中抓取数据的链接。但是在网站中,一页中有很多类别。表示有些国家名称用字母INSTALLDIR列出。我做了一个循环,仅输入从CustomActionData开始的国家/地区的第一个字母,这样我就不能一次又一次重复链接。但这是行不通的。它只是给我提供了位于变量A, B upto Z列表末尾的国家名称。如果列表以C结尾,它将为我提供C开头的国家名称,而不是B和A。我希望您理解。.

A, B upto Z

2 个答案:

答案 0 :(得分:1)

我对函数外部变量的逻辑一无所知(或者您对缩进有疑问),但是请检查以下解决方案:

import scrapy

class DmozSpiderSpider(scrapy.Spider):
    name = 'Dmoz'
    start_urls = ['http://dmoz-odp.org/']

    def parse(self, response):
        eleventh_category = ['A', 'B', 'C']
        for again in eleventh_category:
            save = 'http://dmoz-odp.org/Regional/{}/'.format(again)
            items = {
                'Navbar': response.css('#main-nav a::text').extract(),
                'Category_names': response.css('.top-cat a::text').extract(),
                'Subcategories': response.css('.sub-cat a::text').extract(),
                # this is eleventh_category
                'Eleventh_category': save,
            }
            yield response.follow(save, self.alpha_country, meta={'items': items})

    def find_items(self, response, names, finder):
        items = response.meta['items']
        for name, find in zip(names.values(), finder.values()):
            items[name] = response.css(find).extract()
            yield items

    def alpha_country(self, response):
        items = response.meta['items']
        names = {'name1': 'Countries'}
        finder = {'finder1': '.browse-node::text'}
        for name, find in zip(names.values(), finder.values()):
            items[name] = [i.strip() for i in response.css(find).extract() if i.strip()]
            yield items

您在parse函数中拥有所有逻辑和调用,这更加容易且易于理解。

答案 1 :(得分:0)

  

如果列表以C结尾,它将只给我名称   从C开始的国家

每次循环时,您都将覆盖save中的值,因此最终值将始终是eleventh_category的最后一个值。

您可以将循环放入parse方法中:

class DmozSpiderSpider(scrapy.Spider):
    name = 'Dmoz'
    start_urls = ['http://dmoz-odp.org/']
    eleventh_category = ['A','B','C']

    def parse(self, response):    
        for again in self.eleventh_category:
            save = f'http://dmoz-odp.org/Regional/{again}/'
            items = {
                'Navbar': response.css('#main-nav a::text').extract(),
                'Category_names': response.css('.top-cat a::text').extract(),
                'Subcategories': response.css('.sub-cat a::text').extract(),
                # this is eleventh_category
                'Eleventh_category': save
            }
            # save and call request to another page
            dct = [(save, self.alpha_country)]
            for page, callback in dct:
                yield response.follow(page, callback, meta={'items': items})