【问题标题】:python 405 error authenticationpython 405错误认证
【发布时间】:2016-03-04 21:37:14
【问题描述】:

我正在尝试编写一个网络爬虫来自动化我在工作中必须做的一些事情。要在网站上使用 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 时,我也看到了在请求中发送的这些信息。只是为了看看,我尝试在数据的标题中发送信息(url编码),但我收到了 401 错误,就像我从未发送过登录凭据一样。

再次,只是为了尝试,我还尝试了 https 而不是 http,这产生了“证书验证失败”错误,我理解这是一个单独的问题。基本上,我一直在尝试我能想到的。

我也尝试过使用urllib2.HTTPPasswordMgrWithDefaultRealm()urllib2.HTTPBasicAuthHandler() 等,但仍然出现405 错误。现在,我将继续使用我在那里发布的内容,因为我想在我仍在试图弄清楚这一点的同时看到正在发生的一切。

我只是不明白浏览器是如何正常发送凭据的吗?我在做不同的事情吗?

【问题讨论】:

    标签: python web-scraping urllib2 basic-authentication http-status-code-405


    【解决方案1】:

    您为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')
    )
    

    【讨论】:

    • 当然……现在看来很明显了。有效。感谢您的帮助!并且还提到这也可以通过请求来完成:D
    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2019-01-24
    相关资源
    最近更新 更多