Запросы веб-скрейпинга Python следуют перенаправлению

Я пытаюсь очистить веб-сайт с помощью модуля запросов.

Используя Chrome и проверяя элементы, я перехожу по URL-адресу, заполняю форму и нажимаю кнопку «Продолжить». Элементы проверки Chrome (сетевые документы) показывают, что Chrome отправил с почтой. Он также показывает несколько файлов cookie. Сайт перенаправляет на URL-адрес, среди прочего с идентификатором сеанса.

Чтобы смоделировать это, я пытаюсь использовать запросы. Я беру данные формы из элементов проверки и переформатирую их в словарь. Я использую request.session для включения файлов cookie.

    import requests

form_data = 'currentCalForm=dep&currentCodeForm=&tripType=oneWay&searchCategory=award&originAirport=JFK&flightParams.flightDateParams.travelMonth=5&flightParams.flightDateParams.travelDay=14&flightParams.flightDateParams.searchTime=040001&destinationAirport=LHR&returnDate.travelMonth=-1000&returnDate.travelDay=-1000&adultPassengerCount=2&adultPassengerCount=1&serviceclass=coach&searchTypeMode=matrix&awardDatesFlexible=true&originAlternateAirportDistance=0&destinationAlternateAirportDistance=0&discountCode=&flightSearch=award&dateChanged=false&fromSearchPage=true&advancedSearchOpened=false&numberOfFlightsToDisplay=10&searchCategory=&aairpassSearchType=false&moreOptionsIndicator=oneWay&seniorPassengerCount=0&youngAdultPassengerCount=0&childPassengerCount=0&infantPassengerCount=0&passengerCount=2'.split('&')

payload = {}
for item in form_data:
    key, value = item.split('=')
    if value:
        payload[key] = value

with requests.session() as s:    
    r = s.post('https://www.aa.com/homePage.do', params = payload, allow_redirects=True)
    print r.headers
    print r.history
    print r.url
    print r.status_code
    with open('x.htm', 'wb') as f:
        f.write(r.text.encode('utf8'))

запросы, однако, похоже, не следуют перенаправлению. история пуста, и URL-адрес, похоже, является данными, которые я отправил, а не тем, что вернул сайт. x.htm показывает веб-страницу, но не содержит ожидаемой информации.

Из http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history Я ожидал, что r.url будет содержать перенаправленный URL-адрес, а r.history — код ответа http.

Что я делаю не так?


person foosion    schedule 23.09.2013    source источник
comment
Вы знаете, как использовать пользователя wireshark?   -  person Ofir Israel    schedule 23.09.2013
comment
Попробуйте это в браузере с отключенным javascript, так как запрос не будет анализировать или запускать javascript. Я также не уверен, что это следует за мета-перенаправлениями, которые может выполнять сайт.   -  person Justin Fay    schedule 23.09.2013
comment
@OfirIsrael Я думал, что wireshark предназначен для мониторинга веб-трафика низкого уровня. Как использовать здесь?   -  person foosion    schedule 23.09.2013
comment
@justinfay Это не работает с отключенным javascript, но, похоже, есть много других страниц, использующих javascript, которые работают с запросом. Какую библиотеку вы бы порекомендовали использовать?   -  person foosion    schedule 23.09.2013
comment
Это может помочь понять, что пошло не так. Если вы получили ответ о перенаправлении и не последовали ему и т. д.   -  person Ofir Israel    schedule 23.09.2013
comment
Запрос @OfirIsrael не перенаправляется. r.url кажется моими параметрами, а не перенаправленным URL-адресом (см. связанный документ запроса). r.history — это пустой список, а не код ответа. Возвращаемая страница не содержит ожидаемой информации. Он возвращает 200 в качестве кода состояния   -  person foosion    schedule 23.09.2013
comment
@justinfay Я считаю, что ты прав. Глядя на вывод html в редакторе, говорит, что у меня должен быть включен javascript, и рекомендует обновить мой браузер. Отображение страницы в моем браузере не включало этот язык.   -  person foosion    schedule 23.09.2013
comment
иногда заголовки имеют значение, я вижу, вы не установили заголовки, попробуйте. также дважды проверьте параметры, которые вы отправляете. если вы сделаете то же самое, что и браузер, вы получите точно такой же результат.   -  person Foo Bar User    schedule 26.09.2013
comment
@FooBarUser Я вырезаю и вставляю параметры данных формы из своего браузера (см. редактирование в вопросе). Что именно вы подразумеваете под установкой заголовков?   -  person foosion    schedule 27.09.2013
comment
@foosion перейти здесь и заголовки ctrl+f   -  person Foo Bar User    schedule 27.09.2013
comment
@FooBarUser заголовки запросов, как сообщает элемент проверки, по сути представляют собой набор файлов cookie. Я думал, что request.sessions() захватили файлы cookie и вернули их. Если нет, то как мне найти файлы cookie, которые устанавливает веб-сайт, чтобы я мог вернуться к request.headers? Кроме того, веб-сайт создает идентификатор сеанса, который добавляется к перенаправленному URL-адресу, и я не вижу способа его получить.   -  person foosion    schedule 27.09.2013
comment
@foosion Я думаю, что у меня получится, я попробую сегодня вечером и дам вам знать (сейчас нужен перерыв). по моему личному опыту, в 99% случаев перенаправление не было в порядке, отправленный запрос был неправильным (либо заголовки, либо параметры). обычно я использую https://addons.mozilla.org/En-us/firefox/addon/httpfox/, чтобы узнать, какие заголовки запросов отправляются, и также параметры, конечно.   -  person Foo Bar User    schedule 27.09.2013


Ответы (1)


хорошо то, что вы делаете, кажется неправильным. я не уверен, как вы решили отправить сообщение на https://www.aa.com/homePage.do, но это похоже на получение и не принимает параметры, которые вы отправляете. когда вы нажимаете поиск, ваш браузер отправляет этот пост: https://www.americanairlines.co.uk/reservation/searchFlightsSubmit.do;jsessionid=XXXXXXXXXXXXXXXXXXX и параметры:

currentCalForm=dep
currentCodeFrom=
tripType=roundTrip
originAirport=LAX
flightParams.flightDateParams.travelMonth=10
flightParams.flightDateParams.travelDay=24
flightParams.flightDateParams.searchTime=040001
destinationAirport=JFK
returnDate.travelMonth=10
returnDate.travelDay=31
returnDate.searchTime=400001
adultPassengerCount=1
adultPassengerCount=1
childPassengerCount=0
hotelRoomCount=1
serviceclass=coach
searchTypeMode=matrix
awardDatesFlexible=true
originAlternateAirportDistance=0
destinationAlternateAirportDistance=0
discountCode=
flightSearch=revenue
dateChanged=false
fromSearchPage=true
advancedSearchOpened=false
numberOfFlightsToDisplay=10
searchCategory=
aairpassSearchType=false
moreOptionsIndicator=
seniorPassengerCount=0
youngAdultPassengerCount=0
infantPassengerCount=0
passengerCount=1

Это даст вам html обратно. preety mach вы должны отправить все запросы, отправленные в браузере. вам может быть проще сделать это с селеном.

я нашел это, используя https://addons.mozilla.org/En-us/firefox/addon/httpfox/, вероятно, похоже на сети Chrome.

person Foo Bar User    schedule 28.09.2013
comment
где взять xxxxxxx для jsessionid=XXXXXXXXXXXXXXXXXXXX? Основная проблема, с которой я столкнулся, - это выяснить, как получить идентификатор сеанса, который является частью URL-адреса перенаправления. - person foosion; 28.09.2013
comment
в файлах cookie: JSESSIONID - person Foo Bar User; 28.09.2013
comment
если я попаду на домашнюю страницу, она перенаправит на americanairlines.co.uk/homePage.do? locale=en_GB, у которого есть файл cookie JSESSIONID - person Foo Bar User; 28.09.2013
comment
JSESSIONID помог перейти к следующему шагу. Все еще есть проблемы, но если я не смогу их решить, я опубликую еще один вопрос. - person foosion; 28.09.2013