1. Python / Говнокод #18303

    −126

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 09 Июня 2015

    Комментарии (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 запросы? Давай вместе флудить и троллить.
      Ответить
      • Флуд и троллинг будет сведён к отправке запросов?.. Как уныло...

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

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