python - 无需明确定义要抓取的每个字段即可抓取数据

标签 python scrapy

我想抓取一页数据(使用 Python Scrapy 库),而不必在页面上定义每个单独的字段。相反,我想使用元素的 id 作为字段名称动态生成字段。

起初我认为最好的方法是建立一个收集所有数据的管道,并在收集到所有数据后将其输出。

然后我意识到我需要将数据传递到项目中的管道,但我无法定义项目,因为我不知道它需要哪些字段!

解决这个问题的最佳方法是什么?

最佳答案

更新:

旧方法不适用于 item loaders并不必要地使事情复杂化。这是实现灵活项目的更好方法:

from scrapy.item import BaseItem
from scrapy.contrib.loader import ItemLoader

class FlexibleItem(dict, BaseItem):
    pass

if __name__ == '__main__':
    item = FlexibleItem()
    loader = ItemLoader(item)

    loader.add_value('foo', 'bar')
    loader.add_value('baz', 123)
    loader.add_value('baz', 'test')
    loader.add_value(None, {'abc': 'xyz', 'foo': 555})

    print loader.load_item()

    if 'meow' not in item:
        print "it's not a cat!"

结果:

{'foo': ['bar', 555], 'baz': [123, 'test'], 'abc': ['xyz']}
it's not a cat!

Old solution:

Okay, I've found a solution. It's a bit of "hack" but it works..

A Scrapy Item stores the field names in a dict called fields. When adding data to an Item it checks if the field exists, and if it doesn't it throws and error:

def __setitem__(self, key, value):
    if key in self.fields:
        self._values[key] = value
    else:
        raise KeyError("%s does not support field: %s" %\
              (self.__class__.__name__, key))

你可以做的是重写这个 __setitem__ 函数,使其不那么严格:

class FlexItem(Item):
    def __setitem__(self, key, value):
        if key not in self.fields:
            self.fields[key] = Field()

        self._values[key] = value

好了。

现在,当您向项目添加数据时,如果该项目未定义该字段,则会添加该字段,然后数据将正常添加。

关于python - 无需明确定义要抓取的每个字段即可抓取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069416/

相关文章:

Python Selenium : Randomly select from a url list textfile

python - 如何修复 python 中 fhirclient-4.0.0prepare() 方法中的 'FHIRValidationError' ?

python - 如何将由空格分隔的整数(像素)组成的字符串列转换为大约 28000 行的数据帧

python - Pygame 在曲面内旋转矩形

python - 在存储的数据上重播 Scrapy 蜘蛛

python - Scrapy start_urls 未解析

python - 如何在 Anaconda 上安装 Selenium 以及如何在 Anaconda 的 Spyder IDE 上将 selenium 与 Scrapy 一起使用?

python - 无法使用 cx_Freeze 制作独立的二进制 scrapy 蜘蛛

javascript - 在 django 和 javascript 中按日期进行测试

python - 在 scrapy 中抓取 json 响应