Работа со списками и файлами



  • Здравствуйте. Пишу простой парсер и я совсем запутался с работой со списком и файлами.
    Создаю 4 ресурса - "из файла":

    1. urls - чтение и запись - список url
    2. target - только чтение - список признаков
    3. good - только запись - страницы которые содержат признак
    4. bad - только запись - страницы которые не содержат признак

    Логика простая, создаю два списка list_urls и list_target , добавляю данные из ресурса.
    Беру первую строку list_urls и удаляю. GET запрос.
    Цикл FOR от 0 до кол-во list_target значений.
    В цикле проверяю, беру строку и если есть значение - сохраняю в файл.

    Чем отличается - "Читать файл в список" от "Ресурс в список"???

    Мне не понятно в документации
    https://wiki.bablosoft.com/doku.php?id=ru:how_to_load_lines_from_file
    Последовательность после создания ресурса ИЛИ или Затем
    Нужно «Читать файл в список» ИЛИ (Затем) «Ресурс в список»
    Какой смысл в этом сначала «Читать файл в список», потом «Ресурс в список»

    Даже, если я это делаю, я получаю undefined, если брать первую строку.
    Но получается у меня так только, если создать список №1и добавить значение - ресурса., по другому, как в хелпе не получается.

    Далее, есть список №2 из 10 значений. Если создавать список и добавлять значения в список из ресурса, то не считает кол-во строк у списка, получает все время 1 шт. А вот если использовать ресурс в список, то считает.

    Если я хочу сохранить удачную url в файл, то я указываю ресурс {{good|notreuse}} и значение, но я получаю ошибку
    Все данные были обработаны для good. Что?!

    0_1502144888183_GET_URL.xml



  • @myweb101 На будущие, если ваш скрипт использует ресурсы, то добавляйте их тоже в сообщении.
    Первый же экшен у тебя создать список и первое значение в нём это весь ресурс {{urls}}. То есть список считает что у него всего одна запись, все твои url.
    Список это по идее просто массив, если ты добавишь в него цифру 1, затем цифру 2, то в нём будет две записи, 1 и 2 соответственно. Но если ты добавишь сразу 1, 2, то в списке будет одна запись 1, 2. Хотя в инспекторе переменных и в том и в другом случае будет одинаковая запись.

    Ресурс в список используется, если у тебя проект работает в многопотоке и этот ресурс могут пополнять другие потоки.

    Вот так так должно работать. Проверь с ресурсами.



  • @myweb101 Но я бы сделал вот так.



  • Спасибо, но не сохраняет. Все данные были обработаны для bad в логе, а файлы good.txt или bad.txt не создаются.
    Конструкция if [[GOOD_URL]] == 0, мне нужно сохранить только одну url, если она не попадает под условия, а то будут дубли, если будет в циклу FOR.
    Чем отличается «Читать файл в список» и «Ресурс в список» ???
    Почему файлы не создаются - туда данные не записываются, а выводится в лог ошибка Все данные были обработаны для bad ?

    http://wiki.bablosoft.com/doku.php?id=ru:how_to_let_user_to_choose_output_file_name
    Добавить элемент, тоже не работает.



  • @myweb101 Я выше написал:

    На будущие, если ваш скрипт использует ресурсы, то добавляйте их тоже в сообщении.

    Прикладывай ресурсы.

    Что то я пропустил первый раз твой if.
    Конструкция if [[GOOD_URL]] == 0 означает, что в переменной [[GOOD_URL]] должен содержаться ноль 0. А у тебя в цикле, один раз увеличивается на 1 и всё.

    Ошибка Все данные были обработаны для bad появляется, потому что ты указываешь этот ресурс как путь до файла. А ресурс и есть этот файл, но он пустой.

    Используй экшен добавить элемент вместо запись в файл. Примерно вот так.



  • Еще раз спасибо, просто я убрал галку повторное использование у добавить в ресурс и поэтому не сохраняло.
    До цикла FOR устанавливаю переменную [[GOOD_URL]] равной = 0. Делаю цикл FOR по признакам, если совпало, то устанавливаю 1, после цикла проверяю, если переменная равна нулю, не увеличилась, то это значит в цикле FOR не было совпадений и значит , что url не подходит. А если вбивать в цикл FOR условие IF, то будет сохранять каждый раз и будут повторы. Для good url я тоже вынес в условие.

    0_1502182082563_GET_URL.xml



  • @myweb101 Пожалуйста. Только вот ресурсов от тебя я так и не увидел, даже тестовых.
    Я же тебе выше уже готовый скрипт скинул..

    У тебя условие проверки ([[HTML]]).indexOf([[URL_TARGET]]) >= 0 , берёт переменную [[HTML]] и ищет в её содержимом строку [[URL_TARGET]], всё хорошо, но вот дальше идёт больше или равно >= нулю.. То есть даже если строки [[URL_TARGET]] в переменной [[HTML]] даже и не пахнет, условие всё равно выполнится и ссылка засчитается хорошей.
    Так же вместо переменной [[COUNT]], которая считает количество итераций лучше использовать [[CYCLE_INDEX]], она для этого и предназначена.

    И ты не сказал в каком виде будешь использовать скрипт, в многопотоке или в один поток.



  • [[CYCLE_INDEX]]
    А я думал для чего данная переменная создается :)

    ([[HTML]]).indexOf([[URL_TARGET]]) >= 0
    

    Точно!
    Но
    http://community.bablosoft.com/topic/1018/несколько-вопросов-внимание-при-прочтение-может-возникнуть-рукалицо-из-за-ламерства-оных/14
    Я делал через конструктор.
    Я буду использовать скрипт во многопотоке.
    Тестовые данные, извини, проглядел.

    Содержимое urls

    https://community.bablosoft.com/topic/949/часто-задаваемые-вопросы
    https://community.bablosoft.com/topic/2250/премиум-поддержка
    https://community.bablosoft.com/topic/494/большое-количество-потоков-высокая-нагрузка
    https://community.bablosoft.com/topic/494/большое-количество-потоков-высокая-нагрузка/8
    https://community.bablosoft.com/topic/2453/работа-со-списками-и-файлами/7
    https://community.bablosoft.com/topic/2439/вызов-функций-через-ресурсы-и-переменные/9
    https://community.bablosoft.com/topic/2439/вызов-функций-через-ресурсы-и-переменные/13
    https://community.bablosoft.com/topic/2449/баг-в-логе-выполнился-html-код/15
    https://community.bablosoft.com/topic/2449/баг-в-логе-выполнился-html-код/16
    https://community.bablosoft.com/topic/2452/ввод-фразы-по-букве
    https://community.bablosoft.com/topic/2452/ввод-фразы-по-букве/6
    https://community.bablosoft.com/topic/2184/узнать-количество-потоков
    https://community.bablosoft.com/topic/2184/узнать-количество-потоков/5
    https://community.bablosoft.com/topic/2445/обработать-ошибки
    https://community.bablosoft.com/topic/2445/обработать-ошибки/4
    https://community.bablosoft.com/topic/2435/тормозит-скрипт-на-запросах/7
    https://community.bablosoft.com/topic/2451
    https://community.bablosoft.com/topic/2444/выполнить-произвольный-код-get-post-запрос/7
    https://community.bablosoft.com/topic/2447/как-работает-пропуск-кадров
    https://community.bablosoft.com/topic/2447/как-работает-пропуск-кадров/3
    https://community.bablosoft.com/topic/2448/не-могу-залить-видео-в-сообщество-на-facebook
    https://community.bablosoft.com/topic/2437/закрыть-браузер-вылетает
    https://community.bablosoft.com/topic/2437/закрыть-браузер-вылетает/5
    https://community.bablosoft.com/topic/2421/долго-думает-перед-вводом-текста
    https://community.bablosoft.com/topic/2421/долго-думает-перед-вводом-текста/3
    https://community.bablosoft.com/topic/2395/как-подружить-appium/7
    https://community.bablosoft.com/topic/2344/таймаут-во-время-выполнения-script-for-documentroot
    https://community.bablosoft.com/topic/2344/таймаут-во-время-выполнения-script-for-documentroot/4
    https://community.bablosoft.com/topic/2252/can-t-find-variable-_selector
    https://community.bablosoft.com/topic/2252/can-t-find-variable-_selector/24
    https://community.bablosoft.com/topic/1888/обработка-изображений-как-с-ней-работать
    https://community.bablosoft.com/topic/1888/обработка-изображений-как-с-ней-работать/7
    

    Содержимое target

    https://goo.gl/
    https://wiki.bablosoft.com/
    

    Цель, я хочу написать парсер активлинков, с проверкой robots.txt и допилить, чтобы определялась cms по признакам. Это форум - топик или блог или профиль - форума. Просто такой тулзы из адекватных нету.

    Проверку ссылки переделаю, через XPATH и надо будет проверять атрибут nofollow

    И еще пару вопросов:

    Ресурс - добавить элемент.
    Для чего эти галки?
    Добавить в файл/базу мгновенно - это немного понятно. Что сразу, а не по окончанию работы скрипта.
    Только добавить в файл/базу - а это?
    И
    Если стоит галка "Повторное использование" - в
    Ресурс - добавить элемент.
    В чем логика меняется? Или вообще без разницы, когда добавляешь элемент?

    И
    Файл с url лучше запихнуть в WHILE и брать по 0 строке с удалением, так меньше ресурсов машины тратиться?



  • Что-то я совсем запутался.
    Сделал простой скрипт,а меня программа вылетает. Если запустить многопоточно.

    Можете привести простой пример, где нужно брать значение из файла и удалять во многопотоке?

    Если в один поток данный скрипт запускать, то данные из файла не удаляются.
    Если использовать Foreach - , то же самое, не удаляет.
    Если ресурс numbers поставить notreuse в список - отключить Повторное использование галку, то вообще не берет значения.
    Брать новый ресурс или использовать старый при данном запросе ресурса. Вообще не понятно. Что это значит?

    1_1502208426893_list_numbers.txt

    0_1502208426892_example.xml



  • @myweb101 Не совсем понятно, для каких целей этот тестовый скрипт создавался.
    Первый же экшен ресурс в список, то есть ты взял данные из файла, создал в скрипте список и скопировал данные туда. Далее получаешь первый элемент из списка внутри скрипта, к ресурсу эти махинации не имеют ни какого отношения.
    Многопоток в этом случае бесполезен полностью, у тебя десять потоков совершают полностью одинаковые действия.

    Смотри, по факту, у тебя элементарные действия, которое производится за секунды, но запущено всё в 10 потоков и с количеством успешных выполнений 1000. Выходит за секунду у тебя в лог BAS'а вываливается 10 000 сообщений "Элемент-" и 10 000 сообщений "Количесто строк в файле", вот он и подвисает.

    Вот твой же скрипт и файл ресурса, которые работают как тебе было надо.



  • @Fox Что-то там пусто:(



  • @myweb101 Где. блин. пусто?
    0_1502219345571_forum52.png



  • Эм. Я спрашивал, как работать с файлом во многопотоке, многопоточно брать из файла значение и удалять. На каждый поток свое уникальное значение с удалением строки из файла. А тут добавляется ресурс и считается кол-во элементов.



  • @myweb101 Экшен лог имеет значение {{numbers|notreuse}} означает, что значение берётся из ресурса numbers, а notreuse означает, что каждый раз новое.
    У тебя в многопотоке, каждый поток пишет в лог только свою, уникальную строчку взятую из ресурса. Удаляя эту строчку из файла.

    Можете привести простой пример, где нужно брать значение из файла и удалять во многопотоке?



  • @Fox Спасибо еще раз большое! Такое простое действие, а сколько у меня и вас сил отняло. Просто очень сложно логику работы перенять.
    Я в принципе понял в чем я ошибался. Когда мы обращаемся {{numbers|notreuse}} то мы обращаемся напрямую к ресурсу - текстовому файлу. А когда мы добавляем ресурс в список, то мы создаем массив внутри потока и он никак не влияет на ресурс?


Log in to reply
 

  • 6
  • 7
  • 13
  • 4
  • 3
  • 12
  • 6
  • 4