Skip to content

Commit df577c3

Browse files
committed
refactor: modularize and restructure cynicmansion parser
1 parent 9b8c1bb commit df577c3

4 files changed

Lines changed: 199 additions & 105 deletions

File tree

‎cynicmansion/common.py‎

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
__author__ = "ipetrash"
5+
6+
7+
from urllib.parse import urljoin
8+
9+
# pip install requests==2.32.2
10+
import requests
11+
12+
# pip install beautifulsoup4==4.15.0
13+
from bs4 import BeautifulSoup
14+
15+
HOST: str = "https://cynicmansion.com"
16+
17+
session = requests.session()
18+
session.headers.update(
19+
{
20+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
21+
"Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
22+
}
23+
)
24+
25+
26+
def get_comics_url_by_id(comics_id: str | int) -> str:
27+
return f"{HOST}/{comics_id}/"
28+
29+
30+
def get_comics_info(
31+
comics_id__or__url: str | int,
32+
) -> tuple[str, str, str]: # TODO: dataclass
33+
url_comics: str
34+
if isinstance(comics_id__or__url, str) and comics_id__or__url.startswith("http"):
35+
url_comics = comics_id__or__url
36+
else:
37+
url_comics = get_comics_url_by_id(comics_id__or__url)
38+
39+
rs = session.get(url_comics)
40+
rs.raise_for_status()
41+
42+
root = BeautifulSoup(rs.content, "html.parser")
43+
44+
title = root.select_one(".comics_name").text.strip()
45+
46+
url_image = urljoin(rs.url, root.select_one(".comics_image > img")["src"])
47+
48+
return url_comics, title, url_image
49+
50+
51+
def get_last_commics_id() -> int:
52+
rs = session.get(HOST)
53+
rs.raise_for_status()
54+
55+
root = BeautifulSoup(rs.content, "html.parser")
56+
57+
# Example: <a href="/2184/">комментарии (1)</a> -> 2184
58+
return int(
59+
root.select_one(
60+
".comics_wrap:has(.comics_name) table > tr > td:first-child > a[href]"
61+
)["href"].replace("/", "")
62+
)
63+
64+
65+
def get_comics_image_url(comics_id__or__url: str | int) -> str:
66+
_, _, url_image = get_comics_info(comics_id__or__url)
67+
return url_image
68+
69+
70+
if __name__ == "__main__":
71+
last_commics_id = get_last_commics_id()
72+
print("last_commics_id:", last_commics_id)
73+
74+
print()
75+
comics_id = 1538
76+
print(f"About #{comics_id} comics")
77+
78+
url = get_comics_url_by_id(comics_id)
79+
print(comics_id, url)
80+
print()
81+
print(get_comics_info(comics_id))
82+
print(get_comics_info(url))
83+
print()
84+
print(get_comics_image_url(comics_id))
85+
print(get_comics_image_url(url))

‎cynicmansion/download_all.py‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
__author__ = "ipetrash"
5+
6+
7+
import time
8+
import re
9+
10+
from pathlib import Path
11+
12+
from common import session, get_last_commics_id, get_comics_info
13+
14+
CURRENT_DIR: Path = Path(__file__).resolve().parent
15+
DOWNLOADS_DIR: Path = CURRENT_DIR / "downloads"
16+
DOWNLOADS_DIR.mkdir(parents=True, exist_ok=True)
17+
18+
19+
def download_all(downloads_dir: Path = DOWNLOADS_DIR) -> None:
20+
comics_number = get_last_commics_id()
21+
for comics_id in range(1, comics_number + 1):
22+
url_comics, title, url_image = get_comics_info(comics_id)
23+
print(f"#{comics_id}. {title!r}: {url_image}")
24+
25+
clear_title: str = re.sub(r'[^\w\- ]', '', title)
26+
file_name: Path = downloads_dir / f"{comics_id} - {clear_title}.jpg"
27+
print(f"Saving to: {file_name}")
28+
29+
# TODO: Повторяет логику из get_random_comics.py
30+
with open(file_name, mode="wb") as f:
31+
rs = session.get(url_image)
32+
rs.raise_for_status()
33+
34+
f.write(rs.content)
35+
36+
print()
37+
38+
time.sleep(1)
39+
40+
41+
if __name__ == '__main__':
42+
download_all()

‎cynicmansion/get_random_comics.py‎

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
__author__ = "ipetrash"
5+
6+
7+
import random
8+
9+
from common import (
10+
session,
11+
get_comics_image_url,
12+
get_last_commics_id,
13+
get_comics_url_by_id,
14+
get_comics_info,
15+
)
16+
17+
18+
def get_random_comics_url() -> str:
19+
comics_number = get_last_commics_id()
20+
21+
random_comics_number = random.randint(1, comics_number)
22+
return get_comics_url_by_id(random_comics_number)
23+
24+
25+
def get_random_comics_image_url() -> str:
26+
url = get_random_comics_url()
27+
28+
return get_comics_image_url(url)
29+
30+
31+
def get_random_comics_info() -> tuple[str, str, str]:
32+
url = get_random_comics_url()
33+
34+
return get_comics_info(url)
35+
36+
37+
if __name__ == "__main__":
38+
url_comics = get_random_comics_url()
39+
print("url_comics:", url_comics)
40+
41+
url_image = get_comics_image_url(url_comics)
42+
print("url_image:", url_image)
43+
44+
comics_id = url_comics.split("/")[-2]
45+
46+
from pathlib import Path
47+
48+
current_dir: Path = Path(__file__).resolve().parent
49+
downloads_dir: Path = current_dir / "downloads"
50+
downloads_dir.mkdir(parents=True, exist_ok=True)
51+
52+
file_name = downloads_dir / f"{comics_id}.jpg"
53+
print(f"Saving to: {file_name}")
54+
55+
# TODO: Повторяет логику из download_all.py
56+
with open(file_name, mode="wb") as f:
57+
rs = session.get(url_image)
58+
rs.raise_for_status()
59+
60+
f.write(rs.content)
61+
62+
print()
63+
print("Random comics image:")
64+
print(get_random_comics_image_url())
65+
print(get_random_comics_image_url())
66+
print(get_random_comics_image_url())
67+
68+
print()
69+
print("Random comics image:")
70+
print(get_random_comics_info())
71+
print(get_random_comics_info())
72+
print(get_random_comics_info())

‎get_random_comics__cynicmansion.ru/main.py‎

Lines changed: 0 additions & 105 deletions
This file was deleted.

0 commit comments

Comments
 (0)