Я пытаюсь построить паука, который разбивает динамическую капчу с помощью только Scrapy, я сделал это, НО, конечно, когда я ломаю капчу, это не всегда правильно, поэтому я ДОЛЖЕН заставить ее повторить попытку несколько раз (макс.10) чтобы действительно зайти на страницу входа в систему для НЕСКОЛЬКИХ УЧЕТНЫХ ЗАПИСЕЙ (кстати, я использую PIL и pytesseract для обработки капчи).Я прочитал Как мне настроить Scrapy для работы с капчей Это большая помощь, НО это дает мне эту ошибку:
TypeError: process_response() got multiple values for argument 'request'
Это мой код паука:
#self.crawler.settings['MY_ACCOUNTS']= i have defined my list of accounts with "keys"
def start_requests(self):
requests = []
for i, account in enumerate(self.crawler.settings['MY_ACCOUNTS']):
request = scrapy.Request(same_url, callback = self.parse, meta={'key':account['key']} ,dont_filter=True)
request.meta['cookiejar'] = i
requests.append(request)
yield request
#I HAVE TO USE MULTIPLE REQUEST JUST TO GET THE CORRECT SESSION FOR THE COOKIES AND GET THE IMAGE, IF NOT THE IMAGE ALWAYS CHANGE
def parse(self, response):
key= response.meta.get('key')
sessionid = response.headers.getlist('Set-Cookie')[0].decode().split(';')[0]
cookien = sessionid.split('=')[0].strip()
sessionid = sessionid.split('=')[1].strip()
yield scrapy.Request(same_url, meta = {'cookieN': cookien, 'cookieV' : sessionid, 'key':key,'cookiejar': response.meta['cookiejar']},cookies = {cookien :sessionid}, callback = self.parse_with_cookies, dont_filter=True)
#HERE I'M TRYING TO BREAK THE CAPTCHA FILLING A FORM
def parse_with_cookies(self, response):
#break captcha (get text)
data = {'key':key,
'catcha':text
}#fill with the data
yield FormRequest.from_response(response=response,formname="mainForm", formdata=data, callback = self.parse_each_key,meta = {'solve_captcha': True,'CookieName':cookieN,'CookieValue':cookieV , 'key':key,'cookiejar': response.meta['cookiejar'],'catpcha_retries':0},cookies={cookieN:cookieV},dont_filter = True)
#the status code is always 200 even if the captcha is not broken so i search for words if it's incorrect
def parse_each_key(self, response):
if ("incorrect" not in response.text) and ("error" not in response.text):
#extract what i want
else:
self.logger.error("Login failed")
----- MIDDLEWARE ---
#i haven't change to much from the link, i know that i have to fill the functions find_catpcha and solve_captcha but it doesn't even get there
class CaptchaMiddleware(object):
max_retries = 5
def process_response(request, response, spider):
if not request.meta.get('solve_captcha', False):
return response # only solve requests that are marked with meta key
catpcha = find_catpcha(response)
solved = solve_captcha(captcha)
if solved:
response.meta['catpcha'] = captcha
response.meta['solved_catpcha'] = solved
return response
else:
# retry page for new captcha
# prevent endless loop
if request.meta.get('catpcha_retries', 0) == 5:
logging.warning('max retries for captcha reached for {}'.format(request.url))
raise IgnoreRequest
request.meta['dont_filter'] = True
request.meta['captcha_retries'] = request.meta.get('captcha_retries', 0) + 1
return request
Я не знаю, потому что я посылаю несколько запросов одновременно или, возможно, что-то в моем коде.
Спасибо