123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- # -*- coding: utf-8 -*-
- """
- Created on 2025-05-14
- ---------
- @summary:
- ---------
- @author: Dzr
- """
- import feapder.setting as setting
- import feapder.utils.tools as tools
- from feapder.network.downloader.base import RenderDownloader
- from feapder.network.response import Response
- from feapder.utils.webdriver import WebDriverPool, DrissionPageDriver
- class DrissionPageDownloader(RenderDownloader):
- webdriver_pool: WebDriverPool = None
- @property
- def _webdriver_pool(self):
- if not self.__class__.webdriver_pool:
- self.__class__.webdriver_pool = WebDriverPool(
- **setting.DRISSIONPAGE, driver_cls=DrissionPageDriver
- )
- return self.__class__.webdriver_pool
- def download(self, request) -> Response:
- # 代理优先级 自定义 > 配置文件 > 随机
- if request.custom_proxies:
- proxy = request.get_proxy()
- elif setting.DRISSIONPAGE.get("proxy"):
- proxy = setting.DRISSIONPAGE.get("proxy")
- else:
- proxy = request.get_proxy()
- # user_agent优先级 自定义 > 配置文件 > 随机
- if request.custom_ua:
- user_agent = request.get_user_agent()
- elif setting.DRISSIONPAGE.get("user_agent"):
- user_agent = setting.DRISSIONPAGE.get("user_agent")
- else:
- user_agent = request.get_user_agent()
- cookies = request.get_cookies()
- url = request.url
- render_time = request.render_time or setting.DRISSIONPAGE.get("render_time")
- if request.get_params():
- url = tools.joint_url(url, request.get_params())
- driver: DrissionPageDriver = self._webdriver_pool.get(
- user_agent=user_agent, proxy=proxy
- )
- try:
- if cookies:
- driver.url = url
- driver.tab.set.cookies = cookies
- retry = setting.DRISSIONPAGE.get("retry")
- interval = setting.DRISSIONPAGE.get("interval")
- timeout = setting.DRISSIONPAGE.get("page_load")
- driver.tab.get(url, retry=retry, interval=interval, timeout=timeout)
- driver.wait_for_dom_load(timeout=render_time)
- if driver.tab.mode == "s":
- response = Response(driver.tab.response)
- else:
- cookies = driver.tab.cookies().as_dict()
- html = driver.tab.html
- response = Response.from_dict(
- {
- "url": driver.tab.url,
- "cookies": cookies,
- "_content": html.encode(),
- "status_code": 200,
- "elapsed": 666,
- "headers": {
- "User-Agent": driver.tab.user_agent,
- "Cookie": tools.cookies2str(cookies),
- },
- }
- )
- response.driver = driver
- response.browser = driver
- return response
- except Exception as e:
- self._webdriver_pool.remove(driver)
- request.del_proxy()
- raise e
- def close(self, driver):
- if driver:
- self._webdriver_pool.remove(driver)
- def put_back(self, driver):
- """
- 释放浏览器对象
- """
- self._webdriver_pool.put(driver)
- def close_all(self):
- """
- 关闭所有浏览器
- """
- self._webdriver_pool.close()
|