반응형

안녕하세요

 

오늘은 ComboBox와 select에 대해 이야기하겠습니다.

 

웹 크롤링을 하다 보면 

 

콤보박스

위와 같은 콤보박스를 마주치게 됩니다. 

 

 

 

from selenium.webdriver.support.ui import Select

 

select = Select(driver.find_element_by_id('locale_switch'))

 

select.select_by_index(0)

 

select.select_by_index(1)

 

select.select_by_index(2)

728x90
반응형
반응형

안녕하세요. 

 

오늘은 웹크롤링에 대해 글을 쓰도록 하겠습니다.

 

제가 웹크롤링을 공부해야지! 해서 공부한게 아니라 일을 돕고자 자동화를 찾아보다

 

Beautifulsoup과 Selenium을 알게 되었습니다.

 

제가 일을 돕기 위해 만드는 프로그램은 전화번호를 자동적으로 따오는 프로그램입니다.

 

굳이 웹크롤링을 공부할 때 자바 스크립트 같은 언어는 몰라도 됩니다.

 

Beautifulsoup는 홈페이지에 대한 내용을 불러오는 라이브러리이고,

 

Selenium은 자동화를 구현하는 라이브러리입니다.

 

이 두 가지 라이브러리만 안다면 구현하는데 웬만한 자동화프로그램은 만들 수 있다고 생각합니다.

 

제가 만든 매크로 프로그램도 웹기반 지식을 모르는 상태에서 3일을 거쳐 만들었습니다. 

 

동영상으로 보여드리고 싶지만, 프로그램 자체에 손님들의 전화번호등이 있어, 제가 모자이크를 다 처리한 상태에서 동영상을 올릴 생각입니다. 

 

 

저는 웹크롤링을 하기 위해 기본이 아닌, 제가 프로그램을 구현하면서 막혔던 부분을 작성하도록 하겠습니다. 

 

iframe : 웹페이지 안의 또다른 웹페이지

 

프로그램을 구현할 때 가장 어려웠던 문제 중 하나가 iframe 문제였습니다.

 

처음에 

[selenium]

driver.find_element_by_xpath() : 절대 경로

 

driver.find_element_by_id() : id값

 

driver.find_element_by_name() : 이름

 

driver.find_element_by_tag_name() : 태그 이름

 

어지간하지 않고서야 이 4가지 함수로 구현할 수 있습니다.

 

iframe은 4가지 방법으로 불가능합니다. 사용할 시

 

stale element reference: element is not attached to the page document selenium.common.exceptions.NoSuchElementException: 

Message: no such element: Unable to locate element

 

이런 무시무시한 에러를 보시게 될겁니다. 

 

iframe은 웹페이지 안에 또 다른 자식 웹페이지이기 때문에 다른 접근 방법을 사용해야 합니다.

 

우선 우리들은 자바스크립트를 열어보기 전에 iframe을 확인할 수 있습니다.

 

 

 

첫 번 째:

iframes = driver.find_elements_by_tag_name('iframe')

for i in iframes:

     print(i)

 

print를 찍어서 자신이 찾고자 하는 iframe 어디 있는지 확인합니다.

만약 자신이 원하는 값이 iframe[0]에 있다고 가정합시다.

iframe[0]으로 프레임으로 위치를 옮깁니다.

 

 

두 번 째:

[selenium]

driver.switch_to.frame(iframes[0])

 

이제 위치가 iframes[0]로 옮겨 졌다면, 

 

 

세 번 째:

[selenium]

html = driver.page_source

 

iframes[0]의 현주소를 받아옵니다.

 

 

네 번 째:

[beautifulsoup]

soup = BeautifulSoup(html, 'html.parser')

 

html을 파싱합니다.

 

 

다 섯 번 째:

[beautifulsoup]

soup.find()

soup.find_all()

 

이제 자신이 수행하고자 하는 함수를 구현합니다.

 

 

여 섯 번 째:

[selenium]

driver.switch_to.default_content()

 

다시 원래 프레임으로 돌아갑니다.

 

이런식으로 한다면 iframe을 처리할 수 있습니다.

 

다음 additem박스를 접근하는 select에 대해 글쓰도록 하겠습니다.

 

728x90
반응형
반응형

안녕하세요.

 

오늘은 파이썬으로 mat파일 불러오는 실습을 해보도록 하겠습니다. 

 

제가 matlab을 잘 사용하지는 못하지만, 데이터 사이언스에서 중요한 부분이 데이터 전처리 부분이기 때문에 

 

연습하고 있습니다. 

 

우선 mat파일 하나를 불러 오겠습니다.

 

 

5637 X 768 크기의 mat파일이 있습니다.

 

그리고 위의 표는 1 X 768의 부분을 plot 한 부분입니다. 

 

위 matlab을 python에서 똑같이 구현하겠습니다.

 

