Змея / Говнокод #18303 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
def price_request(self, response):
    # ебануцо
    t = TakeFirst()
    magic_data = {'__ASYNCPOST': 'true'}

    # --- забираю зашитые данные из форм
    keys = [
        '__BOOKMARKERbmTabs',
        '__VIEWSTATE',
        '__VIEWSTATEGENERATOR',
        '__EVENTVALIDATION',
        'HiddenField'
    ]
    for k in keys:
        val = response.xpath('//input[contains(@id, "%s")]/@value' % k).extract()
        key = response.xpath('//input[contains(@id, "%s")]/@name' % k).extract()
        if key:
            magic_data[t(key)] = t(val) or ''

    val = response.xpath('//input[contains(@value, "btnGetPrice")]/@value').extract()
    key = response.xpath('//input[contains(@value, "btnGetPrice")]/@name').extract()
    if key:
        magic_data[t(key)] = t(val) or ''

    # --- неведомая херня из js
    # вызов получения цены
    js = response.xpath(u'//script[contains(text(), "$(document).ready(function ()")][contains(text(), "__doPostBack")]').re(
        "__doPostBack\('([^']+)','([^']*)'\)")
    # [\$\w0]+btnGetPrice
    magic_data['__EVENTTARGET'] = js[0]
    # обычно ''
    magic_data['__EVENTARGUMENT'] = js[1]

    # ключ от сервера, скорее всего он связан с сессией
    js = response.xpath(u'//script[contains(text(), "Sys.Application.setServerId")]').re('\("([^"]+)", "([^"]*)"\)')
    super_magic_key = js[1]

    # --- опять данные из формы которые туда должны при ините странице соваться
    js = response.xpath(u'//script[contains(text(), "Sys.WebForms.PageRequestManager._initialize")]').re("'form1', \[([^\]]+)\]")[0]
    super_magic_values = re.findall("'([^']+)'", js)
    super_magic_value_1 = super_magic_values[0]

    for m in super_magic_values[1:len(super_magic_values)]:
        if m:
            magic_data[m] = ''

    # хер его знает почему, но первую букву надо откусить, обычно это t
    super_magic_value1 = super_magic_value_1[1:len(super_magic_value_1)]

    # составное значение вида [\$\w0]+=[\$\w0]+$updPrice|[\$\w0]+btnGetPrice
    magic_data[super_magic_key] = super_magic_value1 + '|' + magic_data['__EVENTTARGET']

    return FormRequest(url=response.url,
                       formdata=magic_data,
                       dont_filter=True,
                       meta=response.meta,
                       callback=self.parse_price,
                       method='post',
                       headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                                'X-Requested-With': 'XMLHttpRequest',
                                'X-MicrosoftAjax': 'Delta=true',
                                'Origin': 'http://www.exist.ru',
                                'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate',
                                'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27'
                       })

То что случается если жалко ресурсов на запуск js при парсинге )

Запостил: kyzi007 kyzi007, (Updated )

