from requests_html import HTMLSession
import json
import requests
class WebScraper:
def __init__(self):
self.session = HTMLSession()
self.url = "http://kdtj.kipris.or.kr/kdtj/searchLogina.do?method=loginTM#page1"
self.results = {}
self.category_description = self.load_category_descriptions('categories.json')
def add_category_description(self, category_code):
"""주어진 카테고리 코드에 따라 설명을 반환합니다."""
description = self.category_description.get(category_code, "카테고리 설명을 찾을 수 없습니다.")
return description
def load_category_descriptions(self, filename):
"""JSON 파일에서 카테고리 설명을 로드합니다."""
with open(filename, 'r', encoding='utf-8') as file:
return json.load(file)
def navigate_to_page(self, url):
"""지정된 URL로 이동하고 페이지를 로드합니다."""
response = self.session.get(url)
response.html.render() # 필요 시 JavaScript 실행
print("Page loaded successfully.")
return response
def search_for_term(self, term):
"""검색어로 검색하고 결과를 수집합니다."""
response = self.navigate_to_page(self.url) # 로그인 페이지 로드
# await self.page.fill("#queryText", term)
# 검색어 입력과 폼 제출을 시뮬레이션
try:
form = response.html.find('form', containing='검색', first=True)
if form:
search_url = form.attrs.get('action')
if search_url:
data = {
'keywordTextarea': term, # form에서 요구하는 필드 이름에 맞추어야 함
}
search_response = self.session.post(search_url, data=data)
search_response.html.render()
return search_response
else:
print("폼의 action URL을 찾을 수 없습니다.")
else:
print("검색 폼을 찾을 수 없습니다.")
except Exception as e:
print(f"검색 실행 중 오류 발생: {e}")
# response.html.render(script=script, reload=False)
# # response.html.find('#keywordTextarea', first=True).fill(term)
# self.page.evaluate(f"document.querySelector('#keywordTextarea').value = '{term}';")
# print(f"검색어 입력: {term}")
# input_field = response.html.find('#keywordTextarea', first=True)
# script = f"document.querySelector('#keywordTextarea').value = '{term}';"
# response.html.page.evaluate(script) # JavaScript 실행
# search_button = response.html.find('.input_btn', first=True)
# search_button.click()
response.html.render(wait=10, timeout=20) # 결과 로드를 위해 대기
articles = response.html.find('form#listForm section.search_section article')
if not articles:
print("검색 결과가 없습니다.")
return None
# Store results in a structured format
for i, article in enumerate(articles, 1):
title = article.find('.title', first=True).text
status = article.find('.status', first=True).text
image_url = article.find('img', first=True).attrs.get('src', '')
self.results[f'result_{i}'] = {
'title': title,
'status': status,
'image_url': image_url
}
return self.results
def download_image(self, url, applno):
"""이미지를 다운로드하고 applno를 파일 이름으로 사용하여 저장합니다."""
response = requests.get(url) # 이미지 URL에 대한 요청
if response.status_code == 200:
filename = f"{applno}.jpeg"
with open(filename, 'wb') as file:
file.write(response.content)
print(f"이미지가 성공적으로 저장되었습니다: {filename}")
else:
print(f"이미지 다운로드 실패: HTTP {response.status_code}")
def fetch_image_data(self, url):
"""주어진 URL로부터 이미지 데이터를 직접 가져와 반환합니다."""
response = requests.get(url)
if response.status_code == 200:
return response.content
else:
print(f"이미지 다운로드 실패: HTTP {response.status_code}")
return None
def close_browser(self):
"""세션을 종료합니다."""
self.session.close()
# # 사용 예시
# scraper = WebScraper()
# results = scraper.search_for_term("특허")
# print(results)