우선 mat을 불러오기 위한 scipy.io와 데이터 슬라이싱을 위한 numpy와 표를 그리기 위한 matplotlib를 임포트합니다.

 

 

 

 

 

1. mat파일을 불러오기 

 

import numpy as np
import matplotlib.pylab as plt
import scipy.io

mat_file_name =  "x_test_shuffled.mat"
mat_file = scipy.io.loadmat(mat_file_name)

 

loadmat으로 불러옵니다.

 

 

 

 

 

2. mat파일 타입

 

print(type(mat_file))

 

mat_file type

타입이 'dict'으로 찍히네요. 

 

dict의 속성은("index" : "data")이 있습니다. 그렇다면 좀 더 살펴보겠습니다.

 

for i in mat_file:
    print(i)

 

dict

mat파일을 살펴보니 인덱스가 네 개가 있습니다. 여기서 실제 데이터는 

 

"x_test_shuffled"라는 인덱스에 실제 matfile 데이터가 들어 있습니다.

 

 

 

 

3. mat파일 데이터 불러오기

 

mat_file_value = mat_file[mat_file_name[:-4]]

 

mat_file_name[:-4] 뒤에 .mat부분을 자릅니다.

 

 

 

 

4. mat파일의 사이즈 불러오기

 

print("size :",len(mat_file_value), "X", len(mat_file_value[0]))

 

 

5637 X 768

 

 

5. mat파일의 1 X 768 

(*주의사항 : matlab의 배열 인덱스 : 1부터 시작, python의 배열 인덱스 : 0부터 시작)

mat_file_x = []

for i in range(0, len(mat_file_value[0])):
      mat_file_x = np.append(mat_file_x, i)

 

 

 

6. mat파일 plot하기

 

plot을 하기 위해서는 x축과 y축의 갯수가 같아야 합니다.

 

print('x :',len(mat_file_x))
print('y :',len(mat_file_value[0]))

 

 

plt.title(mat_file_name[:-4])
plt.plot(mat_file_x, mat_file_value[0])
plt.show()

 

 

matlab 그래프와 python에서 그린 그림이 똑같이 나오네요.

 





import numpy as np
import matplotlib.pylab as plt
import scipy.io

mat_file_name = "x_test_shuffled.mat"
mat_file = scipy.io.loadmat(mat_file_name)

print(type(mat_file))

for i in mat_file:
    print(i)

mat_file_value = mat_file[mat_file_name[:-4]]

print("size :",len(mat_file_value), "X", len(mat_file_value[0]))   #x축

print(mat_file_name[:-4])

mat_file_x = []

for i in range(0, len(mat_file_value[0])):
    mat_file_x = np.append(mat_file_x, i)
print('x축 :',len(mat_file_x))
print('y축 :',len(mat_file_value[0]))

plt.title(mat_file_name[:-4])
plt.plot(mat_file_x, mat_file_value[0])
plt.show()





 

 

 

아직 많이 미숙하지만 좀 더 데이터를 다루는 연습을 해서 더 많은 글을 올리도록 하겠습니다.

728x90
반응형
반응형

안녕하세요.

 

PyQt5에 대해 알아보도록 하겠습니다. 오늘은 딱히 코딩은 없습니다.

 

기본틀

기본틀입니다. 제가 만든 프로그램에는 툴바가 없네요 ㅎ

 

https://doc.qt.io/qt-5/qmainwindow.html#details

 

QMainWindow Class | Qt Widgets 5.14.1

QMainWindow Class The QMainWindow class provides a main application window. More... Header: #include qmake: QT += widgets Inherits: QWidget Public Types enum DockOption { AnimatedDocks, AllowNestedDocks, AllowTabbedDocks, ForceTabbedDocks, VerticalTabs, Gr

doc.qt.io

pyqt5 레퍼런스입니다. 

 

Qt 메인 윈도우 프레임 워크
기본 창은 응용 프로그램의 사용자 인터페이스를 구축하기위한 프레임 워크를 제공합니다. Qt에는 기본 창 관리를위한 QMainWindow 및 관련 클래스가 있습니다. QMainWindow에는 QToolBars, QDockWidgets, QMenuBar 및 QStatusBar를 추가 할 수있는 자체 레이아웃이 있습니다. 레이아웃에는 모든 종류의 위젯이 차지할 수있는 중앙 영역이 있습니다. 

 

구글 번역 돌려보니 그렇다네요.

 

한 마디로 QMainWindow가 최상위 부모 클래스로 

 

그 안에 QCentralWidget, QDockWidget, QMainWindow 등등이 다 담겨 있습니다.

 

나중에 기회가 된다면 차근차근 설명하도록 하겠습니다. 

 

pyqt5로 무언가를 만들 때는 기본적으로 저는 이런 틀을 확실히 봐두는게 나을 것 같습니다. 

 

그 이후에 QLabel이나 QLineEdit 등을 실습해보는거죠.

 

