결과물
미해결 & 향후 보완할 것
코드
from bs4 import BeautifulSoup
import requests
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import QDate
import re
form_class = uic.loadUiType("myCrawler.ui")[0] #UIClass를 만들어주는구나!
class MyWindow(QDialog, form_class): #윈도우 만들어주기 + 조작 정의
def __init__(self):
super().__init__()
self.setupUi(self)
#[버튼] 기능 정의
self.crawlStart.clicked.connect(self.clicked_crawlStart) #[버튼] 크롤링 시작
self.setToday.clicked.connect(self.clicked_setToday) # [버튼] dateEdit 칸을 오늘 날짜로 변경
#self.articleTable.clicked.connect(self.clicked_articleTable) # [버튼] articleTable의 링크 열을 눌렀을 때, 해당 링크로 연결 (미구현)
#def clicked_articleTable(self): # [버튼] articleTable의 링크 열을 눌렀을 때, 해당 링크로 연결 (미구현)
#if item.column() == 1:
#webbrowser.open('www.google.com')
def clicked_setToday(self):
self.dateEdit.setDate(QDate.currentDate())
def clicked_crawlStart(self): #크롤링하고, 그 결과를 articleList에 등록해준다.
#-------------------------------------------------------------------------------------
#날짜를 구한다.
date = self.dateEdit.date().toString('yy-MM-dd')
#-------------------------------------------------------------------------------------
# soup하는데, 긁을 수 있는 기사가 나오거나 정해진 페이지까지 탐색을 완료할 때까지 계속 페이지 넘긴다.
#문제는, 하루에 업로드된 기사 전체를 알 수는 없다는 것(페이지에 걸친 거라던가...). 이건 개선 필요한 사항으로 냅두자.
#maxSearchPage도 ui에서 컨트롤 가능하게 빼야 제 역할 할 듯
Articles_Today = []
searchPage = 1
maxSearchPage = 50
try_now = 0
try_previous = 0
#오늘자 아티클을 1개라도 찾았고, 다음 페이지에서 아무 것도 발견하지 못한다면.
while searchPage <= maxSearchPage:
soup = Crawling.getSoup(f"http://www.inven.co.kr/webzine/news/?page={searchPage}")
Articles_Today = Crawling.InvenFilter(soup, date)
try_now = len(Articles_Today)
#발견된 아티클이 1개라도 존재하고, 발견된 아티클의 이전과 현재 갯수가 동일하면 멈춘다. (1페이지 넘어서까지 걸쳐 있는 경우를 커버)
if len(Articles_Today)>0 and try_now == try_previous:
break
else:
try_previous = len(Articles_Today)
searchPage = searchPage + 1
#-------------------------------------------------------------------------------------
#articleTable에 등록
#articleTable의 Row 조정
self.articleTable.setRowCount(len(Articles_Today))
#Row를 1행씩 올려가면서 데이터 채우기
currentRow = 0
for article in Articles_Today: #QtableWidgetItem으로 변환
article_name = QTableWidgetItem(article[0])
article_link = QTableWidgetItem(article[1])
self.articleTable.setItem(currentRow, 0,article_name)
self.articleTable.setItem(currentRow, 1, article_link)
currentRow += 1
class Crawling(): #크롤링 관련 함수들을 모아줌.
def getSoup(url): #페이지 URL에 접속하여, html 코드를 받아온다.
source = requests.get(url)
soup = BeautifulSoup(source.text, 'html.parser')
return soup
#인벤에서의 오늘자 기사만 추출하기
def InvenFilter(soup, date):
global Articles_Today
Articles_All = soup.find('div', class_='webzineNewsList tableType2').find_all('div', class_='content')
for article in Articles_All:
article_info = article.find('span', class_= 'info').getText()
if date in article_info:
name = article.find('a').getText()
href = article.find('a')["href"]
Articles_Today.append((name, href))
return Articles_Today
#전체 뉴스에서 nnnn-nn-nn일자 기사만 긁어옴
if __name__ == "__main__":
Articles_Today = []
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
app.exec_()
[Python] csv를 1개의 엑셀 파일로 합치기 (0) | 2022.06.06 |
---|---|
[Python] PyQt로 UI 출력하기 (0) | 2020.07.22 |
[VBA] Json 형식의 문자열을 데이터테이블화 (0) | 2019.12.20 |
[VBA] 엑셀 파일 열지 않고 데이터 가져오기 (0) | 2019.12.06 |
댓글 영역