python 405错误认证
python 405 error authentication
我正在尝试编写一个网络抓取工具来自动化我在工作中必须做的一些事情。要在站点上使用 Web 应用程序,我需要使用基本身份验证登录(我知道该方案是基本的)。在 Web 浏览器中,我转到 URL,弹出一条错误消息,询问我提供的用户名和密码,然后我被允许进入第二个登录页面(以防万一)。
这是我在 Python 中使用 urllib2 所做的:
theurl = 'http://where-i-work.com/the-backend'
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0'
#nothing seems to work if the server knows I'm using Python
headers = { 'User-Agent' : user_agent,
'Authorization' : 'Basic myauthorizationstring12345'}
#I've seen this sent in my requests, but also double checked from encoding username and pw with base64
data = ''
req = urllib2.Request(theurl, data, headers)
handle = urllib2.urlopen(req)
当我尝试创建 handle
时,会产生 405 错误:方法不允许。我已经读过 99% 的时间,这意味着我在不应该发送 POST 值的时候尝试发送值。但是当我使用 Tamper Data 时,我也看到了请求中发送的这些信息。只是为了看看,我尝试在数据中发送 headers 中的信息(url 编码),但我收到了 401 错误,就像我从未发送过登录凭据一样。
同样,为了尝试,我还尝试了 https 而不是 http,这产生了 "Certificate Verified Failed" 错误,据我所知这是一个单独的问题。基本上,我一直在尝试我能想到的。
我也尝试过使用 urllib2.HTTPPasswordMgrWithDefaultRealm()
和 urllib2.HTTPBasicAuthHandler()
等,但我仍然遇到 405 错误。现在,我将使用我放在那里的内容,因为我想在我仍在尝试解决这个问题的同时看到正在发生的一切。
难道我只是不明白浏览器是如何正常发送凭据的?我在做一些不同的事情吗?
您为 data
参数提供了一个非空值,因此您的请求将作为 POST 发送。只需使用关键字参数,不要为 data
:
指定值
req = urllib2.Request(theurl, headers=headers)
另一种方法是使用 requests module:
import requests
response = requests.get(
url='http://where-i-work.com/the-backend',
headers={
'User-Agent': 'Mozilla'
},
auth=('username', 'password')
)
我正在尝试编写一个网络抓取工具来自动化我在工作中必须做的一些事情。要在站点上使用 Web 应用程序,我需要使用基本身份验证登录(我知道该方案是基本的)。在 Web 浏览器中,我转到 URL,弹出一条错误消息,询问我提供的用户名和密码,然后我被允许进入第二个登录页面(以防万一)。
这是我在 Python 中使用 urllib2 所做的:
theurl = 'http://where-i-work.com/the-backend'
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0'
#nothing seems to work if the server knows I'm using Python
headers = { 'User-Agent' : user_agent,
'Authorization' : 'Basic myauthorizationstring12345'}
#I've seen this sent in my requests, but also double checked from encoding username and pw with base64
data = ''
req = urllib2.Request(theurl, data, headers)
handle = urllib2.urlopen(req)
当我尝试创建 handle
时,会产生 405 错误:方法不允许。我已经读过 99% 的时间,这意味着我在不应该发送 POST 值的时候尝试发送值。但是当我使用 Tamper Data 时,我也看到了请求中发送的这些信息。只是为了看看,我尝试在数据中发送 headers 中的信息(url 编码),但我收到了 401 错误,就像我从未发送过登录凭据一样。
同样,为了尝试,我还尝试了 https 而不是 http,这产生了 "Certificate Verified Failed" 错误,据我所知这是一个单独的问题。基本上,我一直在尝试我能想到的。
我也尝试过使用 urllib2.HTTPPasswordMgrWithDefaultRealm()
和 urllib2.HTTPBasicAuthHandler()
等,但我仍然遇到 405 错误。现在,我将使用我放在那里的内容,因为我想在我仍在尝试解决这个问题的同时看到正在发生的一切。
难道我只是不明白浏览器是如何正常发送凭据的?我在做一些不同的事情吗?
您为 data
参数提供了一个非空值,因此您的请求将作为 POST 发送。只需使用关键字参数,不要为 data
:
req = urllib2.Request(theurl, headers=headers)
另一种方法是使用 requests module:
import requests
response = requests.get(
url='http://where-i-work.com/the-backend',
headers={
'User-Agent': 'Mozilla'
},
auth=('username', 'password')
)