【问题标题】:Python requests form-data methodPython请求表单数据方法
【发布时间】:2021-11-04 19:15:04
【问题描述】:

我正在尝试自动检索来自 this site 的数据。

我的代码是:

import requests
a_session = requests.Session()
a_session.get('https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp')
session_cookies = a_session.cookies
cookie = session_cookies.get_dict()
ablu = {
    'FatherName': 'Cha',
    'dateofBirth': '19/08/2004',
    'MotherName': 'Cha',
}
referer = 'https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp'
url = 'https://www.kmcgov.in/KMCPortal/KMCBirthRegistrationAction.do?var=getVal'
r = requests.post(url, cookies=cookie, headers={"referer": referer}, data=ablu)
print(r.text)

命令行输出{failure:true,ERRORKEY:{"ERRORMESSAGE":"Please Contact your system administrator"}}

我想知道我做错了什么。这是我第一次尝试自动发送表单数据。

更新 1:

import requests
a_session = requests.Session()
a_session.get('https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp')
session_cookies = a_session.cookies
cookie = session_cookies.get_dict()
ablu = {
    'FatherName': 'Cha',
    'dateofBirth': '19/08/2004',
    'MotherName': 'Cha',
}
referer = 'https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp'
url = 'https://www.kmcgov.in/KMCPortal/KMCBirthRegistrationAction.do?var=getVal'
r = a_session.post(url, cookies=cookie, headers={"Referer": referer, "Accept": '*/*',
    "Accept-Encoding": 'gzip, deflate, br',
    "Accept-Language": 'en-US,en;q=0.9,bn;q=0.8',
    "Connection": 'keep-alive',
    "Content-Length": '56',
    "Content-Type": 'application/x-www-form-urlencoded; charset=UTF-8',
    "DNT": '1',
    "Host": 'www.kmcgov.in',
    "Origin": 'https://www.kmcgov.in',
    "sec-ch-ua": '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
    "sec-ch-ua-mobile": '?0',
    "sec-ch-ua-platform": '"Windows"',
    "Sec-Fetch-Dest": 'empty',
    "Sec-Fetch-Mode": 'cors',
    "Sec-Fetch-Site": 'same-origin',
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
    "X-Requested-With": 'XMLHttpRequest'}, data=ablu)
print(r.text)

【问题讨论】:

  • 不要从其他浏览器硬编码会话 ID。会话 ID 过期。相反,在您的代码中访问该站点一次并保存您返回的会话 cookie。
  • @TimRoberts 做到了,谢谢。输出没有变化。如果你能看一看,我会很高兴的!
  • 不知道。我什至在标题中添加了User-Agent,但它仍然失败。他们可能会进行一些浏览器检测以防止自动读取。
  • 您没有利用您在代码中初始化的会话。你应该使用a_session.post 而不是requests.post。我还建议您欺骗您的用户代理,否则很明显您是一个机器人。在您的浏览器中检查正在发送哪些标头和 cookie,并确保您产生可比较的结果。
  • 复制的浏览器 POST 标头(参见更新 1 中的代码)但没有结果。

标签: python web-scraping python-requests


【解决方案1】:

这是一个工作示例。

首先,请注意我们正在使用会话,因此会自动为您收集 cookie。无需手动处理。

此外,我们可以在逐案提出请求时发送附加标头,但会话标头也包含在内并与您的请求合并。请看这里:Python requests - Advanced Usage

在这种情况下,甚至不需要先发出 get 请求来访问该页面。您可以立即发送您的 POST 请求,它会起作用并返回类似 JSON 的数据。

我认为这里的关键是参数dateOfBirth大写与您的原始代码不同。这一定是您的请求在服务器端失败的原因。

还要注意一些标题,如:

  • 内容类型:application/x-www-form-urlencoded
  • 内容长度:56

将根据需要由请求模块自动填充。

import requests

a_session = requests.Session()
a_session.headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:93.0) Gecko/20100101 Firefox/93.0",
    "Accept": "*/*",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate",
    "DNT": "1",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1"
}
# r = a_session.get('https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp')
# print(r.status_code)

ablu = {
    'FatherName': 'CHA',
    'dateOfBirth': '19/08/2004',
    'MotherName': 'CHA'
}

# additional headers
headers = {
    "X-Requested-With": "XMLHttpRequest",
    "Origin": "https://www.kmcgov.in",
    "Referer": 'https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp',
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin"
}
url = 'https://www.kmcgov.in/KMCPortal/KMCBirthRegistrationAction.do?var=getVal'
r = a_session.post(url, headers=headers, data=ablu)
print(r.text)

【讨论】:

    【解决方案2】:

    检查此代码,它对我有用,也许你不必要地提供cookiesrequests.post(...)

    import requests
    
    url = 'https://www.kmcgov.in/KMCPortal/KMCBirthRegistrationAction.do?var=getVal'
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0",
        "Accept": "*/*",
        "Accept-Language": "pl,en-US;q=0.7,en;q=0.3",
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Sec-Fetch-Dest": "empty",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "same-origin"
    }
    
    payload = {
        'FatherName': 'CHA',
        'dateOfBirth': '19/08/2004',
        'MotherName': 'CHA'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    
    print(response.text)
    

    编辑:

    好的,它有时有效,有时无效。

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多