Попытка загрузить параметры загрузчика скребка из файла json - PullRequest
0 голосов
/ 03 октября 2019

Я создал анализатор 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 init выглядит так

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, и в настоящее время это жестко запрограммировано здесь. Я немного новичок в питоне, и я застрял, пытаясь найти способ получить имя текущего паука до этой точки.

Я не привержен какому-либо конкретному решению проблемы. Мне нужно получить строку регулярного выражения для поля элемента вниз в OutputRegexProcessor. Получаю ли я доступ к имени паука и повторно анализирую файл json, как делаю в настоящее время, или как-то иначе передаю файл json, или какое-то другое решение, о котором я не знаю.

1 Ответ

0 голосов
/ 09 октября 2019

Я в конце концов разработал решение проблемы.

Вместо того, чтобы пытаться загрузить файл в init, который, по-видимому, полностью не запускается, я закончил чтение в конфигурации при первом вызове OutputRegexProcessor, добавив нужное имя файла в loader_context.

init устанавливает поле данных в None, чтобы указать, что оно еще не загружено (с пустой строкой, указывающей, что оно было загружено, но не используется), а затем первый вызов проверяет, является ли оно None. Если это None, то он пытался загрузить данные, а если нет, просто запускает уже загруженное регулярное выражение.

Это сработало, и теперь у меня есть универсальный скребок, который легко настраивается из файла json

...