在Scrapy机器人中,我不能增加一个全局变量(但是可以分配相同的变量),为什么?

yeotifhr  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(197)

我知道使用全局变量不是一个好主意,我打算做一些不同的事情。但是,在玩的时候,我在Scrapy中遇到了一个奇怪的全局变量问题。在纯Python中,我没有看到这个问题。
当我运行此bot代码时:

import scrapy

from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["lib-web.org"]
    start_urls = [
        "http://www.lib-web.org/united-states/public-libraries/michigan/"
    ]

    count = 0

    def parse(self, response):
        for sel in response.xpath('//div/div/div/ul/li'):
            item = DmozItem()
            item['title'] = sel.xpath('a/text()').extract()
            item['link'] = sel.xpath('a/@href').extract()
            item['desc'] = sel.xpath('p/text()').extract()

            global count;
            count += 1
            print count

            yield item

Dmoz项目:

import scrapy

class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

我得到这个错误:

File "/Users/Admin/scpy_projs/tutorial/tutorial/spiders/dmoz_spider.py", line 22, in parse
    count += 1
NameError: global name 'count' is not defined

但如果我只是将“count += 1”更改为“count = 1”,它就可以正常运行。
这是怎么回事?为什么我不能增加变量?
同样,如果我在Scrapy上下文之外运行类似的代码,在纯Python中,它运行得很好。代码如下:

count = 0

def doIt():
        global count
        for i in range(0, 10):
            count +=1
doIt()
doIt()
print count

导致:

Admin$ python count_test.py
20
knpiaxh1

knpiaxh11#

count在你的例子中是一个类变量,所以你应该使用self.count来访问它。它解决了这个错误,但也许你真正需要的是一个示例变量,因为作为一个类变量,count在类的所有示例之间共享。
parse方法内赋值count = 1是有效的,因为它创建了一个新的局部变量,名为count,它不同于类变量count
你的纯Python示例之所以有效,是因为你没有定义一个类,而是定义了一个函数,并且你在这里创建的变量count具有全局作用域,可以从函数作用域访问。

相关问题