Найти - Пользователи
Полная версия: Парсинг Json при помощи Grab
Начало » Python для новичков » Парсинг Json при помощи Grab
1
Seganapa
В ответ на Get запрос сервер мне присылает страницу, в коде которой мне нужно спарсить данные в формате Json
Каким инструменотом Grab это удобнее сделать?

Вот часть кода страницы:

…………
{"phoenician_salesman_hint":false,"militia_hint":false,"player_protection_finished_hint":true,"build_time_reduction_hint":false,"age_of_wonder_hint":false,"display_new_year_hint":false,"world_ends_hint":false,"grepolympia_hint":false};
                                      Layout.militia_hint_shown = false;
                                      Layout.show_confirmation_popup = true;
                                      Layout.displayServerTime();
 
                                      ITowns.initialize({"groups":null,"towns":[{"id":694,"name":"55 Seganapa-7 F","island_x":537,"island_y":516,"plenty":"iron","rare":"wood","has_conqueror":false,"researches":{"berth":true,"conscription":true,"mathematics":true},"favor":500},{"id":57457,"name":"55 \u0421\u043f\u0430\u0440\u0442\u0430","island_x":537,"island_y":516,"plenty":"iron","rare":"wood","has_conqueror":false,"researches":{"berth":true,"conscription":true,"mathematics":true},"favor":500}],"tmpl":"<div class=\"box top left\">\n\t<div class=\"box top right\">\n\t\t<div class=\"box top center\"><\/div>\n\t<\/div>\n<\/div>\n<div class=\"box middle left\">\n\t<div class=\"box middle right\">\n\t\t<div class=\"
……………

Спарсить мне нужно то что находится между ITowns.initialize и “tmpl”, а дальше мне нужно будет использовать эти данные в коде…

xPath как я понимаю мне не поможет? т.к. текст не находится в тэгах. Нужна регулярка? Первый раз приходится парсить в Grab, как удобнее всего получить нужные мне Json данные???
Seganapa
Я нашел один способ:
f = g.rex_text('towns":(.+),"tmpl')

Он работает, но я сомневаюсь что он правильный?
truporez
не думали использовать модуль json?
Seganapa
Я использую модуль json, после того как получаю эти данные…
Seganapa
Как такое может быть??? Вот фрагмент кода
for k in city:
    g.setup(headers = {'X-Requested-With'  :  'XMLHttpRequest'}, referer = 'http://ru8.grepolis.com/game/index?login=1')
    g.go('http://ru8.grepolis.com/game/index?action=switch_town&town_id=%s&h=%s&json={town_id:"%s","nlreq_id":%s}&_=%s' %(k['id'], token, k['id'], nlreq, timef))
    resource = g.rex_text('resources":(.*),"storage')
    print resource
Здесь с каждой итерацией я получаю ответ сервера и вытаскиваю из него кол-во ресурсов с помощью регулярки.

Так вот, каждый раз, когда я запускаю скрипт, мне возвращается ответ с ошибкой, но почти всегда на разном шаге цикла…

Например:
1 Запуск
pydev debugger: starting
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":19244,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":23435,"iron":25500}
{"wood":25500,"stone":23435,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":25500,"iron":25500}
Traceback (most recent call last):
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1392, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1085, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\Noutbook\workspace\proba\Seganapa3RU8.py", line 106, in <module>
    resource = g.rex_text('resources".*),"storage')
  File "C:\Python27\Lib\site-packages\grab-0.4.5-py2.7.egg\grab\ext\rex.py", line 28, in rex_text
    raise DataNotFound('Regexp not found')
grab.error.DataNotFound: Regexp not found

2 Запуск
pydev debugger: starting
{"wood":25500,"stone":25500,"iron":25500}
{"wood":25500,"stone":19586,"iron":25500}
Traceback (most recent call last):
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1392, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Python\eclipse-SDK-4.2-win32\eclipse\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydevd.py", line 1085, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\Noutbook\workspace\proba\Seganapa3RU8.py", line 106, in <module>
    resource = g.rex_text('resources".*),"storage')
  File "C:\Python27\Lib\site-packages\grab-0.4.5-py2.7.egg\grab\ext\rex.py", line 28, in rex_text
    raise DataNotFound('Regexp not found')
grab.error.DataNotFound: Regexp not found

Один раз даже полностью отработало…
Но в основном на каком то этапе цикла он не находит регулярку… Что может быть?
Seganapa
При помощи log_dir выяснил, что при отправке подряд нескольких запросов, в один прекрасный момент возвращается пустая страница… Что это может быть?
slav0nic
Seganapa
задайте этот вопрос админу сайта, который парсите …
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB