3

我正在尝试使用请求模块抓取网站。

使用 chrome 和检查元素,我转到 url,填写表格并单击继续按钮。Chrome 的检查元素(网络文档)显示了 chrome 通过 post 发送的内容。它还显示多个 cookie。该站点重定向到一个带有会话 ID 的 URL。

为了模拟这一点,我尝试使用请求。我从检查元素中获取表单数据并将其重新格式化为字典。我使用 requests.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'))

但是,请求似乎没有遵循重定向。history 是空的,并且 url 似乎是我发送的数据,而不是网站返回的数据。x.htm 显示一个网页,但不包含我预期的信息。

http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history我希望 r.url 包含重定向的 url 和 r.history 包含一个 http 响应代码。

我究竟做错了什么?

4

1 回答 1

2

好的,您所做的似乎是错误的。我不确定您是如何决定在 上发送帖子的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。你必须发送所有在浏览器中发送的请求。使用硒可能更容易做到这一点。

我发现这使用httpfox可能类似于 chrome 网络。

于 2013-09-28T09:48:01.810 回答