Комментарии (57) RSS

  • А что мешало взять движок браузера, если js нужен?

    >super_magic_value_1[1:len(super_magic_value_1)]
    Здесь говно?
    Ответить
  • Зачем вообще использовать xpath? Если можно и так по тексту регуляркой искать. Лишняя трата системных ресурсов. Экономия на спичках: ясное дело, но это не повод стрелять из пушки по воробьям
    Ответить
    • нахрена писать грамматику для языка если готовый парсер есть из коробки?? конечно же xpath в тысячу раз лучше, потому что не нужно думать о всяких пробелах и кавычах, а мыслить надо в терминах языка (узлы, атрибуты) а не в символах.

      Другой вопрос что гидроцефалы в какой-то момент решили что HTML может не быть XMLем и теперь XPATH в HTML5 можно и не написать.
      Ответить
      • Допустим, что XPATH не работает с HTML, который не является XML (куча незакрытых тегов, пропущенное значение атрибута и прочая анскильная питушня). Но как тогда браузеры применяют к нему CSS, ведь селекторы CSS строятся по похожему на XPATH принципу?
        Ответить
        • Точно так же как HTMLDOM работает с HTML5 который ни разу не велл-формд XML.

          Базуер как-то там c хуем на пополам себе всё это парсит, что-то додумывает, рекаверится из ошибок, строит в памяти НОРМАЛЬНОЕ дерево (проверьте инспект элементом -- там сингл рут дерево, нормальный направленный граф же) и дальше оно работает.

          Кстати: "строятся по похожему" != "реализация XPATH". Где Вы видели в XPATH понятие "класса "(точечка) например?
          Ответить
        • xpath и html друг с другом напрямую вообще не работают. Сначала строится дерево (которое можно построить как из xml, так и из html, просто правила парсинга разные), а потом с деревом работает xpath.
          Ответить
          • Понял. Тогда вообще невозможно понять, что же хотел нам поведать гость.
            Ответить
      • Вот кстати вопрос. Почему, зачем, какого хуя нельзя было ужесточённые правила xhtml распространить на html5? Тег, бля, кому-то лишний раз закрыть сложно? Кавычечки поставить? Уже давно хтмл в основном генерируется из блоков, никто руками в блокноте простыни не верстает, размер страницы, слава богу, тоже уже не нужно зверски сокращать. Why?
        Ответить
        • Спецификация HTML5 — это в первую очередь (сюрприз!) спецификация интерфейса, а не языка. Теоретически сериализовать HTML5 можно в любой язык, и в XHTML в том числе:
          http://www.w3.org/TR/html5/introduction.html#html-vs-xhtml

          Но какие-то идиоты придумали секцию 1.9, в которой написали, что браузер сам закрывает незакрытые теги, и 8.2.5.3, в которой перечислили теги, которые можно не закрывать.

          Нафига вообще вся восьмая глава, если можно было обойтись XHTML?
          Ответить
    • Без хпас можно поехать крышей. Это только издалка кажется что все просто.
      Ответить
    • Да что искать готовое, я емейл ща регуляркой проверю быстренько (с)
      Ответить
      • у кого есть золотой молоток -- тому всё кажется гвоздем
        Ответить
        • Да, забыла, хпас может поправить студент, регулярку через три колена - только гуру который ее и написал.
          Ответить
      • js = response.xpath(u'//script[contains(text(), "$(document).ready(function ()")][contains(text(), "__doPostBack")]').re(
                "__doPostBack\('([^']+)','([^']*)'\)")

        Тут можно было бы с таким же успехом от dom отказаться.
        Ответить
  • МукрософтАях и Макинтош в юзерагенте? как они совместились? )
    Ответить
    • Есть два типа извращений: хоккей на траве и балет на льду Safari 5.1 на Винде и IE 5.0 на Маке. Однако, из имеющихся данных следует, что мы имеем дело с совершенно новым гибридом. Но что это, Бэрримор? Неужели IIS для OSX?
      Ответить
    • Как как, очень просто. Что в хедере напишешь то там и будет. Хоть ежиком назовсь.
      Ответить
      • Да это понятно. В своё время сервер Народ.ру выдавал такой заголовок:
        Server: ZX-Spectrum/80
        Но все же знали, что он работает не на Спектруме!

        Вопрос в другом. Если говнокод составляет такой заголовок (X-MicrosoftAjax и Safari в одном запросе), значит, сервер его требует. Но зачем?
        Ответить
        • может так ридирект срабатывал как нужно или наоборот не срабатывал совсем.
          Есть же ебнутые на всю голову программисты сайты которых начинают ридеректить пользователя в зависимости от заголовков.
          Ответить
          • Да, требует. Точнее их js его руками пишет. А что касается сафари - взяла первый из кучи что попался. У меня много юезерагентов )
            Ответить
            • >Точнее их js его руками пишет.
              Так это фреймверк или хуйня головного мозга?

              >У меня много юезерагентов )
              Лучше было бы такой функционал встроить в http библиотеку. Ты чем пользуешься?
              Ответить
              • scrapy, все встроено, руками я начинаю составлять хидер только для упоротых.
                Ответить
                • 'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27'

                  А это что? В grablib есть случайный user agent (но он как и его автор ебанутый)
                  Ответить
                  • Это кусок хидера вставленный руками. Мне не лень второй раз повторить.
                    Ответить
                    • Случайные данные охренеть как при дебаге помогают.
                      Ответить
                      • Чот у меня еще не было таких уж проблем от случайных юзерагентов. Алсо, скрапи не умеет писать лог запросов и ответов?
                        Ответить
                        • А у меня были, потому что ебанатов среди сайтописателей много. И когда дебажишь что то мозговыносящее включается режим параноика.
                          Ответить
                          • >Алсо, скрапи не умеет писать лог запросов и ответов?
                            Ответить
                        • Но потом это надо было конечно убрать чтобы не палиться странной статистикой. Это счас я знаю что они не просто мудаки а мониторят.
                          Ответить
                    • Оттуда какой-то смысл имеет только это

                      'X-Requested-With': 'XMLHttpRequest',
                      'X-MicrosoftAjax': 'Delta=true',
                      'Origin': 'http://www.exist.ru',

                      остальное должна проставлять библиотека
                      Ответить
                      • Бывают параноидальные сервера, которые посылают на три буквы, если клиент прислал незнакомый User-Agent или незнакомое значение ещё какого-нибудь заголовка.

                        Например, были проблемы со входом через OpenID Живого Журнала на сайте, к которому я прикрутил библиотеку с janrain.com. Оказалось, что Livejournal возвращает код ошибки или вообще пустую страницу, если ему не нравится User-Agent. Пришлось патчить эту библиотеку, добавляя заголовки, которые понравятся Живому Журналу.
                        Ответить
          • Но тот js был дыркой (точнее они думали что он их защищает) и его уже убрали с сайта, абидно.
            Ответить
  • Кузя, ты же умеешь отправлять http запросы? Давай вместе флудить и троллить.
    Ответить
    • Флуд и троллинг будет сведён к отправке запросов?.. Как уныло...

      Попробуй шарики от подшипников вставлять в анус. Меня в своё время прикалывало, правда, потом я протолкнул шарик слишком глубоко (доигрался, пидорок!!!) и меня повели с позором к врачу.
      Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8