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)