【问题标题】:Scrapy - simple captcha solving exampleScrapy - 简单的验证码解决示例
【发布时间】:2018-01-16 11:00:04
【问题描述】:

在网上寻找 Scrapy 来解决验证码时,我什至找不到好的示例。

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

有没有人有一个可行的例子来解决这个问题,或者至少以一种体面的方式配置了 Scrapy 来尝试解决它。​​

【问题讨论】:

    标签: python scrapy captcha


    【解决方案1】:

    解决验证码本身很容易使用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
    

    【讨论】:

    • @ErikTol 你必须安装 Tesseract 命令行工具。如果你在 Ubuntu/Debian 系统上,它在 tesseract-ocr 包中。
    • 我尝试使用 pytesseract 获取图像中的简单数字,纯文本,但它返回了错误的数字!甚至不是通常嘈杂或包含旋转字符的真正验证码。你们真的从这个图书馆得到了不错的结果吗?我发现它的 OCR 很弱,甚至比不上一个好的验证码求解器
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2013-03-04
      • 2022-12-03
      • 1970-01-01
      相关资源
      最近更新 更多