在使用 Python 的 requests
库进行网络抓取时,遇到一个问题:需要模拟用户在网页上填写表单,点击提交按钮后,网页会被重定向到另一个地址,并且会在新的地址中包含一些重要的信息。
但是我使用 requests
库发送 POST 请求时,总是无法跟随这个重定向,导致无法获取重定向后的内容,只能够得到发送请求时的地址。
2、解决方案
首先,需要检查发送请求的 URL 是否正确,因为 requests
库可能会根据请求的 URL 自动处理重定向。确保发送的 URL 是重定向后的目标地址。
其次,需要确保 requests
库的 allow_redirects
参数设置为 True
,以便允许库自动处理重定向。
最后,需要检查发送请求时是否正确地设置了 cookie。cookie 是服务器发送给客户端的一小块数据,用于在客户端和服务器之间传递信息。在某些情况下,cookie 是重定向过程中必不可少的,如果 cookie 设置不正确,重定向可能会失败。
以下是一个 Python 代码示例,演示了如何使用 requests
库来模拟用户在网页上填写表单,点击提交按钮,并跟随重定向获取重定向后的内容。
import requests
form_data = 'currentCalForm=dep¤tCodeForm=&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.americanairlines.co.uk/reservation/searchFlightsSubmit.do;jsessionid=XXXXXXXXXXXXXXXXXXX', data=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'))
在这个代码示例中,我们首先定义了一个 form_data
字符串,其中包含了表单中的字段和值。然后,我们使用 form_data
创建了一个 payload
字典,以便将其作为 requests
库的 data
参数。
接下来,我们使用 requests.session()
创建了一个会话对象,以便能够在多个请求之间共享 cookie。然后,我们使用 s.post()
方法发送 POST 请求,将 payload
字典作为 data
参数,并设置 allow_redirects
参数为 True
。
最后,我们打印出响应头、重定向历史、目标 URL 和状态码,并将响应内容写入一个文件。
通过运行这个代码,我们可以模拟用户在网页上填写表单,点击提交按钮,并跟随重定向获取重定向后的内容。