Proxy với urllib2


76

Tôi mở url bằng:

site = urllib2.urlopen('http://google.com')

Và những gì tôi muốn làm là kết nối theo cách tương tự với một proxy mà tôi có ở đâu đó nói với tôi:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

nhưng điều đó cũng không hoạt động.

Tôi biết urllib2 có một cái gì đó giống như một trình xử lý proxy, nhưng tôi không thể nhớ lại chức năng đó.

Câu trả lời:


142
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

1
Xin chào, @ZelluX, tôi chỉ muốn cài đặt proxy được bật trên một số chức năng, điều đó có nghĩa là tôi phải cài đặt và gỡ cài đặt trình mở cho mọi lệnh gọi của chức năng?
satoru

@ Satoru.Logic Có thể bạn có thể viết một trình trang trí để đơn giản hóa quá trình cài đặt / gỡ cài đặt?
ZelluX

2
Có vẻ như không có uninstallphương pháp nào urllib2, nhưng chúng tôi có thể thực hiện cài đặt proxy một lần; thay vì installingcông cụ mở, chúng tôi tạo một requestđối tượng và sử dụng một công cụ mở cho opennó.
satoru

3
@ Satoru.Logic: Tôi nghĩ cách tiếp cận truyền thống là định cấu hình một biến môi trường như thế nào HTTP_PROXYvà sau đó kiểm tra mã của bạn nếu nó được định nghĩa bằng cách sử dụng os.environ["HTTP_PROXY"].
ccpizza

đừng quên số cổng, ví dụ: 3128 proxy = urllib2.ProxyHandler ({'http': '127.0.0.1:3128'})
J'e

18

Bạn phải cài đặt ProxyHandler

urllib2.install_opener(
    urllib2.build_opener(
        urllib2.ProxyHandler({'http': '127.0.0.1'})
    )
)
urllib2.urlopen('http://www.google.com')

Tôi nhận được Tệp "D: / Desktop / Desktop / mygoogl", dòng 64, site = url.urlopen ('google.com) Tệp "C: \ Python26 \ lib \ urllib2.py", dòng 124, trong urlopen return _opener. mở (url, dữ liệu, thời gian chờ) AttributeError: ProxyHandler dụ không có thuộc tính 'mở'
Chris Stryker

Tôi đã bỏ lỡ một cuộc gọi đến urllib2.build_opener ()
dcrosta

12

Bạn có thể đặt proxy bằng cách sử dụng các biến môi trường.

import os
os.environ['http_proxy'] = '127.0.0.1'
os.environ['https_proxy'] = '127.0.0.1'

urllib2sẽ tự động thêm trình xử lý proxy theo cách này. Bạn cần đặt proxy cho các giao thức khác nhau một cách riêng biệt nếu không chúng sẽ không thành công (trong điều kiện không đi qua proxy), hãy xem bên dưới.

Ví dụ:

proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
# next line will fail (will not go through the proxy) (https)
urllib2.urlopen('https://www.google.com')

Thay thế

proxy = urllib2.ProxyHandler({
    'http': '127.0.0.1',
    'https': '127.0.0.1'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# this way both http and https requests go through the proxy
urllib2.urlopen('http://www.google.com')
urllib2.urlopen('https://www.google.com')

Bạn không nên sử dụng ví dụ: os.environ ['http_proxy'] trong hai bộ ví dụ dưới đây của mình?
Jonathan Benn

7

Để sử dụng proxy hệ thống mặc định (ví dụ: từ biến môi trường http_support), các thao tác sau phù hợp với yêu cầu hiện tại (mà không cần cài đặt nó vào urllib2 trên toàn cầu):

url = 'http://www.example.com/'
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
in_ = opener.open(url)
in_.read()

3

Ngoài câu trả lời được chấp nhận: Scipt của tôi đã cho tôi một lỗi

File "c:\Python23\lib\urllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required

Giải pháp là thêm http: // vào trước chuỗi proxy:

proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

2

Người ta cũng có thể sử dụng các yêu cầu nếu chúng tôi muốn truy cập một trang web bằng proxy. Mã Python 3:

>>> import requests
>>> url = 'http://www.google.com'
>>> proxy = '169.50.87.252:80'
>>> requests.get(url, proxies={"http":proxy})
<Response [200]>

Cũng có thể thêm nhiều proxy.

>>> proxy1 = '169.50.87.252:80'
>>> proxy2 = '89.34.97.132:8080'
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2})
<Response [200]>

Xin chào @WaqarDetho Làm thế nào để biết địa chỉ proxy nào sẽ sử dụng? Nó chỉ là một số địa chỉ ip ngẫu nhiên?
Aman Singh

Xin chào @AmanSingh Tôi đã làm việc này lâu rồi. Nhưng theo như tôi nhớ, tôi tìm thấy các địa chỉ proxy này từ internet. Tôi đã tự đưa chúng vào mã.
Waqar Detho

0

Ngoài ra, đặt proxy cho phiên dòng lệnh Mở dòng lệnh mà bạn có thể muốn chạy tập lệnh của mình

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

chạy tập lệnh của bạn trong thiết bị đầu cuối đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.