# file: tool/aiqicha_detail.py import time import json from tool.web_browser import WebBrowser from tool.aiqicha_login import AiqichaLoginManager # 导入登录管理器 from tool.aiqicha_detail_parser import AiqichaDetailParser # 导入解析器 class AiqichaDetailCrawler: def __init__(self, cookie_path="aiqicha_cookies.json"): self.browser = WebBrowser(cookie_path) self.browser_started = False self.login_manager = None # 添加登录管理器实例 def start_browser(self): """启动浏览器""" if not self.browser_started: try: self.browser.start_browser() # 初始化登录管理器 self.login_manager = AiqichaLoginManager(self.browser) # 加载cookies if not self.browser.load_cookies(): print("未找到有效Cookie") else: print("已加载Cookie") # 使用登录管理器检测登录状态 logined = self.login_manager.check_and_login() if logined: print("登录成功") else: print("登录失败") self.browser_started = True except Exception as e: print(f"启动浏览器失败: {e}") self.browser_started = False def close_browser(self): """关闭浏览器""" if self.browser_started: try: # 保存cookies self.browser.save_cookies() self.browser.close_browser() except Exception as e: print(f"关闭浏览器时出错: {e}") finally: self.browser_started = False def crawl_company_detail(self, url: str, refer_url: str = None): """ 爬取爱企查企业详情页数据 Args: url (str): 企业详情页URL,例如 https://aiqicha.baidu.com/company_detail_45719927199916 Returns: dict: 包含企业详细信息的字典 """ if not self.browser_started: self.start_browser() if not self.browser_started: print("浏览器未启动,无法执行爬取") return {} print(f'正在爬取企业详情: {url}') try: # 设置 Referer 头部模拟搜索引擎点击 if refer_url: self.browser.page.set_extra_http_headers({"Referer": refer_url}) # 访问页面 if self.browser.visit_page(url): # 增强页面加载检查 print("等待页面关键元素加载...") try: # 等待关键元素加载,增加超时时间 self.browser.page.wait_for_selector('.addr-enter-bg-ele', timeout=15000) print("关键元素已加载") # 额外等待一段时间确保页面完全加载 import time time.sleep(2) print("额外等待完成,页面应该已完全加载") except Exception as e: print(f"等待页面元素时出错: {e}") print("继续尝试解析页面内容...") # 提取基本信息 print("开始解析页面信息...") parser = AiqichaDetailParser(self.browser.page) company_info = parser.parse_company_info() print(f"成功爬取企业信息: {company_info['name']}") return company_info else: print("访问页面失败") return {} except Exception as e: print(f"爬取过程中出现错误: {e}") return {} def __enter__(self): """上下文管理器入口""" self.start_browser() return self def __exit__(self, exc_type, exc_val, exc_tb): """上下文管理器出口""" self.close_browser() # 使用示例: # 方法1: 手动管理浏览器生命周期 # crawler = QiqichaDetailCrawler() # crawler.start_browser() # detail = crawler.crawl_company_detail("https://aiqicha.baidu.com/company_detail_45719927199916") # crawler.close_browser() # 方法2: 使用上下文管理器 # with QiqichaDetailCrawler() as crawler: # detail = crawler.crawl_company_detail("https://aiqicha.baidu.com/company_detail_45719927199916") # print(detail)