Slackbot 비망록(3) ~스크래핑&OCR편~

16862 단어 파이썬slackbot

소개



파이썬을 배우기 위해 스크래핑을하고 싶습니다 ...
거기서, 오늘의 뉴스와 Steam의 인기 게임 top5를 스크래핑 해 표시하는 bot를 작성.
김에, bot로 OCR해 주었으면 하는 의뢰가 있거나 없었기 때문에, 그쪽도 작성.

환경


  • Windows10 64bit
  • python3

  • 스크래핑



    만든 bot


  • Steam 인기 게임 가르쳐 bot


  • 주요 뉴스 가르쳐 bot



  • Slackbot을 만드는 방법



    이전에 쓴 여기 문서를 참조하십시오.

    Beautiful Soup 설치



    다음 명령을 개발 환경에서 설치pip install beautifulsoup4

    요소를 얻는 방법



    기본적으로 개발자 모드(F12)를 사용하여 요소를 추출합니다.
  • steam의 경우



  • 빨간색 사각형으로 둘러싸인 부분의 요소가
    <span class="title"></span>
    

    알겠습니다.
  • yahoo 뉴스의 경우





  • 빨간색 사각형으로 둘러싸인 부분은 기본적으로 다음과 같은 Elements가 되어 있는 것을 알았습니다.
    <ur class="topics">
     <li class="topTpi">
      <div>
       <h1 class="ttl">
        <a href=></a>
       </h1>
      </div>
     </li>
     <li class="topTpi">
      <div>
       <p class="ttl">
        <a href=></a>
       </p>
      </div>
     </li>
     …以下省略
    </ur>
    

    코드


  • Steam 인기 게임 가르쳐 bot

  • my_mention.py
    @respond_to('Steamで人気のゲーム教えて')
    def steam_reply(message):
        import urllib.request, urllib.error
        from bs4 import BeautifulSoup
    
        #Steamから人気のゲーム情報をスクレイピング
        url = 'http://store.steampowered.com/search/?filter=topsellers&os=win'
        html = urllib.request.urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
    
        #span要素を取得
        span_tag = soup.select('.title')
    
        #ループをまわして配列にいれる
        for i in range(5):
            span_tag[i]
            #要素の文字列を取得
            span = span_tag[i].string
            messa = str(i+1) + '位' + span
            message.reply(messa)
    
  • 주요 뉴스 가르쳐 bot

  • my_mention.py
    @respond_to('主要のニュースを教えて')
    def news_reply(message):
        import urllib.request, urllib.error
        from bs4 import BeautifulSoup
        #yahooニュースをスクレイピング
        url = 'https://news.yahoo.co.jp/'
        html = urllib.request.urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
    
        #a要素を取得
        a_tag = soup.find('ul', attrs={'class' : 'topics'})
        tags = a_tag.find_all(attrs ={'class' : 'ttl'})
        for title in tags:
            message.reply(title.find('a').contents[0])
    

    코드 해설



    Steambot은 span 요소에서 클래스가 "title"인 것을 추출했습니다.
    자세한 요소의 취하는 방법은 여기 를 참고로 했습니다.
    이 방법 목록을 참고로 하면 무적인 생각이 듭니다.

    OCR



    만든 bot







    오야오야
    정확도는 그리 좋지 않을 수 있습니다.

    도구 설치



    tesseract-ocr-setup-3.02.02.exe 설치

    파이썬으로 가져오기 위해 다음 두 가지 명령을 실행합니다.pip install pyocrpip install Pillow

    프로그램 흐름



    OCR을 수행 할 때 아무래도 자신의 로컬 폴더에 이미지를 저장해야하기 때문에,

    Slack에 이미지 UP → 로컬 폴더에 이미지 저장 → OCR → 결과를 Slack에 게시

    라는 순서를 취하고 있습니다.

    코드



    "토큰"부분에서는 Slackbot에서 얻은 토큰을 입력합니다.
    Slackbot_Settings.py에서 설명한 것과 동일합니다.
    자세한 내용은 여기의 APItoken 부분을 참조하십시오.

    my_mention.py
    @listen_to('(.*)')
    def testo_func(message, params):
        from PIL import Image
        import sys
        import pyocr
        import pyocr.builders
        import requests
        import shutil
    
        tools = pyocr.get_available_tools()
    
        if len(tools) == 0:
            message.reply('OCRツールないよ')
        else:
            if 'file' in message.body:
    
                url = message.body['file']['url_private']
                flag = message.body['file']['filetype']
                tmpfile = './tmp.' + flag
    
                token = 'トークン'
                res = requests.get(url, headers={'Authorization': 'Bearer %s' % token}, stream=True)
    
                #ファイル書き込み
                with open(tmpfile, 'wb') as fp:
                    res.raw.decode_content = True
                    shutil.copyfileobj(res.raw,fp)
    
                #ここからOCRの処理
                tool = tools[0]
                langs = tool.get_available_languages()
                lang = langs[0]
    
                im1 = Image.open('tmp.png')
    
                txt = tool.image_to_string(
                    im1,
                    lang=lang,
                    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
                )
                message.reply(txt)
    

    코드 해설



    첫째, 이미지 다운로드 부분. 이미지를 저장하려면 requests를 사용하는 것 같습니다.
    url,flg로 설정하고 있는 값(message.body[~][~]부분)은 Slack의 filetype 를 봐 주시면과.
    파일 기입 부분에 대해서는 여기 의 사이트를 보고 작성했습니다.
    이어 OCR 부분.
    txt 부분에서 주로 OCR의 대상이나 언어, 옵션의 설정을 하고 있습니다.
    인수는 이미지(실행하는 디렉토리로부터의 상대 경로 or 절대 패스), 번역하고 싶은 언어, OCR을 할 때의 옵션입니다.

    사이고에게



    이 봇을 만든 후 시간이 걸렸습니다.
    비늘 기억하는 부분이 있으므로, 또 한 회복습해 해설을 충실시키고 싶습니다.

    참고


  • Python과 Beautiful Soup으로 스크래핑
  • Python3에서 PyOCR을 사용하여 Pacer의 공유 이미지에서 걸음 수 추출
  • slackbot으로 bot에 던진 이미지 다운로드
  • 좋은 웹페이지 즐겨찾기