Scrapy-简单的验证码求解示例

Kev*_*n C 5 python captcha scrapy

在网上寻找Scrapy解决验证码时,我什至没有很好的例子可以入手。

我创建了一个非常基本的验证码页面。http://145.100.108.148/login3/

是否有人提供了可行的示例来解决此问题,或者至少以体面的方式配置了Scrapy来尝试解决此问题。

Tom*_*art 6

使用PillowPython Tesseract解决验证码本身很容易。困难的部分是了解如何处理Cookie(PHPSESSID)。这是您的案例的完整工作示例(使用Python 2):

# -*- coding: utf-8 -*-                                                         
import io                                                                       
import urllib2                                                                  

from PIL import Image                                                           
import pytesseract                                                              
import scrapy                                                                   


class CaptchaSpider(scrapy.Spider):                                             
    name = 'captcha'                                                            

    def start_requests(self):                                                   
        yield scrapy.Request('http://145.100.108.148/login3/',                  
                             cookies={'PHPSESSID': 'xyz'})                      

    def parse(self, response):                                                  
        img_url = response.urljoin(response.xpath('//img/@src').extract_first())

        url_opener = urllib2.build_opener()                                     
        url_opener.addheaders.append(('Cookie', 'PHPSESSID=xyz'))               
        img_bytes = url_opener.open(img_url).read()                             
        img = Image.open(io.BytesIO(img_bytes))                                 

        captcha = pytesseract.image_to_string(img)                              
        print 'Captcha solved:', captcha                                        

        return scrapy.FormRequest.from_response(                                
            response, formdata={'captcha': captcha},                            
            callback=self.after_captcha)                                        

    def after_captcha(self, response):                                          
        print 'Result:', response.body
Run Code Online (Sandbox Code Playgroud)

  • 我尝试使用 pytesseract 获取图像中的简单数字(纯文本),但它返回了错误的数字!甚至不是真正的验证码,它通常很吵或包含旋转字符。你们真的从这个库中得到了不错的结果吗?我发现它的 OCR 能力很弱,甚至比不上好的验证码求解器 (2认同)

Gan*_*rad 6

这是一个适用于直接图像的解决方案

best = ("https://my captcha url")
f = open('captcha.jpg','wb')
f.write(urllib.urlopen(best).read())
f.close()

import pytesseract
import cv2
import pytesseract
from PIL import Image

from pdf2image import convert_from_path
#img = Image.open('captcha.jpg')
image = cv2.imread('captcha.jpg')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

#gray = cv2.medianBlur(gray, 3)

filename = "{}.png".format("temp")
cv2.imwrite(filename, gray)
text = pytesseract.image_to_string(Image.open('temp.png'))
print text
Run Code Online (Sandbox Code Playgroud)