Save proxies event after interruption

Fixes #316
This commit is contained in:
monosans
2024-09-18 18:23:01 +03:00
parent dac5280b4e
commit aa57dbfafc
5 changed files with 72 additions and 54 deletions
+56 -50
View File
@@ -114,60 +114,66 @@ async def main() -> None:
cfg = await read_config("config.toml")
console = Console()
configure_logging(console=console, debug=cfg["debug"])
async with ClientSession(
connector=TCPConnector(ssl=http.SSL_CONTEXT),
headers=http.HEADERS,
cookie_jar=http.get_cookie_jar(),
raise_for_status=True,
fallback_charset_resolver=http.fallback_charset_resolver,
) as session:
settings = await Settings.from_mapping(cfg, session=session)
storage = ProxyStorage(protocols=settings.sources)
with Progress(
TextColumn("[yellow]{task.fields[col1]}"),
TextColumn("[red]::"),
TextColumn("[green]{task.fields[col2]}"),
BarColumn(),
MofNCompleteColumn(),
console=console,
transient=True,
) as progress:
scrape = scraper.scrape_all(
progress=progress,
session=session,
settings=settings,
storage=storage,
)
await (
asyncio.gather(
geodb.download_geodb(progress=progress, session=session),
scrape,
should_save = False
try:
async with ClientSession(
connector=TCPConnector(ssl=http.SSL_CONTEXT),
headers=http.HEADERS,
cookie_jar=http.get_cookie_jar(),
raise_for_status=True,
fallback_charset_resolver=http.fallback_charset_resolver,
) as session:
settings = await Settings.from_mapping(cfg, session=session)
storage = ProxyStorage(protocols=settings.sources)
with Progress(
TextColumn("[yellow]{task.fields[col1]}"),
TextColumn("[red]::"),
TextColumn("[green]{task.fields[col2]}"),
BarColumn(),
MofNCompleteColumn(),
console=console,
transient=True,
) as progress:
scrape = scraper.scrape_all(
progress=progress,
session=session,
settings=settings,
storage=storage,
)
await (
asyncio.gather(
geodb.download_geodb(
progress=progress, session=session
),
scrape,
)
if settings.enable_geolocation
else scrape
)
await session.close()
count_before_checking = storage.get_count()
should_save = True
await checker.check_all(
settings=settings,
storage=storage,
progress=progress,
proxies_count=count_before_checking,
)
finally:
if should_save:
storage.remove_unchecked()
count_after_checking = storage.get_count()
console.print(
get_summary_table(
before=count_before_checking, after=count_after_checking
)
if settings.enable_geolocation
else scrape
)
await session.close()
count_before_checking = storage.get_count()
await checker.check_all(
settings=settings,
storage=storage,
progress=progress,
proxies_count=count_before_checking,
)
count_after_checking = storage.get_count()
console.print(
get_summary_table(
before=count_before_checking, after=count_after_checking
await output.save_proxies(storage=storage, settings=settings)
logger.info(
"Thank you for using https://github.com/monosans/proxy-scraper-checker"
)
)
await output.save_proxies(storage=storage, settings=settings)
logger.info(
"Thank you for using https://github.com/monosans/proxy-scraper-checker"
)
if __name__ == "__main__":
+3 -1
View File
@@ -53,7 +53,9 @@ def save_proxies(*, settings: Settings, storage: ProxyStorage) -> None:
"host": proxy.host,
"port": proxy.port,
"exit_ip": proxy.exit_ip,
"timeout": round(proxy.timeout, 2),
"timeout": round(proxy.timeout, 2)
if proxy.timeout is not None
else None,
"geolocation": mmdb_reader.get(proxy.exit_ip)
if mmdb_reader is not None and proxy.exit_ip is not None
else None,
+6 -2
View File
@@ -39,8 +39,12 @@ class Proxy:
port: int
username: str | None
password: str | None
timeout: float = attrs.field(init=False, eq=False)
exit_ip: str | None = attrs.field(init=False, eq=False)
timeout: float | None = attrs.field(default=None, init=False, eq=False)
exit_ip: str | None = attrs.field(default=None, init=False, eq=False)
@property
def is_checked(self) -> bool:
return self.timeout is not None
async def check(self, *, settings: Settings) -> None:
async with settings.semaphore:
+2 -1
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
import math
from typing import TYPE_CHECKING
from aiohttp_socks import ProxyType
@@ -19,4 +20,4 @@ def natural_sort_key(proxy: Proxy, /) -> tuple[int, ...]:
def timeout_sort_key(proxy: Proxy, /) -> float:
return proxy.timeout
return proxy.timeout if proxy.timeout is not None else math.inf
+5
View File
@@ -54,5 +54,10 @@ class ProxyStorage:
**Counter(proxy.protocol for proxy in self),
}
def remove_unchecked(self) -> None:
for p in self._proxies.copy():
if not p.is_checked:
self._proxies.remove(p)
def __iter__(self) -> Iterator[Proxy]:
return iter(self._proxies)