Files
proxy-scraper-checker/proxy_scraper_checker/output.py
T

116 lines
4.0 KiB
Python
Raw Normal View History

2024-01-21 17:45:01 +00:00
from __future__ import annotations
import json
import logging
2024-02-08 09:12:13 +03:00
import stat
2024-01-21 17:45:01 +00:00
from shutil import rmtree
2024-07-09 03:08:30 +03:00
from typing import TYPE_CHECKING
2024-01-21 17:45:01 +00:00
import maxminddb
2024-11-22 14:32:29 +03:00
from proxy_scraper_checker import fs, sort
from proxy_scraper_checker.geodb import GEODB_PATH
from proxy_scraper_checker.null_context import NullContext
from proxy_scraper_checker.utils import IS_DOCKER
2024-01-21 17:45:01 +00:00
2024-06-03 14:08:42 +05:00
if TYPE_CHECKING:
2024-10-17 14:18:27 +03:00
from collections.abc import Sequence
2024-07-09 03:08:30 +03:00
2024-11-22 14:32:29 +03:00
from proxy_scraper_checker.proxy import Proxy
from proxy_scraper_checker.settings import Settings
from proxy_scraper_checker.storage import ProxyStorage
2024-06-03 14:08:42 +05:00
2024-11-06 15:05:34 +03:00
_logger = logging.getLogger(__name__)
2024-01-21 17:45:01 +00:00
def _create_proxy_list_str(
*, anonymous_only: bool, include_protocol: bool, proxies: Sequence[Proxy]
) -> str:
return "\n".join(
proxy.as_str(include_protocol=include_protocol)
for proxy in proxies
2024-02-04 12:24:12 +03:00
if not anonymous_only
or (proxy.exit_ip is not None and proxy.host != proxy.exit_ip)
2024-01-21 17:45:01 +00:00
)
def save_proxies(*, settings: Settings, storage: ProxyStorage) -> None:
if settings.output_json:
2024-02-08 09:12:13 +03:00
if settings.enable_geolocation:
fs.add_permission(GEODB_PATH, stat.S_IRUSR)
2024-06-03 14:08:42 +05:00
mmdb: maxminddb.Reader | NullContext = maxminddb.open_database(
GEODB_PATH
2024-02-08 09:12:13 +03:00
)
else:
mmdb = NullContext()
2024-01-21 17:45:01 +00:00
with mmdb as mmdb_reader:
proxy_dicts = [
{
"protocol": proxy.protocol.name.lower(),
"username": proxy.username,
"password": proxy.password,
"host": proxy.host,
"port": proxy.port,
"exit_ip": proxy.exit_ip,
2024-09-18 18:23:01 +03:00
"timeout": round(proxy.timeout, 2)
if proxy.timeout is not None
else None,
2024-01-21 17:45:01 +00:00
"geolocation": mmdb_reader.get(proxy.exit_ip)
2024-02-04 12:24:12 +03:00
if mmdb_reader is not None and proxy.exit_ip is not None
2024-01-21 17:45:01 +00:00
else None,
}
for proxy in sorted(storage, key=sort.timeout_sort_key)
]
2024-02-08 09:12:13 +03:00
for path, indent, separators in (
(settings.output_path / "proxies.json", None, (",", ":")),
(settings.output_path / "proxies_pretty.json", "\t", None),
):
path.unlink(missing_ok=True)
with path.open("w", encoding="utf-8") as f:
json.dump(
proxy_dicts,
f,
ensure_ascii=False,
indent=indent,
separators=separators,
)
2024-01-21 17:45:01 +00:00
if settings.output_txt:
2024-01-29 00:32:31 +03:00
sorted_proxies = sorted(storage, key=settings.sorting_key)
2024-01-21 17:45:01 +00:00
grouped_proxies = tuple(
(k, sorted(v, key=settings.sorting_key))
for k, v in storage.get_grouped().items()
)
for folder, anonymous_only in (
(settings.output_path / "proxies", False),
(settings.output_path / "proxies_anonymous", True),
):
try:
rmtree(folder)
except FileNotFoundError:
pass
2024-02-08 09:12:13 +03:00
folder.mkdir()
2024-01-21 17:45:01 +00:00
text = _create_proxy_list_str(
proxies=sorted_proxies,
anonymous_only=anonymous_only,
include_protocol=True,
)
(folder / "all.txt").write_text(text, encoding="utf-8")
for proto, proxies in grouped_proxies:
text = _create_proxy_list_str(
proxies=proxies,
anonymous_only=anonymous_only,
include_protocol=False,
)
(folder / f"{proto.name.lower()}.txt").write_text(
text, encoding="utf-8"
)
2024-02-01 07:24:26 +00:00
if IS_DOCKER:
2024-11-06 15:05:34 +03:00
_logger.info(
2024-02-01 07:24:26 +00:00
"Proxies have been saved to ./out (%s in container)",
settings.output_path.absolute(),
)
else:
2024-11-06 15:05:34 +03:00
_logger.info(
2024-02-01 07:24:26 +00:00
"Proxies have been saved to %s", settings.output_path.absolute()
)