2008-08-29 22 views

Trả lời

56

này làm việc cho tôi:

import urllib2 

proxy = urllib2.ProxyHandler({'http': 'http:// 
username:[email protected]:proxyport'}) 
auth = urllib2.HTTPBasicAuthHandler() 
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler) 
urllib2.install_opener(opener) 

conn = urllib2.urlopen('http://python.org') 
return_str = conn.read() 
+0

urllib2.HTTPHandler được thêm theo mặc định (xem tài liệu urllib2). Có vẻ như nó là dư thừa để thêm nó khi mở công cụ mở. – HongboZhu

+0

Và tại sao bạn sử dụng urllib2.HTTPBasicAuthHandler() nếu không có xác thực được tham gia? – HongboZhu

+0

Thông thường proxy ở định dạng IP. Đó là giống như proxyurl, phải không? – User

9

Cách tốt nhất để trải qua một proxy yêu cầu xác thực được sử dụng urllib2 để xây dựng một cái mở url tùy chỉnh, sau đó sử dụng đó để làm cho tất cả các yêu cầu mà bạn muốn đi qua proxy. Lưu ý đặc biệt, bạn có thể không muốn nhúng mật khẩu proxy trong url hoặc mã nguồn python (trừ khi nó chỉ là một hack nhanh).

import urllib2 

def get_proxy_opener(proxyurl, proxyuser, proxypass, proxyscheme="http"): 
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
    password_mgr.add_password(None, proxyurl, proxyuser, proxypass) 

    proxy_handler = urllib2.ProxyHandler({proxyscheme: proxyurl}) 
    proxy_auth_handler = urllib2.ProxyBasicAuthHandler(password_mgr) 

    return urllib2.build_opener(proxy_handler, proxy_auth_handler) 

if __name__ == "__main__": 
    import sys 
    if len(sys.argv) > 4: 
     url_opener = get_proxy_opener(*sys.argv[1:4]) 
     for url in sys.argv[4:]: 
      print url_opener.open(url).headers 
    else: 
     print "Usage:", sys.argv[0], "proxy user pass fetchurls..." 

Trong một chương trình phức tạp hơn, bạn có thể tách riêng các thành phần này cho phù hợp (ví dụ: chỉ sử dụng một trình quản lý mật khẩu trong suốt thời gian đăng ký). Tài liệu python có more examples on how to do complex things with urllib2 mà bạn cũng có thể thấy hữu ích.

3

Hoặc nếu bạn muốn cài đặt nó, để nó luôn được sử dụng với urllib2.urlopen (do đó bạn không cần phải giữ một tham chiếu đến mở xung quanh):

import urllib2 
url = 'www.proxyurl.com' 
username = 'user' 
password = 'pass' 
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
# None, with the "WithDefaultRealm" password manager means 
# that the user/pass will be used for any realm (where 
# there isn't a more specific match). 
password_mgr.add_password(None, url, username, password) 
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr) 
opener = urllib2.build_opener(auth_handler) 
urllib2.install_opener(opener) 
print urllib2.urlopen("http://www.example.com/folder/page.html").read() 
13

Thiết lập một var môi trường tên http_proxy như thế này: http: // username: password @ proxy_url: cổng

+0

Bây giờ, đó là một câu trả lời rõ ràng. –

+4

Nhưng không thực sự trả lời câu trả lời. – Bouncner

+0

@Bouncner Trả lời câu hỏi, chứ không phải trả lời. Và nó không trả lời cả. –

1

Dưới đây là việc sử dụng phương pháp urllib

import urllib.request 

# set up authentication info 
authinfo = urllib.request.HTTPBasicAuthHandler() 
proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"}) 

# build a new opener that adds authentication and caching FTP handlers 
opener = urllib.request.build_opener(proxy_support, authinfo, 
            urllib.request.CacheFTPHandler) 

# install it 
urllib.request.install_opener(opener) 

f = urllib.request.urlopen('http://www.python.org/') 
""" 
0

Sử dụng này:

import requests 

proxies = {"http":"http://username:[email protected]_ip:proxy_port"} 

r = requests.get("http://www.example.com/", proxies=proxies) 

print r.content 

Tôi nghĩ đó là đơn giản hơn nhiều so với sử dụng urllib. Tôi không hiểu tại sao mọi người lại thích sử dụng urllib rất nhiều.

Các vấn đề liên quan