Отправка запроса на страницу aspx
У меня есть страница ASPX по адресу https://searchlight.cluen.com/E5/CandidateSearch.aspx с формой, которую я хотел бы отправить и проанализировать для получения информации.
Используя Python urllib и urllib2, я создал почтовый запрос с соответствующими заголовками и пользовательским агентом. Но полученный ответ html не содержит ожидаемой таблицы результатов. Я неправильно понимаю или упускаю какие-либо очевидные детали?
import urllib
import urllib2
headers = {
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13',
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8',
'Content-Type': 'application/x-www-form-urlencoded'
}
# obtained these values from viewing the source of https://searchlight.cluen.com/E5/CandidateSearch.aspx
viewstate = '/wEPDwULLTE3NTc4MzQwNDIPZBYCAg ... uJRWDs/6Ks1FECco='
eventvalidation = '/wEWjQMC8pat6g4C77jgxg0CzoqI8wgC3uWinQQCwr/ ... oPKYVeb74='
url = 'https://searchlight.cluen.com/E5/CandidateSearch.aspx'
formData = (
('__VIEWSTATE', viewstate),
('__EVENTVALIDATION', eventvalidation),
('__EVENTTARGET',''),
('__EVENTARGUMENT',''),
('textcity',''),
('dropdownlistposition',''),
('dropdownlistdepartment',''),
('dropdownlistorderby',''),
('textsearch',''),
)
# change user agent
from urllib import FancyURLopener
class MyOpener(FancyURLopener):
version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
myopener = MyOpener()
# encode form data in post-request format
encodedFields = urllib.urlencode(formData)
f = myopener.open(url, encodedFields)
print f.info()
try:
fout = open('tmp.htm', 'w')
except:
print('Could not open output file\n')
fout.writelines(f.readlines())
fout.close()
Есть несколько вопросов по этой теме, которые были полезны (например, как отправить запрос на страницу.aspx в python), но я застрял на этом и прошу дополнительной помощи, если это возможно.
Получившаяся html-страница говорит, что мне может потребоваться войти в систему, но страница aspx отображается в моем браузере без входа в систему.
Вот результаты из info():
Подключение: закрыть Дата: вторник, 07 июня 2011 г. 17:05:26 GMT Сервер: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-версия: 2.0.50727 Cache-Control: private Тип контента: текст /html; charset=utf-8 Content-Length: 1944
2 ответа
Я попробовал механизировать и urllib2, и механизировать обрабатывает куки лучше. Я могу отправить форму, просто указав с помощью mechanize:
browser= mechanize.Browser()
browser.select_form(form_name)
browser.set_value("Page$Next", name="pagenumber")
Не было необходимости реплицировать запрос на публикацию вручную, и в этом случае механизация смогла обработать форму, основанную на javascript.
ASP.Net использует функцию безопасности, которая защищает от вмешательства в ViewState, встраивая в него конкретную информацию.
Скорее всего, сервер отклоняет ваш запрос, потому что ViewState обрабатывается так, как если бы он был подделан. Я не могу сказать это с абсолютной уверенностью, но ASP.Net имеет несколько функций безопасности, которые встроены в структуру, которая может препятствовать прямой публикации.
Если сеанс задействован вообще, то вам также нужно будет это учитывать. Чтобы смоделировать, что делает браузер, вам необходимо выполнить следующие шаги:
- Запросить страницу.
- Сохраните коллекцию файлов cookie в переменную.
- Извлеките ViewState в переменную.
- Отправьте с соответствующими значениями формы, передавая вместе с запросом сохраненные файлы cookie и информацию ViewState.
Я знаю много работы, но не слишком сложно. Опять же, это может быть не единственным источником ваших проблем, но о нем стоит прочитать, чтобы начать устранение неполадок.