尝试从json文件加载刮板itemloader设置

时间:2019-10-03 06:11:56

标签: python-3.x scrapy scrapy-pipeline

我已经构建了一个有效的scrapy解析器,并且我正在从json文件加载设置,以设置用于抓取的xPath和其他设置。

{
  "urlEntry": "https://www.realcommercial.com.au/for-sale/",
  "urlDomain": ".*realcommercial.com.au/for-sale/.*",
  "urlScrape": ".*?\\d{9}",
  "bindings": [
    {
      "name": "ID",
      "xPath": "//span[contains(@class, \"propertyId\")]/text()",
      "filter": "\\d{9}"
    },
    ...

有很多绑定。我已经像这样将设置文件成功加载到蜘蛛中

self.settings = json.load(open("./Scrapy_Agent/config/" + self.name + ".json"))

稍后,我将担心路径的硬编码部分,尽管配置文件基于蜘蛛名称。

但是我遇到麻烦的地方是我有一个管道,希望使用配置文件中的过滤器字段。

我有一个看起来像这样的ItemLoader

class ListingLoader(ItemLoader):

    PostcodeName_out = OutputRegexProcessor("PostcodeName")
    ID_out = OutputRegexProcessor("ID")
    AddressName_out = OutputRegexProcessor("AddressName")

和输出RegexProcessor的初始化看起来像这样

class OutputRegexProcessor(object):
    def __init__(self, name):
        settings = json.load(open("./Scrapy_Agent/config/realcommercialsale.json"))
        self.regex = ""
        for binding in settings["bindings"]:
             if (binding["name"] == name):
                 if (binding.get("filter")):
                    self.regex = binding["filter"]

蜘蛛的名字是realcommercialsale,目前在这里硬编码。我是python的初学者,我一直在努力寻找一种方法来获取当前Spider的名称。

我不致力于解决该问题。我需要在OutputRegexProcessor中获取项目字段的正则表达式字符串。我是否像我目前正在访问Spider的名称并重新解析json文件一样,还是以某种方式将json文件传递给其他人,或者我不知道的其他解决方案。

1 个答案:

答案 0 :(得分:0)

我最终找到了解决该问题的方法。

我没有尝试在init中加载文件,这似乎是一个完全没有启动的问题,而是在对OutputRegexProcessor的第一次调用中读取了配置文件,方法是将我需要的文件名添加到loader_context中。

init将数据字段设置为None表示尚未加载(空字符串表示已加载但尚未使用),然后第一个调用检查它是否为None。如果为None,则尝试加载数据;如果不是None,则仅运行已加载的正则表达式。

效果很好,现在我有一个通用的刮板,可以从json文件轻松配置