我已经构建了一个有效的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文件传递给其他人,或者我不知道的其他解决方案。
答案 0 :(得分:0)
我最终找到了解决该问题的方法。
我没有尝试在init中加载文件,这似乎是一个完全没有启动的问题,而是在对OutputRegexProcessor的第一次调用中读取了配置文件,方法是将我需要的文件名添加到loader_context中。
init将数据字段设置为None表示尚未加载(空字符串表示已加载但尚未使用),然后第一个调用检查它是否为None。如果为None,则尝试加载数据;如果不是None,则仅运行已加载的正则表达式。
效果很好,现在我有一个通用的刮板,可以从json文件轻松配置