컴퓨터/Python

pyside2 뉴스기사 목록 가져오기

풍경소리^^ 2020. 2. 4. 05:30

https://www.youtube.com/watch?v=6eUFSzLtnLU&list=RDLV6eUFSzLtnLU&start_radio=1&t=15s 

naver_news.py--------------------

import datetime
import sys
from selenium import webdriver
import webbrowser
from PySide2.QtGui import QStandardItemModel
from PySide2.QtWidgets import *


class Form(QWidget):
    def __init__(self):
        super(Form, self).__init__()

        self.setWindowTitle("뉴스기사 검색 프로그램")

        self.lst = []
        self.href = []
        self.page = 1
        cd = "chromedriver"
        chOpt = webdriver.ChromeOptions()
        chOpt.add_argument("headless")
        chOpt.add_argument("lang=ko_KR")
        # self.driver = webdriver.Chrome()
        self.driver = webdriver.Chrome(cd, options=chOpt)
        self.driver = webdriver.Chrome(cd, chrome_options=chOpt)

        self.lnKeyword = QLineEdit("파이썬")

        self.rdSort_0 = QRadioButton("관련도")
        self.rdSort_1 = QRadioButton("최신")
        self.rdSort_2 = QRadioButton("오래된")
        hbSort = QHBoxLayout()
        hbSort.addWidget(self.rdSort_0)
        hbSort.addWidget(self.rdSort_1)
        hbSort.addWidget(self.rdSort_2)
        grpSort = QGroupBox()
        grpSort.setLayout(hbSort)

        self.rdType_0 = QRadioButton("전체")
        self.rdType_1 = QRadioButton("포토")
        self.rdType_2 = QRadioButton("동영상")
        self.rdType_3 = QRadioButton("지면기사")
        hbType = QHBoxLayout()
        hbType.addWidget(self.rdType_0)
        hbType.addWidget(self.rdType_1)
        hbType.addWidget(self.rdType_2)
        hbType.addWidget(self.rdType_3)
        grpType = QGroupBox()
        grpType.setLayout(hbType)

        self.rdField_0 = QRadioButton("전체")
        self.rdField_1 = QRadioButton("제목만")
        hbFeild = QHBoxLayout()
        hbFeild.addWidget(self.rdField_0)
        hbFeild.addWidget(self.rdField_1)
        grpFeild = QGroupBox()
        grpFeild.setLayout(hbFeild)

        self.rdDate_0 = QRadioButton("전체")
        self.rdDate_1 = QRadioButton("1일")
        self.rdDate_2 = QRadioButton("1주")
        self.rdDate_3 = QRadioButton("1개월")
        self.rdDate_4 = QRadioButton("6개월")
        self.rdDate_5 = QRadioButton("1년")
        self.rdDate_6 = QRadioButton("선택")
        self.dtStart = QDateEdit(datetime.date.today())
        self.dtEnd = QDateEdit(datetime.date.today())
        hbDate_0 = QHBoxLayout()
        hbDate_0.addWidget(self.rdDate_0)
        hbDate_0.addWidget(self.rdDate_1)
        hbDate_0.addWidget(self.rdDate_2)
        hbDate_1 = QHBoxLayout()
        hbDate_1.addWidget(self.rdDate_3)
        hbDate_1.addWidget(self.rdDate_4)
        hbDate_1.addWidget(self.rdDate_5)
        frmDateCustom = QFormLayout()
        frmDateCustom.addRow("시작: ", self.dtStart)
        frmDateCustom.addRow("종료: ", self.dtEnd)
        hbDate_2 = QHBoxLayout()
        hbDate_2.addWidget(self.rdDate_6)
        hbDate_2.addLayout(frmDateCustom)
        vbDate = QVBoxLayout()
        vbDate.addLayout(hbDate_0)
        vbDate.addLayout(hbDate_1)
        vbDate.addLayout(hbDate_2)
        grpDate = QGroupBox()
        grpDate.setLayout(vbDate)

        frm = QFormLayout()
        frm.addRow("검색어:", self.lnKeyword)
        frm.addRow("정렬기준: ", grpSort)
        frm.addRow("기사유형: ", grpType)
        frm.addRow("검색범위: ", grpFeild)
        frm.addRow("검색기간: ", grpDate)

        self.model = QStandardItemModel(0, 1, self)
        self.model.setHorizontalHeaderLabels(["기사 제목"])
        self.table = QTableView()
        self.table.setModel(self.model)
        self.table.setColumnWidth(0, 450)
        self.table.setFixedSize(450, 350)
        self.btnSearch = QPushButton("검색")
        self.btnPrev = QPushButton("이전")
        self.btnNext = QPushButton("다음")

        hbPageCnt = QHBoxLayout()
        hbPageCnt.addWidget(self.btnSearch)
        hbPageCnt.addStretch()
        hbPageCnt.addWidget(self.btnPrev)
        hbPageCnt.addWidget(self.btnNext)
        vbList = QVBoxLayout()
        vbList.addLayout(hbPageCnt)
        vbList.addWidget(self.table)

        hbMain = QHBoxLayout()
        hbMain.addLayout(frm)
        hbMain.addLayout(vbList)

        self.setLayout(hbMain)

        self.rdSort_0.toggle()
        self.rdType_0.toggle()
        self.rdField_0.toggle()
        self.rdDate_0.toggle()

        self.btnSearch.clicked.connect(self.searchNews)
        self.btnPrev.clicked.connect(self.lstPrev)
        self.btnNext.clicked.connect(self.lstNext)
        self.table.clicked.connect(self.select)

    def lstNext(self):
        self.page += 10
        self.searchNews()

    def lstPrev(self):
        if self.page > 1:
            self.page -= 10
        self.searchNews()

    def closeEvent(self, QCloseEvent):
        self.driver.close()

    def searchNews(self):
        if self.sender().text() == "검색":
            self.page = 1
        if self.rdSort_0.isChecked():
            self.sort = "&sort=0"
        if self.rdSort_1.isChecked():
            self.sort = "&sort=1"
        if self.rdSort_2.isChecked():
            self.sort = "&sort=2"
        if self.rdType_0.isChecked():
            self.ntype = "&photo=0"
        if self.rdType_1.isChecked():
            self.ntype = "&photo=1"
        if self.rdType_2.isChecked():
            self.ntype = "&photo=2"
        if self.rdType_3.isChecked():
            self.ntype = "&photo=3"
        if self.rdField_0.isChecked():
            self.feild = "&field=0"
        if self.rdField_1.isChecked():
            self.feild = "&field=1"

        url = "https://search.naver.com/search.naver?where=news&query=" \
              + self.lnKeyword.text() + self.sort + self.ntype + self.feild + "&start={}".format(self.page)
        self.driver.get(url)
        # print(url)
        self.lst = self.driver.find_elements_by_class_name("news_tit")
        # print(self.lst)
        self.apply_lst()

    def apply_lst(self):
        self.href.clear()
        self.model.removeRows(0, self.model.rowCount())
        self.model.setRowCount(len(self.lst))
        self.model.setVerticalHeaderLabels(['' for i in range(len(self.lst))])
        for idx, pre in enumerate(self.lst):
            self.model.setData(self.model.index(idx, 0), pre.text)
            self.href.append(pre.get_attribute("href"))

    def select(self, e):
        webbrowser.open(self.href[e.row()])


app = QApplication([])
form = Form()
form.show()
sys.exit(app.exec_())