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
を使用していますありがとうございます!
ECONNRESETは、サーバーが接続を厳重に閉じたことを意味します。濫用のためにしばらくしてからIPアドレスをブロックしたり、同じIPアドレスから特定の時間枠内に最大数の接続しか許可しないことがあります。 –
ありがとう@SteffenUllrich!それを回避する方法はありますか? – Clement
フィルタが実際に特定の時間内に同じIPアドレスからの要求数を制限することに実際に基づいている場合、時間あたりの要求数を制限したり、異なるIPアドレスからサイトにアクセスすると役立ちます。 –