2013-08-28 26 views
22
This is the script: 

import requests 
import json 
import urlparse 
from requests.adapters import HTTPAdapter 

s = requests.Session() 
s.mount('http://', HTTPAdapter(max_retries=1)) 

with open('proxies.txt') as proxies: 
    for line in proxies: 
     proxy=json.loads(line) 

    with open('urls.txt') as urls: 
     for line in urls: 

      url=line.rstrip() 
      data=requests.get(url, proxies=proxy) 
      data1=data.content 
      print data1 
      print {'http': line} 

như bạn có thể thấy, nó đang cố gắng truy cập danh sách các url thông qua danh sách proxy. Dưới đây là file urls.txt:Python: requests.exceptions.ConnectionError. Số lần thử lại tối đa được vượt quá với url

http://api.exip.org/?call=ip 

ở đây là các tập tin proxies.txt:

{"http":"http://107.17.92.18:8080"} 

tôi đã proxy này tại www.hidemyass.com. Nó có thể là một proxy xấu? Tôi đã thử nhiều và đây là kết quả. Lưu ý: nếu bạn đang cố gắng để nhân rộng này, bạn có thể phải cập nhật các proxy để một gần đây tại hidemyass.com. Họ dường như ngừng làm việc cuối cùng. đây là lỗi đầy đủ và traceback:

Traceback (most recent call last): 
    File "test.py", line 17, in <module> 
    data=requests.get(url, proxies=proxy) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get 
    return request('get', url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 335, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 454, in send 
    history = [resp for resp in gen] if allow_redirects else [] 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 144, in resolve_redirects 
    allow_redirects=False, 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 438, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 327, in send 
    raise ConnectionError(e) 
requests.exceptions.ConnectionError: HTTPConnectionPool(host=u'219.231.143.96', port=18186): Max retries exceeded with url: http://www.google.com/ (Caused by <class 'httplib.BadStatusLine'>: '') 
+0

Thụt lề trong ví dụ của bạn có chính xác không? – Lukasa

+0

Tôi tin như vậy, tại sao? – BigBoy1337

+0

Vì các vòng của 'for' không bị thụt vào. Điều đó có vẻ như nó sẽ gây ra một IndentationError cho tôi. – Lukasa

Trả lời

29

Nhìn vào stack trace bạn đã cung cấp lỗi của bạn là do httplib.BadStatusLine ngoại lệ, trong đó, theo docs, là:

Raised if a server responds with a HTTP status code that we don’t understand.

Nói cách khác một cái gì đó được trả về (nếu được trả về) bởi máy chủ proxy không thể được phân tích bởi httplib thực hiện yêu cầu thực tế.

Từ kinh nghiệm của tôi với (viết) http proxy Tôi có thể nói rằng một số triển khai có thể không tuân theo các thông số kỹ thuật quá nghiêm ngặt (thông số rfc trên http không dễ đọc) hoặc sử dụng hack để sửa các trình duyệt cũ có lỗi trong quá trình triển khai .

Vì vậy, trả lời này:

Could it be a bad proxy?

... Tôi muốn nói - rằng đây là có thể. Cách duy nhất để chắc chắn là xem những gì được trả về bởi máy chủ proxy.

Cố gắng gỡ lỗi bằng trình gỡ lỗi hoặc lấy gói sniffer (ví dụ như Wireshark hoặc Network Monitor) để phân tích những gì xảy ra trong mạng. Có thông tin về những gì chính xác được trả về bởi máy chủ proxy nên cung cấp cho bạn một chìa khóa để giải quyết vấn đề này.

+0

Tôi không sử dụng httplib, trừ khi nó được đưa vào thư viện yêu cầu?Bên cạnh đó, bạn có nói rằng yêu cầu của tôi đi qua máy chủ proxy đến trang web, quay lại máy chủ proxy và sau đó máy chủ proxy cố gắng chuyển tiếp đến tôi không thể đọc được? – BigBoy1337

+0

@ BigBoy1337 về httplib: có vẻ như nó được sử dụng gián tiếp (trong mọi trường hợp bạn có ngoại lệ từ nó trong traceback của bạn). Về "bạn có nói rằng yêu cầu của tôi đi qua máy chủ proxy đến trang web, quay lại máy chủ proxy và sau đó máy chủ proxy nào cố gắng chuyển tiếp đến tôi không đọc được?": Có thể nhưng không cần thiết. Tất cả chúng ta biết tại thời điểm này là trả lời từ proxy không hợp lệ. ... –

+0

... Có thể proxy gặp phải một số lỗi nội bộ ngay cả trước khi gửi yêu cầu đến máy chủ web cuối cùng và do đó proxy trả lời với trả lời không hợp lệ. Nó cũng có thể là lỗi nội bộ này xảy ra trong proxy sau khi máy chủ web trả lời với trả lời hợp lệ cho proxy. Và trên hết, có thể máy chủ web đã trả lời proxy với sự phụ thuộc không hợp lệ, từ đó dẫn đến trả lời không hợp lệ từ proxy. Như tôi đã nói trong câu trả lời của tôi - cách đơn giản nhất để tìm ra nguyên nhân gốc là tìm nạp thêm dữ liệu về những gì đã thực sự được trả lời từ proxy. –

6

Có thể bạn đang quá tải máy chủ proxy bằng cách gửi quá nhiều yêu cầu trong một khoảng thời gian ngắn, bạn nói rằng bạn có proxy từ trang web proxy miễn phí phổ biến có nghĩa là bạn không phải là người duy nhất sử dụng máy chủ đó nó thường dưới tải nặng.

Nếu bạn thêm một số chậm trễ giữa các yêu cầu của bạn như thế này:

from time import sleep 

[...] 

data=requests.get(url, proxies=proxy) 
data1=data.content 
print data1 
print {'http': line} 
sleep(1) 

(lưu ý sleep(1) mà tạm dừng việc thực hiện các mã trong một giây)

Liệu nó hoạt động?

+0

Yêu cầu luôn thêm lý do ban đầu cho ngoại lệ ở cuối. requests.exceptions.ConnectionError: HTTPConnectionPool (host = u'219.231.143.96 ', port = 18186): Số lần thử lại tối đa đã vượt quá với url: http://www.google.com/ (Do gây ra: '') Trong ví dụ này. (Gây ra bởi : '') Điều đó có nghĩa là sẽ không có vấn đề gì với việc Timing bỏ qua HTTP càng nhiều càng tốt theo mệnh lệnh được cung cấp. – PsyKzz

+0

@MattPsyK Tôi đã có ngoại lệ "BadStatusLine" này nhiều lần với một trang web phổ biến (chạy Apache chuẩn) khi tôi gửi quá nhiều yêu cầu cùng một lúc (thủ thuật sleep() làm việc cho tôi), vì vậy có thể đó là cùng một vấn đề ở đây ... –

+0

mẹo ngủ không hiệu quả đối với tôi. Tôi gặp lỗi tương tự. – BigBoy1337

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