전체적인 틀이 보일 때 무언가 만들고 싶으면은 어느정도 그림이 그려집니다. 

 

이 그림만 대충 이해하시면 적어도 기본적인거는 구현할 수 있다고 생각합니다.

 

그 외 부가적인 위젯들은 구글링하면 되는거니까요.

 

나중에 시간이 되면 천천히 pyqt5에 관해 하나씩 올리도록 하겠습니다. 

728x90
반응형
반응형

안녕하세요.

 

오늘은 PyQt5에 matplotlib를 연동하는 방법에 대해 이야기하겠습니다.

 

 

제가 이번에 만든 필터를 구현하면서 애먹었던 부분 중 하나였던게

 

pyqt5에 plt를 연동시키는 것이였습니다.

 

결국 답이 레퍼런스 찾아보거나, stackoverflow를 통해 방법을 알아냈습니다.

 

우선 pyqt5에 matplotlib를 연동시키는 방법을 설명하겠습니다. 

 

 

 

 

1. pyqt5에 plt 연동

 

 

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

 

 

우선 import 부분에 위에 문구를 추가해줍니다.

 


from matplotlib import pyplot as plt



self.fig = plt.figure(figsize=[4, 4])



a = plt.subplot(2, 1, 1)
a1 = plt.subplot(2, 1, 2)





 

plot이 두개 담겨있는 fig가 변수로 저장이 되어있겠죠?

 

사용법은 간단합니다.

 

위에 import 해준 라이브러리를 사용하기 위해 fig를 FigureCanvas에 담아주면 됩니다. 

 


from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib import pyplot as plt



self.fig = plt.figure(figsize=[4, 4])



a = plt.subplot(2, 1, 1)
a1 = plt.subplot(2, 1, 2)

self.canvas = FigureCanvas(self.fig)



 

정말 간단하죠?

 

 

 

2. pyqt5에 toolbar 연동

 

툴바

위의 사진들 많이 보셨죠?

 

self.fig.show() 하면 보이는 툴바입니다.

 

툴바는 plot을 만들어서 분석하기 위해 확대하교 움직이기 위해 사용합니다.

 

사용방법은 FigureCanvas랑 비슷합니다.

 




from matplotlib import pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar



self.fig = plt.figure(figsize=[4, 4])



a = plt.subplot(2, 1, 1)
a1 = plt.subplot(2, 1, 2)

self.canvas = FigureCanvas(self.fig)
self.toolbar = NavigationToolbar(self.canvas, self)


 

 

네. 비슷하기는 하지만 인자가 하나 더 들어가있죠?

 

 

첫번 째 인자로 우리가 방금 연동시킨 FigureCanvas가 들어가네요?

 

두번 째 인자로는 부모 인자를 넣으라 하는군요. 부모인자라 하면은 뭘까요?

 

우리들은 pyqt5를 사용하기 전에 우리들은 QWidget을 상속받아 사용합니다.

 

제 프로그램을 예시로

 

이런식으로 QWidget을 상속받고, self로 초기화 시킵니다. 

 

간단히 말해 parent 자리에 self를 넣어주면 됩니다.

 

 

 

3. Layout에 붙이기

 

2번까지 끝나셨으면 우리들에게는 두 개의 widget이 존재합니다.

 

self.canvas

self.toolbar

 

이제부터는 PyQt5의 기본 레이아웃 문제로 변하게 됩니다.

 

우선 저 같은 경우는 일단 Designer는 사용하지 않습니다. 

 

exe를 만들기 어려울뿐더러 하나 하나 코딩 한 줄 넣는게 저에겐 덜 헷갈려서 코딩으로 적겠습니다.

 

위에 그림처럼 위젯을 붙이기 위해서는 

 

수직으로 배치하는 QVBoxLayout (vertical)

 

lay = QVBoxLayout()

lay.addWidget(self.toolbar)
lay.addWidget(self.canvas)

 

짠!

 

만약 툴바를 아래로 내리고 싶으시면

 

lay = QVBoxLayout()

lay.addWidget(self.canvas)

lay.addWidget(self.toolbar)

짠!

 

두 위젯이 lay라는 레이아웃에 담겨 있습니다. 

 

이제 show를 해줍시다.

 

self.setLayout(lay)

 




from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib import pyplot as plt
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar



self.fig = plt.figure(figsize=[4, 4])



a = plt.subplot(2, 1, 1)
a1 = plt.subplot(2, 1, 2)

self.canvas = FigureCanvas(self.fig)
self.toolbar = NavigationToolbar(self.canvas, self)

lay = QVBoxLayout()
lay.addWidget(self.canvas)
lay.addWidget(self.toolbar)

self.setLayout(lay)


 

 

이런식으로 pyqt5에 matplot 연동시키시면 됩니다.

 

728x90
반응형

+ Recent posts