2014-11-24 2 views
1

작동, 내가가 나타납니다요청은 기계화가, URLLIB 실패하지만 컬이 요청을 통해 <a href="https://datamuster.marketdatasuite.com/Account/LogOn?ReturnUrl=%2FProfile%2FList" rel="nofollow">this site</a>에 액세스를 시도하는 동안

('Connection aborted.', error(54, 'Connection reset by peer')) 

는 또한 기계화 및 URLLIB를 통해 사이트에 액세스 시도, 모두 실패했습니다. 그러나 cURL 잘 작동합니다 (코드 끝을 참조).

, stream=True의 조합으로 requests.get()을 시도했으며 cURL 헤더로 요청을 시도했습니다.

대안으로 urllib/Mechanize로 이동하려고 시도했지만 둘 다 같은 오류가 발생했습니다. 헤더

import requests 
import cookielib 

url = "https://datamuster.marketdatasuite.com/Account/LogOn?ReturnUrl=%2fProfile%2fList" 

header = { 
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    'Accept-Encoding':'gzip,deflate,sdch', 
    'Accept-Language':'en-US,en;q=0.8', 
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36' 
} 

jar = cookielib.CookieJar() 
s = requests.Session() 
s.headers.update(header) 

r = s.get(url, cookies=jar) 

컬 테스트 :

$ curl -v -I -H "....Testing: Header...." https://datamuster.marketdatasuite.com/Account/LogOn?ReturnUrl=%2fProfile%2fList 

* Hostname was NOT found in DNS cache 
* Trying 54.252.86.7... 
* Connected to datamuster.marketdatasuite.com (54.252.86.7) port 443 (#0) 
* TLS 1.2 connection using TLS_RSA_WITH_AES_128_CBC_SHA256 
* Server certificate: datamuster.marketdatasuite.com 
* Server certificate: COMODO SSL CA 
* Server certificate: AddTrust External CA Root 
> HEAD /Account/LogOn?ReturnUrl=%2fProfile%2fList HTTP/1.1 
> User-Agent: curl/7.37.1 
> Host: datamuster.marketdatasuite.com 
> Accept: */* 
> ....Testing: Header.... 
> 
< HTTP/1.1 200 OK 

답변

2

이 과정은 완전히 간단하지 않았으므로 다른 사람을 위해 쉽게 따라 할 수있는 새로운 대답을 게시 할 것이라고 생각했습니다. 설치시

그러나

, pyOpenSSL 문제가 발생할 수 있습니다

Following this thread

, 나는 SNI 파이썬 2와 함께 작동하도록 이러한 라이브러리를 설치하는 데 필요한 pip install pyOpenSSL.

pip install pyOpenSSL==0.13 ndg-httpsclient pyasn1 

이 요청이 이제 함께 작동하도록해야합니다

pip uninstall pyOpenSSL 

다음 명령은 필요한 모든 종속성을 설치 한 : 사실 pyOpenSSL 버전 0.14이 작동하지 않았기 때문에, 기존의 openssl을 제거했다


파이썬 2. SNI는 버전 pyOpenSSL와 함께 문제를 읽고 유지. 0.14 ...

ver. 0.14 다음 오류가 발생합니다.

Command /usr/local/opt/python/bin/python2.7 -c "import setuptools, tokenize;__file__='/private/var/folders/04/3f_y5fw166v03k7b51j1tsl80000gn/T/pip_build_alex/cryptography/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/04/3f_y5fw166v03k7b51j1tsl80000gn/T/pip-7QR71B-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /private/var/folders/04/3f_y5fw166v03k7b51j1tsl80000gn/T/pip_build_alex/cryptography 
Storing debug log for failure in /Users/alex/.pip/pip.log 

및 pyOpenSSL이 버전으로 설치됩니다. 0.14 불완전 :

import requests 
response = requests.get("http://datamuster.marketdatasuite.com") 

(...lots of errors...) 
    raise ConnectionError(err, request=request) 
requests.exceptions.ConnectionError: ('Connection aborted.', error(54, 'Connection reset by peer')) 

다음 명령으로 되돌아 버전 pyOpenSSL 다음 requests.get() 시도로부터 알 수있는 바와 같이

$ pip show pyOpenSSL 
--- 
Name: pyOpenSSL 
Version: 0.14 
Location: /usr/local/lib/python2.7/site-packages 
Requires: cryptography, six 

. 0.13 및 문제 파이썬에서

pip uninstall pyOpenSSL 
pip install pyOpenSSL==0.13 

다음 수정 :

import requests 
requests.get("http://datamuster.marketdatasuite.com") 

<Response [200]> 
3

서버는 SNI의 사용을 필요로하고 더 SNI를 사용하지 않을 경우 바로 연결을 닫습니다 다음과 같이 요청에 대한

내 코드입니다. curl은 SNI를 사용하는 것처럼 보이지만, 사용중인 요청 라이브러리의 버전은 SNI를 사용하지 않습니다.

OpenSSL을 사용해보십시오. SNI없이 오류 얻을 :

$ openssl s_client -connect datamuster.marketdatasuite.com:443 
CONNECTED(00000003) 
write:errno=104 

을하지만 당신은 SNI (-servername ...)를 사용하는 경우 다음 작동하십시오 FAQ for request SNI에 따르면

CONNECTED(00000003) 
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO SSL CA 
... 
SSL-Session: 
    Protocol : TLSv1.2 
    Cipher : AES128-SHA256 

만 파이썬 3, 파이썬 2 지원되지 않습니다. 이 리소스를 통해 Python 2에서 SNI를 만드는 방법에 대한 정보를 참조하십시오.

1

워드 프레스에 테스트 요청을 보낼 파이썬 요청을 사용할 때이 같은 문제를 가지고를 (내가 헌정 서버에 워드 프레스를 설치). SSL 패키지를 성공적으로 업데이트하려고했습니다.

그런 다음 서버에 전송 된 요청이 응답을받는 데 지연이 있음을 알았습니다. 긴 지연 요청은 항상 "킥오프"되어 발생했습니다 ('연결이 중단되었습니다.', 오류 (54, '상대가 연결 재설정')). 요청이 응답을 기다리는 동안 웹 서버 (Apache)가 연결을 재설정한다는 것이 밝혀졌습니다.

(Apache 웹 서버에서) KeepAliveTimeout을 5 초에서 20 초로 늘리고 결코이 오류를 다시 발생시키지 않습니다.

예외 코드 개선 : KeepAliveTimeout 증가는 대부분의 테스트에서 작동합니다. 그러나 일부 테스트에서는 여전히 동일한 오류가 발생하고 프로그램이 중지됩니다. 나는 Exception을 잡아 내고 그것이 발생하는 요청을 반복하는 코드를 추가한다.

import requests 
... 
while(1): 
    requestOK = True 
    try: 
     r = session.get(requestURL, headers=headers, timeout=None) 
    except requests.exceptions.ConnectionError: 
     print ("'Connection aborted.', error(54, 'Connection reset by peer')") 
     print ("\tResend request...") 
     requestOK = False 
    if requestOK: 
     break 

희망이 도움이 될 것입니다!

관련 문제