Slackbot 비망록(3) ~스크래핑&OCR편~
소개
파이썬을 배우기 위해 스크래핑을하고 싶습니다 ...
거기서, 오늘의 뉴스와 Steam의 인기 게임 top5를 스크래핑 해 표시하는 bot를 작성.
김에, bot로 OCR해 주었으면 하는 의뢰가 있거나 없었기 때문에, 그쪽도 작성.
환경
스크래핑
만든 bot
Slackbot을 만드는 방법
이전에 쓴 여기 문서를 참조하십시오.
Beautiful Soup 설치
다음 명령을 개발 환경에서 설치
pip install beautifulsoup4
요소를 얻는 방법
기본적으로 개발자 모드(F12)를 사용하여 요소를 추출합니다.
빨간색 사각형으로 둘러싸인 부분의 요소가
<span class="title"></span>
알겠습니다.
빨간색 사각형으로 둘러싸인 부분은 기본적으로 다음과 같은 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>
코드
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)
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 pyocr
pip 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을 할 때의 옵션입니다.
사이고에게
이 봇을 만든 후 시간이 걸렸습니다.
비늘 기억하는 부분이 있으므로, 또 한 회복습해 해설을 충실시키고 싶습니다.
참고
@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)
이 봇을 만든 후 시간이 걸렸습니다.
비늘 기억하는 부분이 있으므로, 또 한 회복습해 해설을 충실시키고 싶습니다.
참고
Reference
이 문제에 관하여(Slackbot 비망록(3) ~스크래핑&OCR편~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/usomaru/items/ff1646af4fd6f954f101텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)