kurly.py--------------------
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap
import pandas as pd # pip install pandas
# import win32com.client
import os
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
# self.window_width, self.window_height = 1000, 500
# self.resize(self.window_width, self.window_height)
##### layout_main ######
layout_main = QVBoxLayout(self)
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout(self)
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit(self)
self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
layout_1.addWidget(self.search_btn13)
self.search_btn13.clicked.connect(self.fn_searchBtn)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
layout_main.addWidget(self.table14)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
# def fn_loadData(self):
# self.table14.clear()
def fn_searchBtn(self):
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(2)
self.table14.setHorizontalHeaderLabels(["제목","주소"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(img_src))
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
kurly01.py--------------------
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
# self.window_width, self.window_height = 1000, 500
# self.resize(self.window_width, self.window_height)
self.href = []
##### layout_main ######
layout_main = QVBoxLayout(self)
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout(self)
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit(self)
self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
layout_1.addWidget(self.search_btn13)
self.search_btn13.clicked.connect(self.fn_searchBtn)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
webbrowser.open("https://www.kurly.com/" + self.href[e.row()].replace("http:///",""))
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(2)
self.table14.setHorizontalHeaderLabels(["제목","주소"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
kurly02.py--------------------
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
# self.window_width, self.window_height = 1000, 500
# self.resize(self.window_width, self.window_height)
self.href = []
##### layout_main ######
layout_main = QVBoxLayout(self)
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout(self)
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit(self)
self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
layout_1.addWidget(self.search_btn13)
self.search_btn13.clicked.connect(self.fn_searchBtn)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
# webbrowser.open(self.href[e.row()])
img_src = "https://www.kurly.com" + self.href[e.row()].replace("http:///","")
webbrowser.open(img_src)
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(2)
self.table14.setHorizontalHeaderLabels(["제목","주소"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
print(img_src)
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
이미지 저장 - 네이버가 자바스크립트 업데이트로 지금은 안됨
image_kimfl.py--------------------
from urllib.request import urlopen
from urllib.parse import quote_plus
from bs4 import BeautifulSoup
baseUrl = "https://search.naver.com/search.naver?where=image&query="
plusUrl = input('검색어를 입력하세요.') or "딸기"
url = baseUrl + quote_plus(plusUrl)
html = urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')
img = soup.find_all(class_='img')
n = 1
for i in img:
imgUrl = i['data-source']
with urlopen(imgUrl) as f:
with open('./img/' + plusUrl + str(n) + '.jpg', 'wb') as h:
img = f.read()
h.write(img)
n += 1
print(imgUrl)
print('다운로드 완료')
kurly03.py--------------------
import sys
from urllib.request import urlretrieve
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap, QIcon
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
self.window_width, self.window_height = 1000, 500
self.resize(self.window_width, self.window_height)
self.href = []
##### layout_main ######
layout_main = QVBoxLayout()
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout()
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit('군만두')
# self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
layout_1.addWidget(self.search_btn13)
self.search_btn13.clicked.connect(self.fn_searchBtn)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
# self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table14.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.setIconSize(QSize(300 ,200))
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
# webbrowser.open(self.href[e.row()])
img_src = "https://www.kurly.com" + self.href[e.row()].replace("http:///","")
webbrowser.open(img_src)
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(3)
self.table14.setHorizontalHeaderLabels(["제목","주소","품목사진"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
n = 1
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
# 이미지 저장
str_num = self.lineedit12.text() + str(n)
# print(str_num)
urlretrieve(img_src, f'./img/{str_num}.jpg')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
# self.table14.setItem(row_cnt, 2, QTableWidgetItem(img_src))
# 이미지 for
# my_file = r'.\img\군만두%d.jpg' % k
my_file = f'./img/{str_num}.jpg'
if os.path.isfile(my_file):
# self.table14.setItem(n, 1, QTableWidgetItem(my_file))
# icon = QIcon(r'.\images\number%d.jpg' % k)
icon = QIcon(my_file)
img_item = QTableWidgetItem()
img_item.setFlags(Qt.ItemIsEnabled)
img_item.setIcon(QIcon(icon))
#
self.table14.setItem(row_cnt, 2, img_item)
n += 1
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
kurly04.py--------------------
import sys
from urllib.request import urlretrieve
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap, QIcon
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.drawing.image import Image
from openpyxl.utils import get_column_letter
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import math
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
self.window_width, self.window_height = 1000, 500
self.resize(self.window_width, self.window_height)
self.href = []
##### layout_main ######
layout_main = QVBoxLayout()
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout()
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit('군만두')
# self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
layout_1.addWidget(self.search_btn13)
self.search_btn13.clicked.connect(self.fn_searchBtn)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
# self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table14.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.setIconSize(QSize(300 ,200))
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.button15 = QPushButton('&Excel', clicked=self.fn_exportToExcel)
layout_main.addWidget(self.button15)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
# webbrowser.open(self.href[e.row()])
img_src = "https://www.kurly.com" + self.href[e.row()].replace("http:///","")
webbrowser.open(img_src)
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(3)
self.table14.setHorizontalHeaderLabels(["제목","주소","품목사진"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
n = 1
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
# 이미지 저장
str_num = self.lineedit12.text() + str(n)
# print(str_num)
urlretrieve(img_src, f'./img/{str_num}.jpg')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
# self.table14.setItem(row_cnt, 2, QTableWidgetItem(img_src))
# 이미지 for
# my_file = r'.\img\군만두%d.jpg' % k
my_file = f'./img/{str_num}.jpg'
if os.path.isfile(my_file):
# self.table14.setItem(n, 1, QTableWidgetItem(my_file))
# icon = QIcon(r'.\images\number%d.jpg' % k)
icon = QIcon(my_file)
img_item = QTableWidgetItem()
img_item.setFlags(Qt.ItemIsEnabled)
img_item.setIcon(QIcon(icon))
#
self.table14.setItem(row_cnt, 2, img_item)
n += 1
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
def fn_exportToExcel(self):
file_path = ".\qtablewidgettoexcel.xlsx"
columnHeaders = []
# create column header list
for j in range(self.table14.model().columnCount()):
columnHeaders.append(self.table14.horizontalHeaderItem(j).text())
df = pd.DataFrame(columns=columnHeaders)
# create dataframe object recordset
for row in range(self.table14.rowCount()):
for col in range(self.table14.columnCount()):
df.at[row, columnHeaders[col]] = self.table14.item(row, col).text()
df.to_excel(file_path, index=False)
# 엑셀 이미지 삽입
wb = load_workbook(file_path)
ws = wb['Sheet1']
for n in range(self.table14.rowCount()):
# print(n+1)
str_num = self.lineedit12.text() + str(n+1)
img = Image(f'./img/{str_num}.jpg')
img.height = 100
img.width = 100
# ws.add_image(img, 'C2')
# num = 2
col_row = 'C' + str(n+1+1)
ws.add_image(img, col_row)
wb.save(file_path)
# [출처] #7 이미지 삽입하기: 파이썬 excel 자동화 openpyxl|작성자 일선스
col_abc = ["A","B","C","D","E","F"]
# set column width
for col in ws.columns:
max_length = 0
column = col[0].column
# print(column)
for cell in col:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
adjusted_width = (max_length + 2) * 1.2
# ws.column_dimensions[str(col_abc[column-1])].width = adjusted_width
ws.column_dimensions[get_column_letter(column)].width = adjusted_width
if column ==3:
ws.column_dimensions[str(col_abc[column-1])].width = 12
for row in range(self.table14.rowCount()):
ws.row_dimensions[row+1+1].height = 75
# # save xlsx file
wb.save(file_path)
print('Excel file exported')
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
https://stackoverflow.com/questions/13197574/openpyxl-adjust-column-width-size
openpyxl - adjust column width size
I have following script which is converting a CSV file to an XLSX file, but my column size is very narrow. Each time I have to drag them with mouse to read data. Does anybody know how to set column...
stackoverflow.com
kurly05.py--------------------
import sys
from urllib.request import urlretrieve
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap, QIcon
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Alignment
from openpyxl.drawing.image import Image
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import math
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
self.window_width, self.window_height = 1000, 500
self.resize(self.window_width, self.window_height)
self.href = []
##### layout_main ######
layout_main = QVBoxLayout()
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout()
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit('군만두')
# self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
layout_1.addWidget(self.search_btn13)
self.search_btn13.clicked.connect(self.fn_searchBtn)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
# self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table14.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.setIconSize(QSize(300 ,200))
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.button15 = QPushButton('&Excel', clicked=self.fn_exportToExcel)
layout_main.addWidget(self.button15)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
# webbrowser.open(self.href[e.row()])
img_src = "https://www.kurly.com" + self.href[e.row()].replace("http:///","")
webbrowser.open(img_src)
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(3)
self.table14.setHorizontalHeaderLabels(["제목","주소","품목사진"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
n = 1
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
# 이미지 저장
str_num = self.lineedit12.text() + str(n)
# print(str_num)
urlretrieve(img_src, f'./img/{str_num}.jpg')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
# self.table14.setItem(row_cnt, 2, QTableWidgetItem(img_src))
# 이미지 for
# my_file = r'.\img\군만두%d.jpg' % k
my_file = f'./img/{str_num}.jpg'
if os.path.isfile(my_file):
# self.table14.setItem(n, 1, QTableWidgetItem(my_file))
# icon = QIcon(r'.\images\number%d.jpg' % k)
icon = QIcon(my_file)
img_item = QTableWidgetItem()
img_item.setFlags(Qt.ItemIsEnabled)
img_item.setIcon(QIcon(icon))
#
self.table14.setItem(row_cnt, 2, img_item)
n += 1
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
def fn_exportToExcel(self):
file_path = ".\qtablewidgettoexcel.xlsx"
columnHeaders = []
# create column header list
for j in range(self.table14.model().columnCount()):
columnHeaders.append(self.table14.horizontalHeaderItem(j).text())
df = pd.DataFrame(columns=columnHeaders)
# create dataframe object recordset
for row in range(self.table14.rowCount()):
for col in range(self.table14.columnCount()):
df.at[row, columnHeaders[col]] = self.table14.item(row, col).text()
df.to_excel(file_path, index=False)
# 엑셀 이미지 삽입
wb = load_workbook(file_path)
ws = wb['Sheet1']
for n in range(self.table14.rowCount()):
# print(n+1)
str_num = self.lineedit12.text() + str(n+1)
img = Image(f'./img/{str_num}.jpg')
img.height = 100
img.width = 100
# ws.add_image(img, 'C2')
# num = 2
col_row = 'C' + str(n+1+1)
ws.add_image(img, col_row)
wb.save(file_path)
# [출처] #7 이미지 삽입하기: 파이썬 excel 자동화 openpyxl|작성자 일선스
col_abc = ["A","B","C","D","E","F"]
# set column width
for col in ws.columns:
max_length = 0
column = col[0].column
# print(column)
for cell in col:
cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=False)
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
adjusted_width = (max_length + 2) * 1.2
# ws.column_dimensions[str(col_abc[column-1])].width = adjusted_width
ws.column_dimensions[get_column_letter(column)].width = adjusted_width
# 셀주소.alignment = Alignment(horizontal='left', vertical='top', wrap_text=True)
# horizontal : 좌우 정렬 left, right, center, distribute
# vertical : 위아래 정렬 top, bottom, center, distribute
# wrap_text : 셀의 너비에 맞게 자동 줄바꿈
# \n 이 정상동작하려면 True를 설정해야 함
# 셀주소.alignment(shrink_to_fit=True) 칸에 맞게 폰트 축소
if column ==3:
# ws.column_dimensions[str(col_abc[column-1])].width = 12 # 이미지 열 너비
ws.column_dimensions[get_column_letter(column)].width = 12 # 이미지 열 너비
for row in range(self.table14.rowCount()):
ws.row_dimensions[row+1+1].height = 75 # 이미지 행 높이
# # save xlsx file
wb.save(file_path)
wb.close()
print('Excel file exported')
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
kurly06.py--------------------
import sys
from urllib.request import urlretrieve
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap, QIcon
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Alignment
from openpyxl.drawing.image import Image
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import math
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
self.window_width, self.window_height = 1000, 500
self.resize(self.window_width, self.window_height)
self.href = []
self.page = 1
##### layout_main ######
layout_main = QVBoxLayout()
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout()
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit('군만두')
# self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
self.btnPrev = QPushButton("이전")
self.btnNext = QPushButton("다음")
layout_1.addWidget(self.search_btn13)
layout_1.addStretch()
layout_1.addWidget(self.btnPrev)
layout_1.addWidget(self.btnNext)
self.search_btn13.clicked.connect(self.fn_searchBtn)
self.btnPrev.clicked.connect(self.fn_lstPrev)
self.btnNext.clicked.connect(self.fn_lstNext)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
# self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table14.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.setIconSize(QSize(300 ,200))
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.button15 = QPushButton('&Excel', clicked=self.fn_exportToExcel)
layout_main.addWidget(self.button15)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
def fn_lstNext(self):
self.page += 1
self.fn_searchBtn()
def fn_lstPrev(self):
if self.page > 1:
self.page -= 1
self.fn_searchBtn()
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
# webbrowser.open(self.href[e.row()])
img_src = "https://www.kurly.com" + self.href[e.row()].replace("http:///","")
webbrowser.open(img_src)
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
self.table14.setColumnCount(4)
self.table14.setHorizontalHeaderLabels(["제목","가격","주소","품목사진"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword + "&page={}".format(self.page)
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
n = 1
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
# 이미지 저장
str_num = self.lineedit12.text() + str(n)
# print(str_num)
urlretrieve(img_src, f'./img/{str_num}.jpg')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
price = item.find_elements(By.CLASS_NAME, "css-1qe668a")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(price))
self.table14.setItem(row_cnt, 2, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
# self.table14.setItem(row_cnt, 2, QTableWidgetItem(img_src))
# 이미지 for
# my_file = r'.\img\군만두%d.jpg' % k
my_file = f'./img/{str_num}.jpg'
if os.path.isfile(my_file):
# self.table14.setItem(n, 1, QTableWidgetItem(my_file))
# icon = QIcon(r'.\images\number%d.jpg' % k)
icon = QIcon(my_file)
img_item = QTableWidgetItem()
img_item.setFlags(Qt.ItemIsEnabled)
img_item.setIcon(QIcon(icon))
#
self.table14.setItem(row_cnt, 3, img_item)
n += 1
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
def fn_exportToExcel(self):
file_path = ".\qtablewidgettoexcel.xlsx"
columnHeaders = []
# create column header list
for j in range(self.table14.model().columnCount()):
columnHeaders.append(self.table14.horizontalHeaderItem(j).text())
df = pd.DataFrame(columns=columnHeaders)
# create dataframe object recordset
for row in range(self.table14.rowCount()):
for col in range(self.table14.columnCount()):
df.at[row, columnHeaders[col]] = self.table14.item(row, col).text()
df.to_excel(file_path, index=False)
# 엑셀 이미지 삽입
wb = load_workbook(file_path)
ws = wb['Sheet1']
for n in range(self.table14.rowCount()):
# print(n+1)
str_num = self.lineedit12.text() + str(n+1)
img = Image(f'./img/{str_num}.jpg')
img.height = 100
img.width = 100
# ws.add_image(img, 'C2')
# num = 2
col_row = 'D' + str(n+1+1)
ws.add_image(img, col_row)
wb.save(file_path)
# [출처] #7 이미지 삽입하기: 파이썬 excel 자동화 openpyxl|작성자 일선스
# col_abc = ["A","B","C","D","E","F"]
# set column width
for col in ws.columns:
max_length = 0
column = col[0].column
for cell in col:
if column != 2:
cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=False)
else:
cell.alignment = Alignment(horizontal='right', vertical='center', wrap_text=False)
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
ws.cell(row=1, column=column).alignment = Alignment(horizontal='center', vertical='center', wrap_text=False) # 제목행 정렬
adjusted_width = (max_length + 2) * 1.2
# ws.column_dimensions[str(col_abc[column-1])].width = adjusted_width
ws.column_dimensions[get_column_letter(column)].width = adjusted_width
# 셀주소.alignment = Alignment(horizontal='left', vertical='top', wrap_text=True)
# horizontal : 좌우 정렬 left, right, center, distribute
# vertical : 위아래 정렬 top, bottom, center, distribute
# wrap_text : 셀의 너비에 맞게 자동 줄바꿈
# \n 이 정상동작하려면 True를 설정해야 함
# 셀주소.alignment(shrink_to_fit=True) 칸에 맞게 폰트 축소
if column ==4:
# ws.column_dimensions[str(col_abc[column-1])].width = 12 # 이미지 열 너비
ws.column_dimensions[get_column_letter(column)].width = 12 # 이미지 열 너비
for row in range(self.table14.rowCount()):
ws.row_dimensions[row+1+1].height = 75 # 이미지 행 높이
# save xlsx file
wb.save(file_path)
wb.close()
print('Excel file exported')
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
kurly07.py--------------------주소제외
import sys
from urllib.request import urlretrieve
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, \
QHeaderView, QHBoxLayout, QVBoxLayout, QPushButton, QMessageBox, \
QFileDialog, QListWidget, QSizePolicy, QStyleFactory, \
QLineEdit, QLabel
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPixmap, QIcon
import pandas as pd # pip install pandas
# import win32com.client
import os
import webbrowser
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Alignment
from openpyxl.drawing.image import Image
from urllib.parse import urlsplit, quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import math
# import warnings
# warnings.simplefilter("ignore", UserWarning)
# sys.coinit_flags = 2
# import pywinauto
# import pygetwindow as gw
from PyQt5.QtGui import QTextCursor
class MyApp(QWidget):
# class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('마켓커리 상품 검색')
self.window_width, self.window_height = 1000, 500
self.resize(self.window_width, self.window_height)
self.href = []
self.page = 1
##### layout_main ######
layout_main = QVBoxLayout()
self.setLayout(layout_main)
##### layout_1 ######
layout_1 = QHBoxLayout()
label11 = QLabel("검색어를 입력하세요 :")
# label11.setText("검색어를 입력하세요 :")
layout_1.addWidget(label11)
self.lineedit12 = QLineEdit('군만두')
# self.lineedit12.setText("군만두")
# https://www.kurly.com/search?sword=%EA%B5%B0%EB%A7%8C%EB%91%90
self.base_url = "https://www.kurly.com/search?sword="
# keyword = input("검색어를 입력하세요 : ")
# self.lineedit12.setPlaceholderText("파이썬")
layout_1.addWidget(self.lineedit12)
self.search_btn13 = QPushButton("크롤링 시작")
# search_btn13.setText('검색')
self.btnPrev = QPushButton("이전")
self.btnNext = QPushButton("다음")
layout_1.addWidget(self.search_btn13)
layout_1.addStretch()
layout_1.addWidget(self.btnPrev)
layout_1.addWidget(self.btnNext)
self.search_btn13.clicked.connect(self.fn_searchBtn)
self.btnPrev.clicked.connect(self.fn_lstPrev)
self.btnNext.clicked.connect(self.fn_lstNext)
# s_open_btn.setMaximumWidth(300)
# self.s_listwidget = QListWidget(self)
# self.s_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.s_listwidget.setMaximumWidth(300)
# t_open_btn = QPushButton('대상 엑셀 파일 선택', self)
# t_open_btn.setMaximumWidth(300)
# t_open_btn.clicked.connect(self.fn_t_clickOpenBtn)
# self.t_listwidget = QListWidget(self)
# # self.t_listwidget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
# self.t_listwidget.setMaximumWidth(300)
# layout_1.addWidget(t_open_btn)
# self.label2 = QLabel()
# self.label2.setMaximumWidth(300)
# self.label2.setStyleSheet("color: #000000; border-style: solid; border-width: 2px; border-color: #FFC300; border-radius: 0px; ")
# layout_1.addWidget(self.label2)
# layout_1.addWidget(self.t_listwidget)
layout_main.addLayout(layout_1)
self.table14 = QTableWidget()
# self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table14.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
self.table14.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
# self.table14.setIconSize(QSize(300 ,200))
self.table14.setIconSize(QSize(120 ,80))
layout_main.addWidget(self.table14)
self.table14.clicked.connect(self.select)
self.button15 = QPushButton('&Excel', clicked=self.fn_exportToExcel)
layout_main.addWidget(self.button15)
self.row_cnt = 0
# 시그널 연결
# self.s_listwidget.itemDoubleClicked.connect(self.getItem_s)
# self.t_listwidget.itemDoubleClicked.connect(self.getItem_t)
def fn_lstNext(self):
self.page += 1
self.fn_searchBtn()
def fn_lstPrev(self):
if self.page > 1:
self.page -= 1
self.fn_searchBtn()
# def fn_loadData(self):
# self.table14.clear()
def select(self, e):
# webbrowser.open(self.href[e.row()])
img_src = "https://www.kurly.com" + self.href[e.row()].replace("http:///","")
webbrowser.open(img_src)
def fn_searchBtn(self):
self.href.clear()
self.table14.clear()
while self.table14.rowCount() > 0:
self.table14.removeRow(0)
# self.table14.setColumnCount(4)
# self.table14.setHorizontalHeaderLabels(["제목","가격","주소","품목사진"])
self.table14.setColumnCount(3)
self.table14.setHorizontalHeaderLabels(["제목","가격","품목사진"])
ls_contents2 = []
keyword = self.lineedit12.text()
search_url = self.base_url + keyword + "&page={}".format(self.page)
# search_url = self.base_url + quote(keyword)
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--start-maximized") # 최대 크기로 시작
options.add_argument("--headless") # 헤드리스 모드
options.add_argument("--disable-gpu") # 헤드리스 잘 안될 때 같이 사용
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(search_url)
time.sleep(3)
box_items = driver.find_elements(By.CLASS_NAME, "css-1xyd46f")
# for item in box_items:
n = 1
for idx, item in enumerate(box_items):
# # print(f"{idx} : {item.text}")
# # ls_contents2.append(idx) # 순번
# # ls_contents2.append(item.text) # 순번
a = item.find_elements(By.CLASS_NAME, "css-1mlybuj")
# a = item.find_elements(By.CSS_SELECTOR, ".e1c07x4810")
b = a[0].find_elements(By.CSS_SELECTOR, "div>img")[0]
img_src = b.get_attribute('src')
# 이미지 저장
str_num = self.lineedit12.text() + str(n)
# print(str_num)
urlretrieve(img_src, f'./img/{str_num}.jpg')
subject = item.find_elements(By.CLASS_NAME, "css-rklo75")[0].text
price = item.find_elements(By.CLASS_NAME, "css-1qe668a")[0].text
row_cnt = self.table14.rowCount() #전체 행의 수,기존에 행이 존재한다면 그 마지막 행의 뒤로 추가가 된다
# print(row_cnt,item.text)
self.table14.insertRow(row_cnt) #테이블위젯에 새로운 행을 추가해준다
# self.table14.setItem(row_cnt, 0, QTableWidgetItem(idx))
self.table14.setItem(row_cnt, 0, QTableWidgetItem(subject))
self.table14.setItem(row_cnt, 1, QTableWidgetItem(price))
# self.table14.setItem(row_cnt, 2, QTableWidgetItem(img_src))
self.href.append(item.get_attribute("href"))
# 이미지 for
# my_file = r'.\img\군만두%d.jpg' % k
my_file = f'./img/{str_num}.jpg'
if os.path.isfile(my_file):
# self.table14.setItem(n, 1, QTableWidgetItem(my_file))
# icon = QIcon(r'.\images\number%d.jpg' % k)
icon = QIcon(my_file)
img_item = QTableWidgetItem()
img_item.setFlags(Qt.ItemIsEnabled)
# img_item.setIcon(QIcon(icon))
img_item.setIcon(QIcon(icon))
#
# self.table14.setItem(row_cnt, 3, img_item)
self.table14.setItem(row_cnt, 2, img_item)
n += 1
header = self.table14.horizontalHeader()
# header.setSectionResizeMode(0, QHeaderView.Stretch)
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
driver.close()
def fn_exportToExcel(self):
file_path = ".\qtablewidgettoexcel.xlsx"
columnHeaders = []
# create column header list
for j in range(self.table14.model().columnCount()):
columnHeaders.append(self.table14.horizontalHeaderItem(j).text())
df = pd.DataFrame(columns=columnHeaders)
# create dataframe object recordset
for row in range(self.table14.rowCount()):
for col in range(self.table14.columnCount()):
df.at[row, columnHeaders[col]] = self.table14.item(row, col).text()
df.to_excel(file_path, index=False)
# 엑셀 이미지 삽입
wb = load_workbook(file_path)
ws = wb['Sheet1']
for n in range(self.table14.rowCount()):
# print(n+1)
str_num = self.lineedit12.text() + str(n+1)
img = Image(f'./img/{str_num}.jpg')
img.height = 100
img.width = 100
# ws.add_image(img, 'C2')
# num = 2
# col_row = 'D' + str(n+1+1)
col_row = 'C' + str(n+1+1)
ws.add_image(img, col_row)
wb.save(file_path)
# [출처] #7 이미지 삽입하기: 파이썬 excel 자동화 openpyxl|작성자 일선스
# col_abc = ["A","B","C","D","E","F"]
# set column width
for col in ws.columns:
max_length = 0
column = col[0].column
for cell in col:
if column != 2:
cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=False)
else:
cell.alignment = Alignment(horizontal='right', vertical='center', wrap_text=False)
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
ws.cell(row=1, column=column).alignment = Alignment(horizontal='center', vertical='center', wrap_text=False) # 제목행 정렬
adjusted_width = (max_length + 2) * 1.2
# ws.column_dimensions[str(col_abc[column-1])].width = adjusted_width
ws.column_dimensions[get_column_letter(column)].width = adjusted_width
# 셀주소.alignment = Alignment(horizontal='left', vertical='top', wrap_text=True)
# horizontal : 좌우 정렬 left, right, center, distribute
# vertical : 위아래 정렬 top, bottom, center, distribute
# wrap_text : 셀의 너비에 맞게 자동 줄바꿈
# \n 이 정상동작하려면 True를 설정해야 함
# 셀주소.alignment(shrink_to_fit=True) 칸에 맞게 폰트 축소
# if column ==4:
if column ==3:
# ws.column_dimensions[str(col_abc[column-1])].width = 12 # 이미지 열 너비
ws.column_dimensions[get_column_letter(column)].width = 12 # 이미지 열 너비
for row in range(self.table14.rowCount()):
ws.row_dimensions[row+1+1].height = 75 # 이미지 행 높이
# save xlsx file
wb.save(file_path)
wb.close()
QMessageBox.information(self, "엑셀 저장 하기", "엑셀 저장 완료!!!")
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet('''
QWidget {
font-size: 17px;
}
QHeaderView::section::Horizontal {
background-color: rgb(191, 255, 0);
}
''')
myApp = MyApp()
myApp.show()
try:
sys.exit(app.exec())
except SystemExit:
print('프로그램 종료...')
kurly08.py--------------------
'컴퓨터 > Python_selenium' 카테고리의 다른 글
Python selenium 따라하기 kimfl (0) | 2022.08.20 |
---|---|
Python Selenium (Action Chains) (0) | 2022.08.20 |
Python Selenium을 함수에서 사용시 자동으로 꺼지지 않게 하기. 자동종료방지 (0) | 2022.08.20 |