Python web scraping requests 重定向处理

本文讲述了在使用Pythonrequests库进行网络抓取时,如何解决POST请求无法跟随重定向的问题,包括检查URL、设置allow_redirects参数和管理cookie。提供了一个实际的代码示例以演示操作过程。
摘要由CSDN通过智能技术生成

在使用 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&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.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 和状态码,并将响应内容写入一个文件。

通过运行这个代码,我们可以模拟用户在网页上填写表单,点击提交按钮,并跟随重定向获取重定向后的内容。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值