2011-12-13 25 views
11

Sử dụng lệnh này curl tôi có thể có được câu trả lời Tôi đang tìm kiếm từ BashThực hiện các yêu cầu HTTP qua mô-đun Yêu cầu Python không hoạt động thông qua proxy nơi curl hoạt động? Tại sao?

curl -v -u z:secret_key --proxy http://proxy.net:80 \ 
-H "Content-Type: application/json" https://service.com/data.json 

I have already seen this other post on proxies with the Requests module

Và nó đã giúp tôi xây dựng mã của tôi bằng Python nhưng tôi cần phải thực hiện một yêu cầu thông qua một proxy . Tuy nhiên, ngay cả khi cung cấp các proxy thích hợp thì nó vẫn không hoạt động. Có lẽ tôi chỉ không nhìn thấy một cái gì đó?

>>> requests.request('GET', 'https://service.com/data.json', \ 
>>> headers={'Content-Type':'application/json'}, \ 
>>> proxies = {'http' : "http://proxy.net:80",'https':'http://proxy.net:80'}, \ 
>>> auth=('z', 'secret_key')) 

Hơn nữa, tại cùng một bảng điều khiển python, tôi có thể sử dụng urllib để thực hiện yêu cầu có thành công.

>>> import urllib 
>>> urllib.urlopen("http://www.httpbin.org").read() 
---results--- 

Ngay cả khi các yêu cầu thử chỉ trên một địa chỉ không phải https không hoạt động.

>>> requests.get('http://www.httpbin.org') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/Library/Python/2.6/site-packages/requests/api.py", line 79, in get 
    return request('get', url, **kwargs) 
File "/Library/Python/2.6/site-packages/requests/api.py", line 66, in request 
    prefetch=prefetch 
File "/Library/Python/2.6/site-packages/requests/sessions.py", line 191, in request 
    r.send(prefetch=prefetch) 
File "/Library/Python/2.6/site-packages/requests/models.py", line 454, in send 
    raise ConnectionError(e) 
requests.exceptions.ConnectionError: Max retries exceeded for url: 

Yêu cầu quá thanh lịch và tuyệt vời nhưng làm sao có thể thất bại trong trường hợp này?

+0

http://pycurl.sourceforge.net/ –

+1

Tôi biết rằng tôi có thể thiết lập và sử dụng pycurl trên máy Mac của mình mà không gặp quá nhiều rắc rối (hoặc có thể là bất kỳ sự cố nào). Tôi đã cố gắng để đi cho các giải pháp thanh lịch hơn bằng cách sử dụng yêu cầu đó là khá tuyệt vời và sạch sẽ. Cảm ơn bạn đã gợi ý mặc dù. – dalanmiller

+0

Thiết lập proxy để sử dụng với các yêu cầu hoạt động tốt ở đây. Lý tưởng nhất là chúng tôi có thể tái sản xuất những gì bạn nhìn thấy ... nếu không, hãy cho chúng tôi biết tại sao nó không hoạt động là lựa chọn duy nhất khác. Bạn đang nhận được một dấu vết ngăn xếp từ các yêu cầu? Bạn cũng có thể theo dõi mạng của bạn và kiểm tra các yêu cầu thực tế, vì tôi chỉ có thể đoán chúng phải khác nhau cho một hiệu ứng khác nhau được quan sát giữa các yêu cầu curl /. –

Trả lời

8

Sự cố thực sự nằm trong thư viện truy cập url chuẩn của python - urllib/urllib2/httplib. Tôi không thể nhớ thư viện nào là thủ phạm chính xác, nhưng vì mục đích đơn giản, hãy gọi nó là urllib. Thật không may, urllib không thực hiện phương thức HTTP Connect được yêu cầu để truy cập trang https thông qua proxy http. Nỗ lực của tôi để thêm các chức năng bằng cách sử dụng urllib đã không thành công (nó đã được một thời gian kể từ khi tôi đã cố gắng). Vì vậy, tiếc là lựa chọn duy nhất tôi biết để làm việc là sử dụng pycurl cho trường hợp này.

Tuy nhiên, có một giải pháp tương đối sạch sẽ gần như chính xác cùng một API như yêu cầu python, nhưng nó sử dụng một phụ trợ pycurl thay vì thư viện chuẩn python.

Thư viện được gọi là human_curl. Tôi đã sử dụng nó bản thân mình và đã có kết quả tuyệt vời.

+1

+1 cho human_curl. Không biết về viên đá quý đó. –

+1

Điều đó không đúng. urllib2 ** ** hỗ trợ kết nối HTTP (http://bugs.python.org/issue1424152) trong khi yêu cầu không hỗ trợ nó cho đến 2.0 (https://github.com/kennethreitz/requests/pull/1515). – schlamar

+0

+1 lib tuyệt vời! Giải quyết các vấn đề của tôi – c24b

1

Believeing ​​trên câu trả lời, chúng tôi cố gắng human_curl

human_curl đã lỗi như Lỗi không xác định, trong khi urllib3 đã sửa lỗi như Request timed out, Max lần thử lại vượt quá với url.

Vì vậy, chúng tôi đã quay trở lại urllib3, urllib3 là an toàn chỉ. Chúng tôi rất hài lòng với urllib3

Chỉ có vấn đề bây giờ chúng ta có được nó "Max lần thử lại vượt quá", Chúng tôi không thể giải quyết nó, đoán nó có thể là để làm với máy chủ/proxy, Nhưng không chắc chắn.

+1

Tôi đang sử dụng các yêu cầu tại nơi làm việc và mọi thứ dường như hoạt động tốt, bao gồm cả các liên lạc qua kết nối https. Hơn nữa, chúng tôi sử dụng proxy để gỡ lỗi các yêu cầu http. Nếu bạn có thể làm sáng tỏ vấn đề của mình, tôi có thể giúp bạn. – Ifthikhan

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