2017-03-11 10 views
1

Webページにフォームを記入し、RoboBrowserライブラリを使用して結果の一部を戻そうとしています。Python RoboBrowser SSLエラー:悪いハンドシェイク:SysCallError(104、 'ECONNRESET')

私は、適切なanwser(データ[1]に格納されている通りの名前がフォームに必要なものと異なる場合があり、別のページを開く原因となる可能性があります) 応答が期待通りでない場合(主に通りの名前が間違っているため)、自分のコードが実行され、取得したい情報または「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)を追加しようとしました、私は私がページを過負荷にしていると思っていましたが、それは助けになりませんでした。 誰かがアイデアを持っていますか?

マイコード:

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 

私は

のUbuntu 16.04.2 LTSとPython2.7

を使用していますありがとうございます!

+0

ECONNRESETは、サーバーが接続を厳重に閉じたことを意味します。濫用のためにしばらくしてからIPアドレスをブロックしたり、同じIPアドレスから特定の時間枠内に最大数の接続しか許可しないことがあります。 –

+0

ありがとう@SteffenUllrich!それを回避する方法はありますか? – Clement

+0

フィルタが実際に特定の時間内に同じIPアドレスからの要求数を制限することに実際に基づいている場合、時間あたりの要求数を制限したり、異なるIPアドレスからサイトにアクセスすると役立ちます。 –

答えて

0

私は、呼び出しごとに待ち時間time.sleepを1に変更することでエラーを回避することができました。 プログラムは時々エラーを再現しますが、実際にはまれにしか発生しません(20000〜30000回のリクエストで約1回)。

ご協力いただきありがとうございます。

関連する問題