Python Proxy Error With Requests Library
Asked Answered
D

3

8

I am trying to access the web via a proxy server in Python. I am using the requests library and I am having an issue with authenticating my proxy as the proxy I am using requires a password.

proxyDict = { 
          'http'  : 'username:[email protected]', 
          'https' : 'username:[email protected]'
        }
r = requests.get("http://www.google.com", proxies=proxyDict)

I am getting the following error:

Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
r = requests.get("http://www.google.com", proxies=proxyDict)
File "C:\Python27\lib\site-packages\requests\api.py", line 78, in get
:param url: URL for the new :class:`Request` object.
File "C:\Python27\lib\site-packages\requests\api.py", line 65, in request
"""Sends a POST request. Returns :class:`Response` object.
File "C:\Python27\lib\site-packages\requests\sessions.py", line 187, in request
def head(self, url, **kwargs):
File "C:\Python27\lib\site-packages\requests\models.py", line 407, in send
"""
File "C:\Python27\lib\site-packages\requests\packages\urllib3\poolmanager.py", line     127, in proxy_from_url
File "C:\Python27\lib\site-packages\requests\packages\urllib3\connectionpool.py", line    521, in connection_from_url
File "C:\Python27\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 497, in get_host
ValueError: invalid literal for int() with base 10: '[email protected]'

How do I solve this?

Thanks in advance for your help.

Dasha answered 14/1, 2012 at 13:25 Comment(1)
It's good manners to mark correct answers as correctFeatherweight
D
17

You should remove the embedded username and password from proxyDict, and use the auth parameter instead.

import requests
from requests.auth import HTTPProxyAuth

proxyDict = { 
          'http'  : '77.75.105.165', 
          'https' : '77.75.105.165'
        }
auth = HTTPProxyAuth('username', 'mypassword')

r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth)
Develop answered 14/1, 2012 at 13:52 Comment(9)
Thanks, I tried that and it solved the error but it still isn't connecting to the proxy. When I look at the returned headers (r.headers), one of them is 'proxy-connection': 'close', which seems to mean its taking too long to connect to the proxy, is there a way to authenticate before requesting any URLs?Dasha
@MarkCollier, please try code from edited answer. It was error In first version. Added HTTPProxyAuth, now it should work.Develop
from requests.auth import HTTPProxyAuth Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> from requests.auth import HTTPProxyAuth ImportError: cannot import name HTTPProxyAuthDasha
@MarkCollier, upgrade requests: pip install --upgrade requestsDevelop
@MarkCollier, you mean proxy connection error, or cannot import name? I've tested this code on local proxy server and it works. When i'm entering wrong username or password, r.status_code is 407. What is yours?Develop
@MarkCollier, what is your requests.__version__? I have 0.9.1. Maybe pip install --upgrade requests failed, or you are testing code in interactive shell, and it has started before upgrade? Try to launch code from file.Develop
In case this helps, this worked for me, using requests==1.1.Emmalynn
I have got the same error. I am with requests version 2.0.0. Any solution?Discretion
This fixed it for me - but does anyone know why? The answer isn't very thorough.Huynh
R
3

I've been having a similar problem on Windows and found the only way to get requests to work was to set the proxies as environment variables before I started Python. For you this would be something like this:

set HTTP_PROXY=http://77.75.105.165
set HTTPS_PROXY=https://77.75.105.165

You might also want to check is there's a specific port required, and if so set it after the url. For example, if the port is 8443 then do:

set HTTP_PROXY=http://77.75.105.165:8443
set HTTPS_PROXY=https://77.75.105.165:8443
Reginareginald answered 24/4, 2014 at 10:39 Comment(1)
see also #5971812Gingerly
A
1

You can use urllib library for this.

from urllib import request
request.urlopen("your URL", proxies=request.getproxies())
Acquiescent answered 16/4, 2014 at 7:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.