问题描述:我使用python 中的httpx包,实现对有动态验证码的网站登录, 然后对指定网址的网页数据获取. 总是提示responsestatus_code=401 错误; 无法进行对指定网址的网页数据的获取。 代码如下:
import httpx
def main():
headers1 = {
"Accept": "application/json, text/plain, */*",
"transfer-encoding": "chunked",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
"Content-Length": "60",
"Content-Type": "application/json;charset=UTF-8",
"Cookie": "SESSION=27f9da0b-67dd-46ed-bfb8-982029726572; XSRF-TOKEN=45bcef7a-b1b0-43bf-87b4-384920a1270e",
"Host": "nmgxt.mohrss.gov.cn",
"Origin": "http://nmgxt.mohrss.gov.cn",
"Referer": "http://nmgxt.mohrss.gov.cn/pp/gkauth/core/console/ui/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62",
"X-Hmac-Hash": "4dfbbdf056677fe8dc374d7f9e35bfbc831f75814608d56d384c5177d97d81c4",
"X-Micro-Time": "1693235308736",
"X-User": "AH340181",
"X-Xsrf-Token": "45bcef7a-b1b0-43bf-87b4-384920a1270e"
}
data1 = {
"asc099": "0",
"residentAddress": "",
"pageNo": 1,
"pageSize": 10
}
username1 = "AH340181"
password1 = "CHSrsj@123"
dynamic_code1 = "rx3k"
URL = f"http://nmgxt.mohrss.gov.cn/pp/gkauth/core/console/ui/modules/auth/login.html?username={username1}&password={password1}&dynamic_code={dynamic_code1}"
url = "http://nmgxt.mohrss.gov.cn/pp/gkauth/console-app/api/sysparameter/sbDataQuery/queryList?pageNo=1&pageSize=10"
session = httpx.Client()
response = session.get(URL)
if response.status_code == 200:
print(f"登陆网页成功,返回码:{response.status_code}")
response = session.post(url, headers=headers1, data=data1)
if response.status_code == 200:
# 获取网页内容
content = response.text
print(content)
else:
print(f"获取网页数据失败,错误码:{response.status_code}")
else:
print(f"登陆网页失败,错误码:{response.status_code}")
session.close()
if __name__ == '__main__':
main()
应当是出在: response = session.post(url, headers=headers1, data=data1) , 但我不知道具体什么原因, 请大家指点!
引用 皆我百晓生 小程序回复内容作答:
根据您提供的代码,出现401错误表示未授权访问。可能的原因是您的登录凭证或者请求头中的参数不正确。请确保提供了正确的用户名、密码和动态验证码,并且将登录请求的请求头正确设置。
另外,您的登录请求似乎是使用GET方法发送的,但通常登录请求需要使用POST方法。建议将登录请求改为POST方法,并根据网站的登录接口文档指定正确的请求参数和头部。
【以下回答由 GPT 生成】
首先,根据你提供的代码,我看到你已经构建了请求的头部和数据,并且指定了要访问的URL。然而,代码中缺少了发送请求的步骤。为了解决这个问题,你需要执行以下步骤:
第一步:导入httpx包
在代码的开头添加以下代码来导入httpx包:
import httpx
第二步:发送POST请求
使用httpx的post()方法来发送POST请求并获取响应。在你的代码中添加以下代码:
response = httpx.post(url, headers=headers1, json=data1)
这将发送POST请求到指定的URL,并将请求头部和数据作为参数传递。将响应保存在一个变量中,以便后续处理。
第三步:处理响应
根据你的需求,你可能需要检查响应的状态码(response.status_code)来确定是否成功访问了指定网址。通常,状态码为200表示成功访问。如果你的状态码为401,那么可能是因为你的用户名、密码或验证码不正确。
你可以添加以下代码来检查状态码并输出结果:
if response.status_code == 200:
print("成功访问指定网址")
elif response.status_code == 401:
print("用户名、密码或验证码错误")
else:
print(f"访问指定网址失败,状态码:{response.status_code}")
第四步:处理响应数据
如果你成功访问了指定的网址,并且希望获取响应的数据,可以使用以下代码:
data = response.json()
这将将响应的JSON数据转换为Python字典,方便你进一步处理和提取需要的信息。
完整的代码如下所示:
import httpx
def main():
headers1 = {
"Accept": "application/json, text/plain, */*",
"transfer-encoding": "chunked",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
"Content-Length": "60",
"Content-Type": "application/json;charset=UTF-8",
"Cookie": "SESSION=27f9da0b-67dd-46ed-bfb8-982029726572; XSRF-TOKEN=45bcef7a-b1b0-43bf-87b4-384920a1270e",
"Host": "nmgxt.mohrss.gov.cn",
"Origin": "http://nmgxt.mohrss.gov.cn",
"Referer": "http://nmgxt.mohrss.gov.cn/pp/gkauth/core/console/ui/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62",
"X-Hmac-Hash": "4dfbbdf056677fe8dc374d7f9e35bfbc831f75814608d56d384c5177d97d81c4",
"X-Micro-Time": "1693235308736",
"X-User": "AH340181",
"X-Xsrf-Token": "45bcef7a-b1b0-43bf-87b4-384920a1270e"
}
data1 = {
"asc099": "0",
"residentAddress": "",
"pageNo": 1,
"pageSize": 10
}
username1 = "AH340181"
password1 = "CHSrsj@123"
dynamic_code1 = "rx3k"
URL = f"http://nmgxt.mohrss.gov.cn/pp/gkauth/core/console/ui/modules/auth/login.html?username={username1}&password={password1}&dynamic_code={dynamic_code1}"
url = "http://nmgxt.mohrss.gov.cn/pp/gkauth/console-ap"
response = httpx.post(url, headers=headers1, json=data1)
if response.status_code == 200:
print("成功访问指定网址")
elif response.status_code == 401:
print("用户名、密码或验证码错误")
else:
print(f"访问指定网址失败,状态码:{response.status_code}")
data = response.json()
# 进一步处理数据...
if __name__ == "__main__":
main()
希望这些步骤能帮助你解决问题。如果你有任何进一步的问题,请随时提问。