2017-03-11 4 views
1

웹 페이지에서 양식을 작성하고 RoboBrowser 라이브러리를 사용하여 일부 결과를 다시 가져 오려고합니다.Python RoboBrowser SSL 오류 : 악의적 인 핸드 셰이크 : SysCallError (104, 'ECONNRESET')

나는 데이터 ([1]에 저장된 거리 이름이 양식에 필요한 것과 다를 수 있고 다른 페이지가 열리는 원인이 될 수 있음)를 제공 할 수없는 ~ 200k 개의 참조가있는 파일이 있습니다. 내 코드가 실행되고 응답이 예상되지 않는 경우 (주로 거리 이름이 잘못되어 있기 때문에) 얻으려고하거나 "NS"를 인쇄합니다.

그러나, 임의의 시간 이후 (약 1300 사이클 후 처음, 다음, 약 100 ~ 300 이하), 내가 얻을 :

Traceback (most recent call last): 
    File "web_scraper.py", line 49, in <module> 
    result = rechCadastre(data_point,result) 
    File "web_scraper.py", line 16, in rechCadastre 
    browser.submit_form(form) 
    File "/usr/local/lib/python2.7/dist-packages/robobrowser/browser.py", line 343, in submit_form 
    response = self.session.request(method, url, **send_args) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 497, in send 
    raise SSLError(e, request=request) 
requests.exceptions.SSLError: ("bad handshake: SysCallError(104, 'ECONNRESET')",) 

내가 여기 저기 time.sleep (0.01)를 추가했는데, 생각 나는 페이지를 오버로드하고 있지만 도움이되지 못했습니다. 누구나 아이디어가 있습니까?

내 코드 : 나는 우분투 16.04.2 LTS 및 Python2.7

을 사용하고

import csv 
import re 
from robobrowser import RoboBrowser 
import time 

def rechCadastre(data,result): 
    time.sleep(0.01) 
    form=browser.get_form(id="rech") 
    repetition = '' 
    if data[2]!='': 
     repetition = data[2][0] 
    param={'numeroVoie':data[1],'nomVoie':data[0],'ville':data[3], 'indiceRepetition':repetition} 
    for x in iter(param): 
     form[x]=param[x] 
    time.sleep(0.01) 
    browser.submit_form(form) 
    success = browser.select('#onglet') 
    if not success: 
     result += "NS,NS" 
    else: 
     answer = browser.select('.nomcol')[0] 
     parcelle= re.split('(\W+)',re.search("Parcelle n\W [0-9]{1,4}",answer.text).group(0))[4] 
     feuille = re.split('(\W+)',re.search("Feuille [0-9]{1,4} [A-Z]{1,4}",answer.text).group(0))[4] 
     result += feuille+","+parcelle 
    browser.back() 
    return result 


data = [] 
url = "https://www.cadastre.gouv.fr/scpc/accueil.do" 
browser = RoboBrowser() 
browser.open(url) 

infile = open("treated.csv",'rb') 
reader=csv.reader(infile) 
for row in reader: 
    data.append(row) 

#compt=0 
for data_point in data: 
# if compt == 20: 
#  break 
# data_point = data[i] 
    result = data_point[0] + "," + data_point[1] + "," + data_point[2] + "," + data_point[3] + ",," 
    nd = data_point[0] == "#N/D" 
    rep = (data_point[2] == '') or (data_point[2] == 'BIS') or (data_point[2] == 'TER') or (data_point[2] == 'QUATER') and (data_point[2] == 'B') 
    acceptable = rep and (not nd) 
    if acceptable: 
     result = rechCadastre(data_point,result) 
    print result 
# compt += 1 

감사합니다!

+0

ECONNRESET은 서버가 연결을 어렵게 완료했음을 의미합니다. 남용으로 인해 잠시 후 IP 주소를 차단하거나 동일한 IP 주소의 특정 시간 프레임 내에 최대 연결 수만 허용하는 것일 수 있습니다. –

+0

감사합니다. @SteffenUllrich! 저것을 우회하는 어떤 방법 있는가? – Clement

+0

필터가 실제로 특정 시간 내에 동일한 IP 주소에서 요청 수를 제한하는 것을 기반으로하는 경우 시간당 요청 수를 제한하거나 다른 IP 주소에서 사이트에 액세스하는 경우 도움이 될 수 있습니다. –

답변

0

각 호출마다 대기 시간 time.sleep을 1로 변경하여 오류를 피할 수있었습니다. 프로그램에서 오류를 다시 가져 오는 경우가 있지만 실제로는 거의 발생하지 않습니다 (약 20000-30000 건의 요청).

감사합니다.