首页 > 解决方案 > 我无法使用发布请求 python 登录网站

问题描述

我正在尝试通过传递用户名和密码登录网站。它说会话 cookie 丢失。我是 api 的初学者。我不知道我是否在这里遗漏了一些东西。网站是http://testing-ground.scraping。亲/登录

 import urllib3
 http = urllib3.PoolManager()
 url = 'http://testing-ground.scraping.pro/login?mode=login'
 req = http.request('POST', url, fields={'usr':'admin','pwd':'12345'})
 print(req.data.decode('utf-8'))

标签: pythonposturllib

解决方案


您的代码中有两个问题导致您无法成功登录。

内容类型问题

在您urllib3用于发送 content-type 数据的代码中multipart/form-data。但是,该网站似乎只接受 content-type application/x-www-form-urlencoded

尝试以下 cURL 命令:

  1. curl -v -d "usr=admin&pwd=12345" http://testing-ground.scraping.pro/login?mode=login
  2. curl -v -F "usr=admin&pwd=12345" http://testing-ground.scraping.pro/login?mode=login

对于第一个,您的请求标头中的内容类型是application/x-www-form-urlencoded,因此网站会使用它并让您登录(并带有302 Found响应)。

但是,第二个发送带有 content-type 的数据multipart/form-data。该网站不接受它,因此拒绝您的登录请求(带有200 OK响应)。

饼干问题

另一个问题是urllib3默认情况下遵循重定向。更重要的是,cookie 默认不被urllib3. 因此,第二个请求不会包含 cookie tdsess=TEST_DRIVE_SESSION,因此网站会返回您未登录的消息。

如果只关心登录请求,可以试试下面的代码:

import urllib3

http = urllib3.PoolManager()
url = 'http://testing-ground.scraping.pro/login?mode=login'
req = http.request('POST', url, data={'usr':'admin','pwd':'12345'}, encode_multipart=False, redirect=False)
print(req.data.decode('utf-8'))

encode_multipart=False指示以urllib3content-type 发送数据application/x-www-form-urlencoded;告诉它不要遵循redirect=False重定向,以便您可以看到初始请求的响应。

但是,如果您确实想完成整个登录过程,则需要保存第一个响应中的 cookie 并在第二个请求中发送它。您可以使用urllib3, 或

使用请求库

我不确定您是否有任何特殊原因使用urllib3. Urllib3如果你很好地实现它肯定会起作用,但我建议尝试Request使用更容易使用的库。对于您的情况,以下代码Request将起作用并让您进入欢迎页面:

import requests

url = 'http://testing-ground.scraping.pro/login?mode=login'
req = requests.post(url, data={'usr':'admin','pwd':'12345'})
print(req.text)

推荐阅读