- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 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 при парсинге )
>super_magic_value_1[1:len(super_magic_value_1)]
Здесь говно?
Другой вопрос что гидроцефалы в какой-то момент решили что HTML может не быть XMLем и теперь XPATH в HTML5 можно и не написать.
Базуер как-то там c хуем на пополам себе всё это парсит, что-то додумывает, рекаверится из ошибок, строит в памяти НОРМАЛЬНОЕ дерево (проверьте инспект элементом -- там сингл рут дерево, нормальный направленный граф же) и дальше оно работает.
Кстати: "строятся по похожему" != "реализация XPATH". Где Вы видели в XPATH понятие "класса "(точечка) например?
http://www.w3.org/TR/html5/introduction.html#html-vs-xhtml
Но какие-то идиоты придумали секцию 1.9, в которой написали, что браузер сам закрывает незакрытые теги, и 8.2.5.3, в которой перечислили теги, которые можно не закрывать.
Нафига вообще вся восьмая глава, если можно было обойтись XHTML?
Тут можно было бы с таким же успехом от dom отказаться.
Вопрос в другом. Если говнокод составляет такой заголовок (X-MicrosoftAjax и Safari в одном запросе), значит, сервер его требует. Но зачем? Но все же знали, что он работает не на Спектруме!
Есть же ебнутые на всю голову программисты сайты которых начинают ридеректить пользователя в зависимости от заголовков.
Так это фреймверк или хуйня головного мозга?
>У меня много юезерагентов )
Лучше было бы такой функционал встроить в http библиотеку. Ты чем пользуешься?
А это что? В grablib есть случайный user agent (но он как и его автор ебанутый)
'X-Requested-With': 'XMLHttpRequest',
'X-MicrosoftAjax': 'Delta=true',
'Origin': 'http://www.exist.ru',
остальное должна проставлять библиотека
Например, были проблемы со входом через OpenID Живого Журнала на сайте, к которому я прикрутил библиотеку с janrain.com. Оказалось, что Livejournal возвращает код ошибки или вообще пустую страницу, если ему не нравится User-Agent. Пришлось патчить эту библиотеку, добавляя заголовки, которые понравятся Живому Журналу.
Тогда это и не библиотека вовсе. Это, мил человек, больница.
давай поговорим о дырках?
как дила?
Попробуй шарики от подшипников вставлять в анус. Меня в своё время прикалывало, правда, потом я протолкнул шарик слишком глубоко (доигрался, пидорок!!!) и меня повели с позором к врачу.