File scraping mit mechanize

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Mampf
User
Beiträge: 1
Registriert: Samstag 23. August 2014, 00:05

Aktuell habe ich ein kleines Projekt, wofür ich leider seit neuerem mich mit Solve Media rumschlagen muss um weiterhin die gewohnten Operationen durchzuführen.
Soweit so gut, immerhin kein js-only Captcha Gedöns, womit ich in Python kaum eine Chance hätte.
Nichts desto trotz habe ich aktuell ein Problem, und zwar erkennt es das Captcha nicht richtig bzw. erhalte ich ein falsches(Löse es per Hand, nach 50 Versuchen sollte man davon ausgehen das captcha richtig zu haben)
Desweiteren war ich mir rein theoretisch sicher das richtige Captcha ausgelesen zu haben, da ich den ausgelesenen Link zum Captcha nur ein einziges Mal aufrufen kann, danach werde ich weitergeleitet auf eine Error Seite.

browser settings:

Code: Alles auswählen

	def _build_session(self):
		"""
		typical mechanize browser settings,
		using shared proxy vom proxy module
		"""
		cj = cookielib.LWPCookieJar()
		used_proxy = self._proxy.get_shared_proxy()
		self._logger.debug("used proxy: %s" % used_proxy)
		self._browser = mechanize.Browser()
		self._browser.addheaders = [('User-agent', self._get_random_useragent())]
		self._browser.set_cookiejar(cj)
		self._browser.set_proxies({"http": used_proxy})
		self._browser.set_handle_equiv(True)
		self._browser.set_handle_redirect(True)
		self._browser.set_handle_referer(True)
		self._browser.set_handle_robots(False)
		self._browser.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
function(hässlicher code, durch herumexperimentieren entstanden, sollte erst einmal funktionieren bevor ich ihn wieder "zurechtbiege"):

Code: Alles auswählen

# python has no javascript, so we need the noscript challenge
			p = re.compile('src="(http://api.solvemedia.com/papi/challenge.noscript[^\s]+)"')
			captcha_url = p.findall(response.read())[0]
			html_content = self._browser.open_novisit(captcha_url).read()
			if 'client error 117B' in html_content:
				# solve media checks for same IP/user agent in following 30 seconds
				self._proxy.trash_shared_proxy()
				self._build_session()
				return self.register()
			# looking for captcha img src
			pattern = re.compile('<img src="(/papi/media\?c=[^\s]+)"')
			captcha_urls = pattern.findall(html_content)
			if captcha_urls:
				# open_novisit to prevent deleting/refreshing of captcha
				captcha_url = captcha_urls[0]
				captcha = self._browser.open_novisit('http://api.solvemedia.com' + captcha_url).read()
				self._logger.debug('http://api.solvemedia.com' + captcha_url)
				open('captcha.gif', 'wb').write(captcha)

				cw = CaptchaWindow()
				if self.ocr_captcha:
					cs = captchaOCR.CaptchaSolver()
					cs.load_captcha('captcha')
					cs.smoothe_captcha()
					cs.resize_captcha()
					cs.convert_captcha_BMP()
					text, confidence = cs.solve_captcha()
					cs.clean()
					cw.solved_captcha = text
				else:
					cw.display_captcha('captcha.gif')
Ich parse die daten richtig laut den mit Tamper Data abgefangenen Beispieldaten, aber ich bekomme immer noch die Fehlermeldung, dass das Captcha falsch ist(handgelöst, sind relativ einfache Captchas, vermute nicht, dass ich das 20x selber falsch mache).

Irgendjemand eine Idee, warum das Captcha falsch ist, wo ich etwas vergesse oder was weiß ich-.-
Ich verzweifel seit 2-3 Tagen daran und habe keinen Ansatz mehr, was ich falsch machen könnte.

MfG Mampf
BlackJack

@Mampf: Vielleicht hat das ja einen Grund warum da ein Captcha vorgeschaltet wurde. ;-)

Ansonsten wäre ein minimales, lauffähiges Beispiel praktisch, mit dem man das Problem nachvollziehen kann. Die beiden, aus dem Zusammenhang gerissenen, Quelltextabschnitte sind wahrscheinlich nicht genug. Der Fehler könnte ja auch irgendwo in dem nicht gezeigten Teil liegen.
Antworten