pars-hitmotop 0.1.0__tar.gz → 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pars_hitmotop-1.0.0/PKG-INFO +116 -0
- {pars-hitmotop-0.1.0 → pars_hitmotop-1.0.0}/README.md +51 -20
- pars_hitmotop-1.0.0/pars_hitmotop.egg-info/PKG-INFO +116 -0
- pars_hitmotop-1.0.0/pars_hitmotop.egg-info/SOURCES.txt +13 -0
- pars_hitmotop-1.0.0/pars_hitmotop.egg-info/requires.txt +4 -0
- pars_hitmotop-1.0.0/pars_hitmotop.egg-info/top_level.txt +1 -0
- pars_hitmotop-1.0.0/parse_hitmos/__init__.py +6 -0
- pars_hitmotop-1.0.0/parse_hitmos/entered_tracks.py +125 -0
- pars_hitmotop-1.0.0/parse_hitmos/excepts.py +75 -0
- pars_hitmotop-1.0.0/parse_hitmos/how_to_use.py +152 -0
- pars_hitmotop-1.0.0/parse_hitmos/rating_tracks_count.py +113 -0
- pars_hitmotop-1.0.0/parse_hitmos/rating_tracks_page.py +172 -0
- pars_hitmotop-1.0.0/setup.py +33 -0
- pars-hitmotop-0.1.0/PKG-INFO +0 -65
- pars-hitmotop-0.1.0/pars_hitmotop.egg-info/PKG-INFO +0 -65
- pars-hitmotop-0.1.0/pars_hitmotop.egg-info/SOURCES.txt +0 -7
- pars-hitmotop-0.1.0/pars_hitmotop.egg-info/requires.txt +0 -1
- pars-hitmotop-0.1.0/pars_hitmotop.egg-info/top_level.txt +0 -1
- pars-hitmotop-0.1.0/setup.py +0 -23
- {pars-hitmotop-0.1.0 → pars_hitmotop-1.0.0}/pars_hitmotop.egg-info/dependency_links.txt +0 -0
- {pars-hitmotop-0.1.0 → pars_hitmotop-1.0.0}/setup.cfg +0 -0
@@ -0,0 +1,116 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: pars_hitmotop
|
3
|
+
Version: 1.0.0
|
4
|
+
Home-page: https://github.com/JoyHubN/pars_hitmos
|
5
|
+
Download-URL: https://github.com/JoyHubN/pars_hitmos/arhive/v1.0.0.zip
|
6
|
+
Author: Joy_079
|
7
|
+
Author-email: Prufu@yandex.ru
|
8
|
+
Classifier: Programming Language :: Python
|
9
|
+
Classifier: Programming Language :: Python :: 3.8
|
10
|
+
Classifier: Programming Language :: Python :: 3.9
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
13
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
14
|
+
Description-Content-Type: text/markdown
|
15
|
+
Requires-Dist: beautifulsoup4==4.13.4
|
16
|
+
Requires-Dist: fake-useragent==2.2.0
|
17
|
+
Requires-Dist: requests==2.32.4
|
18
|
+
Requires-Dist: tenacity==9.1.2
|
19
|
+
Dynamic: author
|
20
|
+
Dynamic: author-email
|
21
|
+
Dynamic: classifier
|
22
|
+
Dynamic: description
|
23
|
+
Dynamic: description-content-type
|
24
|
+
Dynamic: download-url
|
25
|
+
Dynamic: home-page
|
26
|
+
Dynamic: requires-dist
|
27
|
+
|
28
|
+
# Оглавление
|
29
|
+
0. [Оглавление](https://github.com/PY079/pars_hitmotop#оглавление)
|
30
|
+
1. [Что именно парсит?](https://github.com/PY079/pars_hitmotop/blob/main/README.md#что-именно-парсит)
|
31
|
+
2. [Как использовать модуль entered_tracks](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-entered_tracks)
|
32
|
+
3. [Как использовать модуль rating_tracks_count](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-rating_tracks_count)
|
33
|
+
4. [Как использовать модуль rating_tracks_page](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-rating_tracks_page)
|
34
|
+
5. [Что можно достать при запросе?](https://github.com/PY079/pars_hitmotop/blob/main/README.md#что-можно-достать-при-запросе)
|
35
|
+
____
|
36
|
+
Этот проект парсит [музыкальный сайт](https://hitmos.me/)
|
37
|
+
____
|
38
|
+
# Что именно парсит?
|
39
|
+
1. [Рейтинговые треки](https://hitmos.me/songs/top-rated) от 1 до 48;
|
40
|
+
2. Тоже [рейтинговые треки](https://hitmos.me/songs/top-rated) но можно выбрать количество страниц, с которых будет произведен парсинг;
|
41
|
+
3. Треки введенные пользователем. Парсит от 1 трека до конечной страницы (на одной странице 48 треков)
|
42
|
+
____
|
43
|
+
## Как использовать модуль *entered_tracks*
|
44
|
+
```
|
45
|
+
from parse_hitmos.entered_tracks import EnteredTrack
|
46
|
+
result = EnteredTrack('linkin park',10)
|
47
|
+
```
|
48
|
+
1 аргументом (music_name) передается название песни или автора. 2 Аргументом (count) передается количество треков
|
49
|
+
____
|
50
|
+
## Как использовать модуль *rating_tracks_count*
|
51
|
+
```
|
52
|
+
from parse_hitmos.rating_tracks_count import RatingCount
|
53
|
+
result = RatingCount(10)
|
54
|
+
```
|
55
|
+
1 аргументом (count) передается количество песен
|
56
|
+
____
|
57
|
+
## Как использовать модуль *rating_tracks_page*
|
58
|
+
```
|
59
|
+
from parse_hitmos.rating_tracks_page import RatingPage
|
60
|
+
result = RatingPage(10)
|
61
|
+
```
|
62
|
+
1 аргументом (count) передается количество страниц (max 11)
|
63
|
+
____
|
64
|
+
# Что можно достать при запросе?
|
65
|
+
Все возвращается в виде list
|
66
|
+
| Метод | Описание |
|
67
|
+
|----------------|:---------|
|
68
|
+
| result.get_author | Получить автора трека|
|
69
|
+
|result.get_title| Получить название трека|
|
70
|
+
|result.get_url_down|Получить ссылку на скачивание трека|
|
71
|
+
|result.direct_download_link|Получить прямую ссылку на скачивание трека|
|
72
|
+
|result.get_duration|Получить продолжительность трека|
|
73
|
+
|result.get_picture_url|Получить ссылку на обложку трека|
|
74
|
+
|result.get_url_track|Получить ссылку трек|
|
75
|
+
|result.get_all|Получить все данные в виде словаря|
|
76
|
+
|result.get_author_title|Получить лист в виде автор — название|
|
77
|
+
|
78
|
+
____
|
79
|
+
# Сколько времени понадобиться для получения всех нужных данных с сайта
|
80
|
+
## Рейтинговые треки (по страницам)
|
81
|
+
|
82
|
+
| Время | Прямые ссылки | Кол-во треков |
|
83
|
+
|:---------|:---------|:---------|
|
84
|
+
| 5с — 6с | `False` | 11 страниц (~528) |
|
85
|
+
| 5 — 6с | `False` | 10 страниц (~480) |
|
86
|
+
| 4 — 6с | `False` | 9 страниц (~432) |
|
87
|
+
| 4 — 6с | `False` | 8 страниц (~384) |
|
88
|
+
| 4 — 5с | `False` | 7 страниц (~336) |
|
89
|
+
| 3 — 4с | `False` | 6 страниц (~288) |
|
90
|
+
| 3 — 4с | `False` | 5 страниц (~240) |
|
91
|
+
| 2 — 4с | `False` | 4 страниц (~192) |
|
92
|
+
| 2 — 3с | `False` | 3 страниц (~144) |
|
93
|
+
| 1 — 2с | `False` | 2 страниц (~96) |
|
94
|
+
| 1с — 2c | `False` | 1 страниц (~48) |
|
95
|
+
| 126с — 223с (~2.1м — ~4м) | `True` | 11 страниц (~528) |
|
96
|
+
| 116с — 139с (~2м) | `True` | 10 страниц (~480) |
|
97
|
+
| 106с — 131с (~1.6м — 2м) | `True` | 9 страниц (~432) |
|
98
|
+
| 97с — 185с (~1.6м — 2м) | `True` | 8 страниц (~384) |
|
99
|
+
| 76с — 94с (~1.2м — ~1.5c) | `True` | 7 страниц (~336) |
|
100
|
+
| 66с — 74с (~1м — ~1.23) | `True` | 6 страниц (~288) |
|
101
|
+
| 54с — 61с | `True` | 5 страниц (~240) |
|
102
|
+
| 43с — 49с | `True` | 4 страниц (~192) |
|
103
|
+
| 32с — 49с | `True` | 3 страниц (~144) |
|
104
|
+
| 25с — 27с | `True` | 2 страниц (~96) |
|
105
|
+
| 14с — 20с | `True` | 1 страниц (~48) |
|
106
|
+
|
107
|
+
|
108
|
+
## Рейтинговые треки и введенные треки (по трекам)
|
109
|
+
| Время | Прямые ссылки | Кол-во треков |
|
110
|
+
|:---------|:---------|:---------|
|
111
|
+
| 1с — ~3с | `False` | 48 |
|
112
|
+
| 1с — 2с | `False` | 1 |
|
113
|
+
| 23с — 28с | `True` | 48 |
|
114
|
+
| 3с — 4с | `True` | 1 |
|
115
|
+
|
116
|
+
____
|
@@ -1,17 +1,10 @@
|
|
1
|
-
# pars-hitmontop теперь называется pars-hitmos
|
2
|
-
|
3
|
-
Этот пакет был переименован. Вместо этого используйте `pip install pars-hitmos`.
|
4
|
-
|
5
|
-
Новый пакет: https://pypi.org/project/pars-hitmos/
|
6
|
-
|
7
|
-
|
8
1
|
# Оглавление
|
9
|
-
0. [Оглавление](https://github.com/
|
10
|
-
1. [Что именно парсит?](https://github.com/
|
11
|
-
2. [Как использовать модуль entered_tracks](https://github.com/
|
12
|
-
3. [Как использовать модуль rating_tracks_count](https://github.com/
|
13
|
-
4. [Как использовать модуль rating_tracks_page](https://github.com/
|
14
|
-
5. [Что можно достать при запросе?](https://github.com/
|
2
|
+
0. [Оглавление](https://github.com/PY079/pars_hitmotop#оглавление)
|
3
|
+
1. [Что именно парсит?](https://github.com/PY079/pars_hitmotop/blob/main/README.md#что-именно-парсит)
|
4
|
+
2. [Как использовать модуль entered_tracks](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-entered_tracks)
|
5
|
+
3. [Как использовать модуль rating_tracks_count](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-rating_tracks_count)
|
6
|
+
4. [Как использовать модуль rating_tracks_page](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-rating_tracks_page)
|
7
|
+
5. [Что можно достать при запросе?](https://github.com/PY079/pars_hitmotop/blob/main/README.md#что-можно-достать-при-запросе)
|
15
8
|
____
|
16
9
|
Этот проект парсит [музыкальный сайт](https://hitmos.me/)
|
17
10
|
____
|
@@ -22,22 +15,22 @@ ____
|
|
22
15
|
____
|
23
16
|
## Как использовать модуль *entered_tracks*
|
24
17
|
```
|
25
|
-
from
|
26
|
-
result=EnteredTrack('linkin park',10)
|
18
|
+
from parse_hitmos.entered_tracks import EnteredTrack
|
19
|
+
result = EnteredTrack('linkin park',10)
|
27
20
|
```
|
28
21
|
1 аргументом (music_name) передается название песни или автора. 2 Аргументом (count) передается количество треков
|
29
22
|
____
|
30
23
|
## Как использовать модуль *rating_tracks_count*
|
31
24
|
```
|
32
|
-
from
|
33
|
-
result=RatingCount(10)
|
25
|
+
from parse_hitmos.rating_tracks_count import RatingCount
|
26
|
+
result = RatingCount(10)
|
34
27
|
```
|
35
28
|
1 аргументом (count) передается количество песен
|
36
29
|
____
|
37
30
|
## Как использовать модуль *rating_tracks_page*
|
38
31
|
```
|
39
|
-
from
|
40
|
-
result=RatingPage(10)
|
32
|
+
from parse_hitmos.rating_tracks_page import RatingPage
|
33
|
+
result = RatingPage(10)
|
41
34
|
```
|
42
35
|
1 аргументом (count) передается количество страниц (max 11)
|
43
36
|
____
|
@@ -53,6 +46,44 @@ ____
|
|
53
46
|
|result.get_picture_url|Получить ссылку на обложку трека|
|
54
47
|
|result.get_url_track|Получить ссылку трек|
|
55
48
|
|result.get_all|Получить все данные в виде словаря|
|
56
|
-
|result.get_author_title|Получить лист в виде автор
|
49
|
+
|result.get_author_title|Получить лист в виде автор — название|
|
50
|
+
|
51
|
+
____
|
52
|
+
# Сколько времени понадобиться для получения всех нужных данных с сайта
|
53
|
+
## Рейтинговые треки (по страницам)
|
54
|
+
|
55
|
+
| Время | Прямые ссылки | Кол-во треков |
|
56
|
+
|:---------|:---------|:---------|
|
57
|
+
| 5с — 6с | `False` | 11 страниц (~528) |
|
58
|
+
| 5 — 6с | `False` | 10 страниц (~480) |
|
59
|
+
| 4 — 6с | `False` | 9 страниц (~432) |
|
60
|
+
| 4 — 6с | `False` | 8 страниц (~384) |
|
61
|
+
| 4 — 5с | `False` | 7 страниц (~336) |
|
62
|
+
| 3 — 4с | `False` | 6 страниц (~288) |
|
63
|
+
| 3 — 4с | `False` | 5 страниц (~240) |
|
64
|
+
| 2 — 4с | `False` | 4 страниц (~192) |
|
65
|
+
| 2 — 3с | `False` | 3 страниц (~144) |
|
66
|
+
| 1 — 2с | `False` | 2 страниц (~96) |
|
67
|
+
| 1с — 2c | `False` | 1 страниц (~48) |
|
68
|
+
| 126с — 223с (~2.1м — ~4м) | `True` | 11 страниц (~528) |
|
69
|
+
| 116с — 139с (~2м) | `True` | 10 страниц (~480) |
|
70
|
+
| 106с — 131с (~1.6м — 2м) | `True` | 9 страниц (~432) |
|
71
|
+
| 97с — 185с (~1.6м — 2м) | `True` | 8 страниц (~384) |
|
72
|
+
| 76с — 94с (~1.2м — ~1.5c) | `True` | 7 страниц (~336) |
|
73
|
+
| 66с — 74с (~1м — ~1.23) | `True` | 6 страниц (~288) |
|
74
|
+
| 54с — 61с | `True` | 5 страниц (~240) |
|
75
|
+
| 43с — 49с | `True` | 4 страниц (~192) |
|
76
|
+
| 32с — 49с | `True` | 3 страниц (~144) |
|
77
|
+
| 25с — 27с | `True` | 2 страниц (~96) |
|
78
|
+
| 14с — 20с | `True` | 1 страниц (~48) |
|
79
|
+
|
80
|
+
|
81
|
+
## Рейтинговые треки и введенные треки (по трекам)
|
82
|
+
| Время | Прямые ссылки | Кол-во треков |
|
83
|
+
|:---------|:---------|:---------|
|
84
|
+
| 1с — ~3с | `False` | 48 |
|
85
|
+
| 1с — 2с | `False` | 1 |
|
86
|
+
| 23с — 28с | `True` | 48 |
|
87
|
+
| 3с — 4с | `True` | 1 |
|
57
88
|
|
58
89
|
____
|
@@ -0,0 +1,116 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: pars_hitmotop
|
3
|
+
Version: 1.0.0
|
4
|
+
Home-page: https://github.com/JoyHubN/pars_hitmos
|
5
|
+
Download-URL: https://github.com/JoyHubN/pars_hitmos/arhive/v1.0.0.zip
|
6
|
+
Author: Joy_079
|
7
|
+
Author-email: Prufu@yandex.ru
|
8
|
+
Classifier: Programming Language :: Python
|
9
|
+
Classifier: Programming Language :: Python :: 3.8
|
10
|
+
Classifier: Programming Language :: Python :: 3.9
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
13
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
14
|
+
Description-Content-Type: text/markdown
|
15
|
+
Requires-Dist: beautifulsoup4==4.13.4
|
16
|
+
Requires-Dist: fake-useragent==2.2.0
|
17
|
+
Requires-Dist: requests==2.32.4
|
18
|
+
Requires-Dist: tenacity==9.1.2
|
19
|
+
Dynamic: author
|
20
|
+
Dynamic: author-email
|
21
|
+
Dynamic: classifier
|
22
|
+
Dynamic: description
|
23
|
+
Dynamic: description-content-type
|
24
|
+
Dynamic: download-url
|
25
|
+
Dynamic: home-page
|
26
|
+
Dynamic: requires-dist
|
27
|
+
|
28
|
+
# Оглавление
|
29
|
+
0. [Оглавление](https://github.com/PY079/pars_hitmotop#оглавление)
|
30
|
+
1. [Что именно парсит?](https://github.com/PY079/pars_hitmotop/blob/main/README.md#что-именно-парсит)
|
31
|
+
2. [Как использовать модуль entered_tracks](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-entered_tracks)
|
32
|
+
3. [Как использовать модуль rating_tracks_count](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-rating_tracks_count)
|
33
|
+
4. [Как использовать модуль rating_tracks_page](https://github.com/PY079/pars_hitmotop/blob/main/README.md#как-использовать-модуль-rating_tracks_page)
|
34
|
+
5. [Что можно достать при запросе?](https://github.com/PY079/pars_hitmotop/blob/main/README.md#что-можно-достать-при-запросе)
|
35
|
+
____
|
36
|
+
Этот проект парсит [музыкальный сайт](https://hitmos.me/)
|
37
|
+
____
|
38
|
+
# Что именно парсит?
|
39
|
+
1. [Рейтинговые треки](https://hitmos.me/songs/top-rated) от 1 до 48;
|
40
|
+
2. Тоже [рейтинговые треки](https://hitmos.me/songs/top-rated) но можно выбрать количество страниц, с которых будет произведен парсинг;
|
41
|
+
3. Треки введенные пользователем. Парсит от 1 трека до конечной страницы (на одной странице 48 треков)
|
42
|
+
____
|
43
|
+
## Как использовать модуль *entered_tracks*
|
44
|
+
```
|
45
|
+
from parse_hitmos.entered_tracks import EnteredTrack
|
46
|
+
result = EnteredTrack('linkin park',10)
|
47
|
+
```
|
48
|
+
1 аргументом (music_name) передается название песни или автора. 2 Аргументом (count) передается количество треков
|
49
|
+
____
|
50
|
+
## Как использовать модуль *rating_tracks_count*
|
51
|
+
```
|
52
|
+
from parse_hitmos.rating_tracks_count import RatingCount
|
53
|
+
result = RatingCount(10)
|
54
|
+
```
|
55
|
+
1 аргументом (count) передается количество песен
|
56
|
+
____
|
57
|
+
## Как использовать модуль *rating_tracks_page*
|
58
|
+
```
|
59
|
+
from parse_hitmos.rating_tracks_page import RatingPage
|
60
|
+
result = RatingPage(10)
|
61
|
+
```
|
62
|
+
1 аргументом (count) передается количество страниц (max 11)
|
63
|
+
____
|
64
|
+
# Что можно достать при запросе?
|
65
|
+
Все возвращается в виде list
|
66
|
+
| Метод | Описание |
|
67
|
+
|----------------|:---------|
|
68
|
+
| result.get_author | Получить автора трека|
|
69
|
+
|result.get_title| Получить название трека|
|
70
|
+
|result.get_url_down|Получить ссылку на скачивание трека|
|
71
|
+
|result.direct_download_link|Получить прямую ссылку на скачивание трека|
|
72
|
+
|result.get_duration|Получить продолжительность трека|
|
73
|
+
|result.get_picture_url|Получить ссылку на обложку трека|
|
74
|
+
|result.get_url_track|Получить ссылку трек|
|
75
|
+
|result.get_all|Получить все данные в виде словаря|
|
76
|
+
|result.get_author_title|Получить лист в виде автор — название|
|
77
|
+
|
78
|
+
____
|
79
|
+
# Сколько времени понадобиться для получения всех нужных данных с сайта
|
80
|
+
## Рейтинговые треки (по страницам)
|
81
|
+
|
82
|
+
| Время | Прямые ссылки | Кол-во треков |
|
83
|
+
|:---------|:---------|:---------|
|
84
|
+
| 5с — 6с | `False` | 11 страниц (~528) |
|
85
|
+
| 5 — 6с | `False` | 10 страниц (~480) |
|
86
|
+
| 4 — 6с | `False` | 9 страниц (~432) |
|
87
|
+
| 4 — 6с | `False` | 8 страниц (~384) |
|
88
|
+
| 4 — 5с | `False` | 7 страниц (~336) |
|
89
|
+
| 3 — 4с | `False` | 6 страниц (~288) |
|
90
|
+
| 3 — 4с | `False` | 5 страниц (~240) |
|
91
|
+
| 2 — 4с | `False` | 4 страниц (~192) |
|
92
|
+
| 2 — 3с | `False` | 3 страниц (~144) |
|
93
|
+
| 1 — 2с | `False` | 2 страниц (~96) |
|
94
|
+
| 1с — 2c | `False` | 1 страниц (~48) |
|
95
|
+
| 126с — 223с (~2.1м — ~4м) | `True` | 11 страниц (~528) |
|
96
|
+
| 116с — 139с (~2м) | `True` | 10 страниц (~480) |
|
97
|
+
| 106с — 131с (~1.6м — 2м) | `True` | 9 страниц (~432) |
|
98
|
+
| 97с — 185с (~1.6м — 2м) | `True` | 8 страниц (~384) |
|
99
|
+
| 76с — 94с (~1.2м — ~1.5c) | `True` | 7 страниц (~336) |
|
100
|
+
| 66с — 74с (~1м — ~1.23) | `True` | 6 страниц (~288) |
|
101
|
+
| 54с — 61с | `True` | 5 страниц (~240) |
|
102
|
+
| 43с — 49с | `True` | 4 страниц (~192) |
|
103
|
+
| 32с — 49с | `True` | 3 страниц (~144) |
|
104
|
+
| 25с — 27с | `True` | 2 страниц (~96) |
|
105
|
+
| 14с — 20с | `True` | 1 страниц (~48) |
|
106
|
+
|
107
|
+
|
108
|
+
## Рейтинговые треки и введенные треки (по трекам)
|
109
|
+
| Время | Прямые ссылки | Кол-во треков |
|
110
|
+
|:---------|:---------|:---------|
|
111
|
+
| 1с — ~3с | `False` | 48 |
|
112
|
+
| 1с — 2с | `False` | 1 |
|
113
|
+
| 23с — 28с | `True` | 48 |
|
114
|
+
| 3с — 4с | `True` | 1 |
|
115
|
+
|
116
|
+
____
|
@@ -0,0 +1,13 @@
|
|
1
|
+
README.md
|
2
|
+
setup.py
|
3
|
+
pars_hitmotop.egg-info/PKG-INFO
|
4
|
+
pars_hitmotop.egg-info/SOURCES.txt
|
5
|
+
pars_hitmotop.egg-info/dependency_links.txt
|
6
|
+
pars_hitmotop.egg-info/requires.txt
|
7
|
+
pars_hitmotop.egg-info/top_level.txt
|
8
|
+
parse_hitmos/__init__.py
|
9
|
+
parse_hitmos/entered_tracks.py
|
10
|
+
parse_hitmos/excepts.py
|
11
|
+
parse_hitmos/how_to_use.py
|
12
|
+
parse_hitmos/rating_tracks_count.py
|
13
|
+
parse_hitmos/rating_tracks_page.py
|
@@ -0,0 +1 @@
|
|
1
|
+
parse_hitmos
|
@@ -0,0 +1,125 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
from urllib.parse import quote
|
3
|
+
|
4
|
+
from parse_hitmos.tools.retry_func import safe_get, safe_head
|
5
|
+
from parse_hitmos.tools.headers import get_headers
|
6
|
+
from parse_hitmos.tools.base_session import BaseSessionHandlerInputTracks
|
7
|
+
from parse_hitmos.excepts import NoFoundTrack, MaxTrack, MusicName, AmountErr, RedirectErr
|
8
|
+
from parse_hitmos.tools.replace_symbol import replace_symbol_in_title
|
9
|
+
|
10
|
+
|
11
|
+
class EnteredTrack(BaseSessionHandlerInputTracks):
|
12
|
+
"""
|
13
|
+
Треки из запроса\n
|
14
|
+
:param music_name: Название и автор трека в одной строке.
|
15
|
+
:param amount: Количество треков, которое нужно вывести. Max 48.
|
16
|
+
:param get_redirect_url: True-получить прямую ссылку на скачивание трека, но увеличивает время выполнения\n
|
17
|
+
:type music_name: str
|
18
|
+
:type amount: int
|
19
|
+
:type get_redirect_url: bool
|
20
|
+
|
21
|
+
.. note:: Установка get_redirect_url=True может значительно увеличить время выполнения.\n
|
22
|
+
Методы:\n
|
23
|
+
- get_author -> list[str]: автор трека
|
24
|
+
- get_title -> list[str]: название трека
|
25
|
+
- get_url_down -> list[str]: ссылка на скачивание трека
|
26
|
+
- direct_download_link -> list[str]: прямая ссылка на скачивание трека
|
27
|
+
- get_duration -> list[str]: длительность трека
|
28
|
+
- get_picture_url -> list[str]: ссылка на обложку трека
|
29
|
+
- get_url_track -> list[str]: ссылка на трек
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(self, music_name:str, amount: int, get_redirect_url=False):
|
33
|
+
if not isinstance(music_name, str): raise MusicName
|
34
|
+
if not isinstance(amount, int): raise AmountErr
|
35
|
+
if not isinstance(get_redirect_url, bool): raise RedirectErr
|
36
|
+
|
37
|
+
self.music_name = music_name
|
38
|
+
self.amount = int(amount)
|
39
|
+
|
40
|
+
super().__init__()
|
41
|
+
|
42
|
+
self.get_redirect_url = get_redirect_url
|
43
|
+
self.get_info
|
44
|
+
|
45
|
+
@property
|
46
|
+
def get_info(self):
|
47
|
+
|
48
|
+
if self.amount > 48:
|
49
|
+
raise MaxTrack
|
50
|
+
else:
|
51
|
+
|
52
|
+
|
53
|
+
__headers = get_headers()
|
54
|
+
__search_url = self.search_url+quote(self.music_name)
|
55
|
+
__response = safe_get(self, __search_url, headers=__headers)
|
56
|
+
__soup = BeautifulSoup(__response.text, "html.parser")
|
57
|
+
|
58
|
+
if __soup.find('h2', class_='tracks__title content-item-title'):
|
59
|
+
raise NoFoundTrack
|
60
|
+
|
61
|
+
_track_titles = [i.text.strip() for i in __soup.find_all("div", class_="track__title")]
|
62
|
+
_track_artists = [i.text.strip() for i in __soup.find_all("div", class_="track__desc")]
|
63
|
+
_track_duration = [i.text.strip() for i in __soup.find_all("div", class_="track__fulltime")]
|
64
|
+
_track_pictures = [f"{i.get('style')[23:-3]}" for i in __soup.find_all("div", class_="track__img")]
|
65
|
+
_track_urls_dow = [i.get('href') for i in __soup.find_all('a', class_='track__download-btn')]
|
66
|
+
_track_url = [f"{self.base_url[:-1]}{tra_url.get('href')}" for tra_url in __soup.find_all('a', class_='track__info-l')]
|
67
|
+
|
68
|
+
|
69
|
+
_items = []
|
70
|
+
for idx in range(self.amount if len(_track_titles) > self.amount else len(_track_titles)):
|
71
|
+
if self.get_redirect_url and len(_track_urls_dow[idx]) > 0:
|
72
|
+
direct_download_link = safe_head(self, _track_urls_dow[idx], headers=__headers, allow_redirects=True).url
|
73
|
+
else: direct_download_link = None
|
74
|
+
|
75
|
+
item = {
|
76
|
+
'author': _track_artists[idx],
|
77
|
+
'title': replace_symbol_in_title(_track_titles[idx]),
|
78
|
+
'url_down': _track_urls_dow[idx],
|
79
|
+
'direct_download_link': direct_download_link,
|
80
|
+
'duration_track': _track_duration[idx],
|
81
|
+
'picture_url': _track_pictures[idx],
|
82
|
+
'url_track': _track_url[idx]
|
83
|
+
}
|
84
|
+
_items.append(item)
|
85
|
+
|
86
|
+
self.count_tracks = len(_items)
|
87
|
+
self.data = {"items": _items}
|
88
|
+
return self.data
|
89
|
+
|
90
|
+
@property
|
91
|
+
def get_author(self) -> list[str]:
|
92
|
+
return [item['author'] for item in self.data['items']]
|
93
|
+
|
94
|
+
@property
|
95
|
+
def get_title(self) -> list[str]:
|
96
|
+
return [item['title'] for item in self.data['items']]
|
97
|
+
|
98
|
+
@property
|
99
|
+
def get_url_down(self) -> list[str]:
|
100
|
+
return [item['url_down'] for item in self.data['items']]
|
101
|
+
|
102
|
+
@property
|
103
|
+
def direct_download_link(self) -> list[str]:
|
104
|
+
return [item['direct_download_link'] for item in self.data['items']]
|
105
|
+
|
106
|
+
@property
|
107
|
+
def get_duration(self) -> list[str]:
|
108
|
+
return [item['duration_track'] for item in self.data['items']]
|
109
|
+
|
110
|
+
@property
|
111
|
+
def get_picture_url(self) -> list[str]:
|
112
|
+
return [item['picture_url'] for item in self.data['items']]
|
113
|
+
|
114
|
+
@property
|
115
|
+
def get_url_track(self) -> list[str]:
|
116
|
+
return [item['url_track'] for item in self.data['items']]
|
117
|
+
|
118
|
+
@property
|
119
|
+
def get_all(self) -> list[str]: return self.data
|
120
|
+
|
121
|
+
@property
|
122
|
+
def get_author_title(self) -> list[str]:
|
123
|
+
__author = self.get_author
|
124
|
+
__title = self.get_title
|
125
|
+
return [f'{__author[i]} - {__title[i]}' for i in range(self.count_tracks)]
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class NoFoundTrack(Exception):
|
2
|
+
|
3
|
+
def __init__(self):
|
4
|
+
self.err = 'Nothing was found for your query'
|
5
|
+
|
6
|
+
def __str__(self):
|
7
|
+
return self.err
|
8
|
+
|
9
|
+
class MaxTrack(Exception):
|
10
|
+
|
11
|
+
def __init__(self):
|
12
|
+
self.err = 'The number of tracks should not exceed 48'
|
13
|
+
|
14
|
+
def __str__(self):
|
15
|
+
return self.err
|
16
|
+
|
17
|
+
|
18
|
+
class PageError(Exception):
|
19
|
+
|
20
|
+
def __init__(self):
|
21
|
+
self.err = 'Only <= 11'
|
22
|
+
|
23
|
+
def __str__(self):
|
24
|
+
return self.err
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
class MusicName(Exception):
|
29
|
+
|
30
|
+
def __init__(self):
|
31
|
+
self.err = 'The name of the music should only be str'
|
32
|
+
|
33
|
+
def __str__(self):
|
34
|
+
return self.err
|
35
|
+
|
36
|
+
class AmountErr(Exception):
|
37
|
+
|
38
|
+
def __init__(self):
|
39
|
+
self.err = 'The amount should only be int'
|
40
|
+
|
41
|
+
def __str__(self):
|
42
|
+
return self.err
|
43
|
+
|
44
|
+
class PageCount(Exception):
|
45
|
+
|
46
|
+
def __init__(self):
|
47
|
+
self.err = 'Page count only int'
|
48
|
+
|
49
|
+
def __str__(self):
|
50
|
+
return self.err
|
51
|
+
|
52
|
+
|
53
|
+
class CountTracksErr(Exception):
|
54
|
+
|
55
|
+
def __init__(self):
|
56
|
+
self.err = 'The count tracks should only be int'
|
57
|
+
|
58
|
+
def __str__(self):
|
59
|
+
return self.err
|
60
|
+
|
61
|
+
class RedirectErr(Exception):
|
62
|
+
|
63
|
+
def __init__(self):
|
64
|
+
self.err = 'Accepts only the bool type'
|
65
|
+
|
66
|
+
def __str__(self):
|
67
|
+
return self.err
|
68
|
+
|
69
|
+
|
70
|
+
class MaxAttempts(Exception):
|
71
|
+
def __init__(self, max_attempts):
|
72
|
+
self.err = f"Failed to create session after {max_attempts} attempts"
|
73
|
+
|
74
|
+
def __str__(self):
|
75
|
+
return self.err
|
@@ -0,0 +1,152 @@
|
|
1
|
+
import sys, os, urllib.request, pathlib
|
2
|
+
from parse_hitmos import EnteredTrack, RatingPage, RatingCount
|
3
|
+
from parse_hitmos.tools.headers import get_headers
|
4
|
+
|
5
|
+
def downl(url, info):
|
6
|
+
req = urllib.request.Request(url, headers=get_headers())
|
7
|
+
with urllib.request.urlopen(req) as response, open(f'{PATH_DOWNLOAD_MUSIC}/{info}.mp3', "wb") as f:
|
8
|
+
f.write(response.read())
|
9
|
+
|
10
|
+
cwd = pathlib.Path.cwd()
|
11
|
+
PATH_DOWNLOAD_MUSIC = pathlib.Path.joinpath(cwd, 'download_music')
|
12
|
+
|
13
|
+
if not os.path.isdir(PATH_DOWNLOAD_MUSIC): os.mkdir(PATH_DOWNLOAD_MUSIC)
|
14
|
+
|
15
|
+
result_entered_tracks = EnteredTrack('linkin park', 10, True)
|
16
|
+
result_rating_count = RatingCount(1, True)
|
17
|
+
result_rating_page = RatingPage(1, True)
|
18
|
+
|
19
|
+
def print_new_line():
|
20
|
+
print('\n------------------------\n')
|
21
|
+
|
22
|
+
|
23
|
+
# Получить количество треков
|
24
|
+
amount_ET = result_entered_tracks.count_tracks
|
25
|
+
amount_RC = result_rating_count.count_tracks
|
26
|
+
amount_RP = result_rating_page.count_tracks
|
27
|
+
|
28
|
+
print(f'{amount_ET=}\n{amount_RC=}\n{amount_RP=}\n')
|
29
|
+
print_new_line()
|
30
|
+
|
31
|
+
# Получить автора треков
|
32
|
+
author_ET = result_entered_tracks.get_author
|
33
|
+
author_RC = result_rating_count.get_author
|
34
|
+
author_RP = result_rating_page.get_author
|
35
|
+
|
36
|
+
print(f'{author_ET=}\n{author_RC=}\n{author_RP=}\n')
|
37
|
+
print_new_line()
|
38
|
+
|
39
|
+
# Получить названия треков
|
40
|
+
title_ET = result_entered_tracks.get_title
|
41
|
+
title_RC = result_rating_count.get_title
|
42
|
+
title_RP = result_rating_page.get_title
|
43
|
+
|
44
|
+
print(f'{title_ET=}\n{title_RC=}\n{title_RP=}\n')
|
45
|
+
print_new_line()
|
46
|
+
|
47
|
+
|
48
|
+
# Получить ссылки на скачивания треков
|
49
|
+
url_down_ET = result_entered_tracks.get_url_down
|
50
|
+
url_down_RC = result_rating_count.get_url_down
|
51
|
+
url_down_RP = result_rating_page.get_url_down
|
52
|
+
|
53
|
+
print(f'{url_down_ET=}\n{url_down_RC=}\n{url_down_RP=}\n')
|
54
|
+
print_new_line()
|
55
|
+
|
56
|
+
# Получить прямую ссылку на скачивание треков
|
57
|
+
url_down_dir_ET = result_entered_tracks.direct_download_link
|
58
|
+
url_down_dir_RC = result_rating_count.direct_download_link
|
59
|
+
url_down_dir_RP = result_rating_page.direct_download_link
|
60
|
+
|
61
|
+
print(f'{url_down_dir_ET=}\n{url_down_dir_RC=}\n{url_down_dir_RP=}\n')
|
62
|
+
print_new_line()
|
63
|
+
|
64
|
+
# Получить длительность треков
|
65
|
+
duration_ET = result_entered_tracks.get_duration
|
66
|
+
duration_RC = result_rating_count.get_duration
|
67
|
+
duration_RP = result_rating_page.get_duration
|
68
|
+
|
69
|
+
print(f'{duration_ET=}\n{duration_RC=}\n{duration_RP=}\n')
|
70
|
+
print_new_line()
|
71
|
+
|
72
|
+
# Получить обложки треков
|
73
|
+
picture_ET = result_entered_tracks.get_picture_url
|
74
|
+
picture_RC = result_rating_count.get_picture_url
|
75
|
+
picture_RP = result_rating_page.get_picture_url
|
76
|
+
|
77
|
+
print(f'{picture_ET=}\n{picture_RC=}\n{picture_RP=}\n')
|
78
|
+
print_new_line()
|
79
|
+
|
80
|
+
# Получить ссылки на треки
|
81
|
+
url_tracks_ET = result_entered_tracks.get_url_track
|
82
|
+
url_tracks_RC = result_rating_count.get_url_track
|
83
|
+
url_tracks_RP = result_rating_page.get_url_track
|
84
|
+
|
85
|
+
print(f'{url_tracks_ET=}\n{url_tracks_RC=}\n{url_tracks_RP=}\n')
|
86
|
+
print_new_line()
|
87
|
+
|
88
|
+
|
89
|
+
# Получить все данные
|
90
|
+
all_data_ET = result_entered_tracks.get_all
|
91
|
+
all_data_RC = result_rating_count.get_all
|
92
|
+
all_data_RP = result_rating_page.get_all
|
93
|
+
|
94
|
+
print(f'{all_data_ET=}\n{all_data_RC=}\n{all_data_RP=}\n')
|
95
|
+
print_new_line()
|
96
|
+
|
97
|
+
|
98
|
+
# Получить автор - название
|
99
|
+
info_ET = result_entered_tracks.get_author_title
|
100
|
+
info_RC = result_rating_count.get_author_title
|
101
|
+
info_RP = result_rating_page.get_author_title
|
102
|
+
|
103
|
+
print(f'{info_ET=}\n{info_RC=}\n{info_RP=}\n')
|
104
|
+
print_new_line()
|
105
|
+
|
106
|
+
# Скачать найденные треки треки
|
107
|
+
def down_music_ET():
|
108
|
+
for _ in range(amount_ET):
|
109
|
+
|
110
|
+
if url_down_dir_ET[_] != None:
|
111
|
+
print(info_ET[_])
|
112
|
+
print(f'Скачиваю по ссылке: {url_down_dir_ET[_]}')
|
113
|
+
downl(url_down_dir_ET[_], info_ET[_])
|
114
|
+
|
115
|
+
else:
|
116
|
+
print(title_ET[_])
|
117
|
+
print(f'Скачиваю hitmotop\n{url_tracks_ET[_]}')
|
118
|
+
downl(url_tracks_ET[_], info_ET[_])
|
119
|
+
|
120
|
+
def down_music_RC():
|
121
|
+
for _ in range(amount_RC):
|
122
|
+
|
123
|
+
if url_down_dir_RC[_] != None:
|
124
|
+
print(info_RC[_])
|
125
|
+
print(f'Скачиваю по ссылке: {url_down_dir_RC[_]}')
|
126
|
+
downl(url_down_dir_RC[_], info_RC[_])
|
127
|
+
|
128
|
+
else:
|
129
|
+
print(title_RC[_])
|
130
|
+
print(f'Скачиваю hitmotop\n{url_tracks_RC[_]}')
|
131
|
+
downl(url_tracks_RC[_], info_RC[_])
|
132
|
+
|
133
|
+
def down_music_RP():
|
134
|
+
for _ in range(amount_RP):
|
135
|
+
|
136
|
+
if url_down_dir_RP[_] != None:
|
137
|
+
print(info_RP[_])
|
138
|
+
print(f'Скачиваю по ссылке: {url_down_dir_RP[_]}')
|
139
|
+
downl(url_down_dir_RP[_], info_RP[_])
|
140
|
+
|
141
|
+
else:
|
142
|
+
print(title_RP[_])
|
143
|
+
print(f'Скачиваю hitmotop\n{url_tracks_RP[_]}')
|
144
|
+
downl(url_tracks_RP[_], info_RP[_])
|
145
|
+
|
146
|
+
|
147
|
+
print_new_line()
|
148
|
+
down_music_ET()
|
149
|
+
print_new_line()
|
150
|
+
down_music_RC()
|
151
|
+
print_new_line()
|
152
|
+
down_music_RP()
|
@@ -0,0 +1,113 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
|
3
|
+
from parse_hitmos.tools.headers import get_headers
|
4
|
+
from parse_hitmos.excepts import CountTracksErr, RedirectErr
|
5
|
+
from parse_hitmos.tools.base_session import BaseSessionHandlerRating
|
6
|
+
from parse_hitmos.tools.retry_func import safe_get, safe_head
|
7
|
+
from parse_hitmos.tools.replace_symbol import replace_symbol_in_title
|
8
|
+
|
9
|
+
|
10
|
+
class RatingCount(BaseSessionHandlerRating):
|
11
|
+
'''
|
12
|
+
Класс для получения списка рейтинговых треков.\n
|
13
|
+
:param count: число от 1 до 48 - количество треков\n
|
14
|
+
:param get_redirect_url: True-получить прямую ссылку на скачивание трека\n
|
15
|
+
:type count: int\n
|
16
|
+
:type get_redirect_url: bool
|
17
|
+
|
18
|
+
.. note:: Установка get_redirect_url=True может значительно увеличить время выполнения.\n
|
19
|
+
Методы:\n
|
20
|
+
- get_author -> list[str]: автор трека
|
21
|
+
- get_title -> list[str]: название трека
|
22
|
+
- get_url_down -> list[str]: ссылка на скачивание трека
|
23
|
+
- direct_download_link -> list[str]: прямая ссылка на скачивание трека
|
24
|
+
- get_duration -> list[str]: длительность трека
|
25
|
+
- get_picture_url -> list[str]: ссылка на обложку трека
|
26
|
+
- get_url_track -> list[str]: ссылка на трек
|
27
|
+
'''
|
28
|
+
|
29
|
+
def __init__(self, count_tracks, get_redirect_url=False):
|
30
|
+
if not isinstance(count_tracks, int): raise CountTracksErr
|
31
|
+
if not isinstance(get_redirect_url, bool): raise RedirectErr
|
32
|
+
|
33
|
+
self.count_tracks = count_tracks
|
34
|
+
self.get_redirect_url = get_redirect_url
|
35
|
+
|
36
|
+
super().__init__()
|
37
|
+
|
38
|
+
self.count_selection
|
39
|
+
|
40
|
+
@property
|
41
|
+
def count_selection(self) -> dict[str, list[dict[str, None | str]]]:
|
42
|
+
|
43
|
+
if self.count_tracks > 48:
|
44
|
+
raise ValueError('Only <= 48')
|
45
|
+
|
46
|
+
else:
|
47
|
+
__headers = get_headers()
|
48
|
+
request = safe_get(self, self.song_rated, headers=__headers)
|
49
|
+
_soup = BeautifulSoup(request.text, 'html.parser')
|
50
|
+
|
51
|
+
_track_titles = [i.text.strip() for i in _soup.find_all("div", class_="track__title")]
|
52
|
+
_track_artists = [i.text.strip() for i in _soup.find_all("div", class_="track__desc")]
|
53
|
+
_track_duration = [i.text.strip() for i in _soup.find_all("div", class_="track__fulltime")]
|
54
|
+
_track_pictures = [f"{i.get('style')[23:-3]}" for i in _soup.find_all("div", class_="track__img")]
|
55
|
+
_track_urls_dow = [i.get('href') for i in _soup.find_all('a', class_='track__download-btn')]
|
56
|
+
_track_url = [f"{self.base_url[:-1]}{tra_url.get('href')}" for tra_url in _soup.find_all('a', class_='track__info-l')]
|
57
|
+
|
58
|
+
_items = []
|
59
|
+
|
60
|
+
for idx in range(self.count_tracks if len(_track_titles) > self.count_tracks else len(_track_titles)):
|
61
|
+
if self.get_redirect_url and len(_track_urls_dow[idx]) > 0:
|
62
|
+
direct_download_link = safe_head(self, _track_urls_dow[idx], headers=__headers, allow_redirects=True, timeout=5).url
|
63
|
+
else: direct_download_link = None
|
64
|
+
item = {
|
65
|
+
'author': _track_artists[idx],
|
66
|
+
'title': replace_symbol_in_title(_track_titles[idx]),
|
67
|
+
'url_down': _track_urls_dow[idx],
|
68
|
+
'direct_download_link': direct_download_link,
|
69
|
+
'duration_track': _track_duration[idx],
|
70
|
+
'picture_url': _track_pictures[idx],
|
71
|
+
'url_track': _track_url[idx]
|
72
|
+
}
|
73
|
+
_items.append(item)
|
74
|
+
|
75
|
+
self.session.close()
|
76
|
+
self.data = {"items": _items}
|
77
|
+
return self.data
|
78
|
+
@property
|
79
|
+
def get_author(self) -> list[str]:
|
80
|
+
return [item['author'] for item in self.data['items']]
|
81
|
+
|
82
|
+
@property
|
83
|
+
def get_title(self) -> list[str]:
|
84
|
+
return [item['title'] for item in self.data['items']]
|
85
|
+
|
86
|
+
@property
|
87
|
+
def get_url_down(self) -> list[str]:
|
88
|
+
return [item['url_down'] for item in self.data['items']]
|
89
|
+
|
90
|
+
@property
|
91
|
+
def direct_download_link(self) -> list[None | str]:
|
92
|
+
return [item['direct_download_link'] for item in self.data['items']]
|
93
|
+
|
94
|
+
@property
|
95
|
+
def get_duration(self) -> list[str]:
|
96
|
+
return [item['duration_track'] for item in self.data['items']]
|
97
|
+
|
98
|
+
@property
|
99
|
+
def get_picture_url(self) -> list[str]:
|
100
|
+
return [item['picture_url'] for item in self.data['items']]
|
101
|
+
|
102
|
+
@property
|
103
|
+
def get_url_track(self) -> list[str]:
|
104
|
+
return [item['url_track'] for item in self.data['items']]
|
105
|
+
|
106
|
+
@property
|
107
|
+
def get_all(self): return self.data
|
108
|
+
|
109
|
+
@property
|
110
|
+
def get_author_title(self) -> list[str]:
|
111
|
+
__author = self.get_author
|
112
|
+
__title = self.get_title
|
113
|
+
return [f'{__author[i]} - {__title[i]}' for i in range(self.count_tracks)]
|
@@ -0,0 +1,172 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
from urllib.parse import urljoin
|
3
|
+
|
4
|
+
from parse_hitmos.tools.headers import get_headers
|
5
|
+
from parse_hitmos.excepts import PageError, RedirectErr, PageCount
|
6
|
+
from parse_hitmos.tools.base_session import BaseSessionHandlerRatingPage
|
7
|
+
from parse_hitmos.tools.retry_func import safe_get, safe_head
|
8
|
+
from parse_hitmos.tools.replace_symbol import replace_symbol_in_title
|
9
|
+
|
10
|
+
|
11
|
+
class RatingPage(BaseSessionHandlerRatingPage):
|
12
|
+
'''
|
13
|
+
Функция для получения списка рейтинговых треков\n
|
14
|
+
:param page_count: число от 1 до 11 (номер страницы с треками)
|
15
|
+
:param get_redirect_url: True-получить прямую ссылку на скачивание трека, но увеличивает время выполнения
|
16
|
+
:type page_count: int
|
17
|
+
:type get_redirect_url: bool
|
18
|
+
|
19
|
+
.. note:: Установка get_redirect_url=True может значительно увеличить время выполнения.\n
|
20
|
+
Методы:\n
|
21
|
+
- get_author -> list[str]: автор трека
|
22
|
+
- get_title -> list[str]: название трека
|
23
|
+
- get_url_down -> list[str]: ссылка на скачивание трека
|
24
|
+
- direct_download_link -> list[str]: прямая ссылка на скачивание трека
|
25
|
+
- get_duration -> list[str]: длительность трека
|
26
|
+
- get_picture_url -> list[str]: ссылка на обложку трека
|
27
|
+
- get_url_track -> list[str]: ссылка на трек
|
28
|
+
'''
|
29
|
+
def __init__(self, page_count:int, get_redirect_url=False):
|
30
|
+
if not isinstance(page_count, int): raise PageCount
|
31
|
+
if not isinstance(get_redirect_url, bool): raise RedirectErr
|
32
|
+
|
33
|
+
self.page_count = int(page_count)
|
34
|
+
self.get_redirect_url = get_redirect_url
|
35
|
+
|
36
|
+
super().__init__()
|
37
|
+
|
38
|
+
self.__page_selection
|
39
|
+
|
40
|
+
|
41
|
+
@property
|
42
|
+
def __page_selection(self):
|
43
|
+
|
44
|
+
if self.page_count > 11:
|
45
|
+
raise PageError
|
46
|
+
else:
|
47
|
+
|
48
|
+
|
49
|
+
if self.page_count == 1:
|
50
|
+
__list = []
|
51
|
+
__headers = get_headers()
|
52
|
+
response = safe_get(self, self.song_rated, headers=__headers, timeout=10, allow_redirects=self.get_redirect_url)
|
53
|
+
_soup = BeautifulSoup(response.text, 'html.parser')
|
54
|
+
if not self.get_redirect_url: self.session.close()
|
55
|
+
|
56
|
+
|
57
|
+
_track_titles = [i.text.strip() for i in _soup.find_all("div", class_="track__title")]
|
58
|
+
_track_artists = [i.text.strip() for i in _soup.find_all("div", class_="track__desc")]
|
59
|
+
_track_duration = [i.text.strip() for i in _soup.find_all("div", class_="track__fulltime")]
|
60
|
+
_track_pictures = [f"{i.get('style')[23:-3]}" for i in _soup.find_all("div", class_="track__img")]
|
61
|
+
_track_urls_dow = [i.get('href') for i in _soup.find_all('a', class_='track__download-btn')]
|
62
|
+
_track_url = [f"{self.base_url[:-1]}{tra_url.get('href')}" for tra_url in _soup.find_all('a', class_='track__info-l')]
|
63
|
+
|
64
|
+
for idx in range(0, len(_track_titles)):
|
65
|
+
if self.get_redirect_url and len(_track_urls_dow[idx]) > 0:
|
66
|
+
try:
|
67
|
+
direct_download_link = self.session.head(_track_urls_dow[idx], headers=__headers, allow_redirects=True).url
|
68
|
+
except Exception as err:
|
69
|
+
print(err)
|
70
|
+
|
71
|
+
direct_download_link = safe_head(self, _track_urls_dow[idx], headers=__headers, allow_redirects=True)
|
72
|
+
direct_download_link = direct_download_link.url
|
73
|
+
else:
|
74
|
+
direct_download_link = None
|
75
|
+
|
76
|
+
items={
|
77
|
+
'author': _track_artists[idx],
|
78
|
+
'title': replace_symbol_in_title(_track_titles[idx]),
|
79
|
+
'url_down': _track_urls_dow[idx],
|
80
|
+
'direct_download_link': direct_download_link,
|
81
|
+
'url_track': _track_url[idx],
|
82
|
+
'duration_track': _track_duration[idx],
|
83
|
+
'picture_url': _track_pictures[idx]
|
84
|
+
}
|
85
|
+
__list.append(items)
|
86
|
+
|
87
|
+
self.count_tracks = len(__list)
|
88
|
+
self.data = {'items': __list}
|
89
|
+
return self.data
|
90
|
+
|
91
|
+
else:
|
92
|
+
self.page_count *= 48
|
93
|
+
|
94
|
+
__list = []
|
95
|
+
|
96
|
+
items = []
|
97
|
+
for page in range(0, self.page_count, 48):
|
98
|
+
__headers = get_headers()
|
99
|
+
response = safe_get(self, urljoin(self.song_rated_more1, str(page)), cookies={'sid':self.sid.get_sid()}, headers=__headers, timeout=5)
|
100
|
+
soup = BeautifulSoup(response.text, 'html.parser')
|
101
|
+
if not self.get_redirect_url: self.session.close()
|
102
|
+
|
103
|
+
track_titles = [i.text.strip() for i in soup.find_all("div", class_="track__title")]
|
104
|
+
track_artists = [i.text.strip() for i in soup.find_all("div", class_="track__desc")]
|
105
|
+
track_duration = [i.text.strip() for i in soup.find_all("div", class_="track__fulltime")]
|
106
|
+
track_pictures = [f"{i.get('style')[23:-3]}" for i in soup.find_all("div", class_="track__img")]
|
107
|
+
track_urls_dow = [f"{track_dow_url.get('href')}" for track_dow_url in soup.find_all('a', class_='track__download-btn')]
|
108
|
+
track_url = [f"{self.base_url[:-1]}{tra_url.get('href')}" for tra_url in soup.find_all('a', class_='track__info-l')]
|
109
|
+
|
110
|
+
for idx in range(0, len(track_titles)):
|
111
|
+
if self.get_redirect_url and len(track_urls_dow[idx]) > 0:
|
112
|
+
try:
|
113
|
+
direct_download_link = self.session.head(track_urls_dow[idx], headers=__headers, allow_redirects=True).url
|
114
|
+
except Exception as err:
|
115
|
+
print(err)
|
116
|
+
|
117
|
+
direct_download_link = safe_get(self, track_urls_dow[idx], headers=__headers, allow_redirects=True)
|
118
|
+
direct_download_link = direct_download_link.url
|
119
|
+
|
120
|
+
else: direct_download_link=None
|
121
|
+
|
122
|
+
items={
|
123
|
+
'author': track_artists[idx],
|
124
|
+
'title': track_titles[idx],
|
125
|
+
'url_down': track_urls_dow[idx],
|
126
|
+
'direct_download_link': direct_download_link,
|
127
|
+
'url_track': track_url[idx],
|
128
|
+
'duration_track': track_duration[idx],
|
129
|
+
'picture_url': track_pictures[idx]
|
130
|
+
}
|
131
|
+
__list.append(items)
|
132
|
+
self.session.close()
|
133
|
+
self.count_tracks = len(__list)
|
134
|
+
self.data = {'items': __list}
|
135
|
+
return self.data
|
136
|
+
|
137
|
+
@property
|
138
|
+
def get_author(self) -> list[str]:
|
139
|
+
return [item['author'] for item in self.data['items']]
|
140
|
+
|
141
|
+
@property
|
142
|
+
def get_title(self) -> list[str]:
|
143
|
+
return [item['title'] for item in self.data['items']]
|
144
|
+
|
145
|
+
@property
|
146
|
+
def get_url_down(self) -> list[str]:
|
147
|
+
return [item['url_down'] for item in self.data['items']]
|
148
|
+
|
149
|
+
@property
|
150
|
+
def direct_download_link(self) -> list[None | str]:
|
151
|
+
return [item['direct_download_link'] for item in self.data['items']]
|
152
|
+
|
153
|
+
@property
|
154
|
+
def get_duration(self) -> list[str]:
|
155
|
+
return [item['duration_track'] for item in self.data['items']]
|
156
|
+
|
157
|
+
@property
|
158
|
+
def get_picture_url(self) -> list[str]:
|
159
|
+
return [item['picture_url'] for item in self.data['items']]
|
160
|
+
|
161
|
+
@property
|
162
|
+
def get_url_track(self) -> list[str]:
|
163
|
+
return [item['url_track'] for item in self.data['items']]
|
164
|
+
|
165
|
+
@property
|
166
|
+
def get_all(self) -> list[str]: return self.data
|
167
|
+
|
168
|
+
@property
|
169
|
+
def get_author_title(self) -> list[str]:
|
170
|
+
__author = self.get_author
|
171
|
+
__title = self.get_title
|
172
|
+
return [f'{__author[i]} - {__title[i]}' for i in range(self.count_tracks)]
|
@@ -0,0 +1,33 @@
|
|
1
|
+
from setuptools import setup
|
2
|
+
|
3
|
+
version='1.0.0'
|
4
|
+
|
5
|
+
with open('README.md', encoding='utf-8') as f:
|
6
|
+
long_description=f.read()
|
7
|
+
|
8
|
+
setup(
|
9
|
+
name = 'pars_hitmotop',
|
10
|
+
version = version,
|
11
|
+
|
12
|
+
author = 'Joy_079',
|
13
|
+
author_email = 'Prufu@yandex.ru',
|
14
|
+
long_description = long_description,
|
15
|
+
long_description_content_type = 'text/markdown',
|
16
|
+
url = 'https://github.com/JoyHubN/pars_hitmos',
|
17
|
+
download_url = f'https://github.com/JoyHubN/pars_hitmos/arhive/v{version}.zip',
|
18
|
+
install_requires = ['beautifulsoup4==4.13.4',
|
19
|
+
'fake-useragent==2.2.0',
|
20
|
+
'requests==2.32.4',
|
21
|
+
'tenacity==9.1.2',
|
22
|
+
],
|
23
|
+
# license=...,
|
24
|
+
packages = ['parse_hitmos'],
|
25
|
+
classifiers = [
|
26
|
+
'Programming Language :: Python',
|
27
|
+
'Programming Language :: Python :: 3.8',
|
28
|
+
'Programming Language :: Python :: 3.9',
|
29
|
+
'Programming Language :: Python :: 3.10',
|
30
|
+
'Programming Language :: Python :: 3.11',
|
31
|
+
'Programming Language :: Python :: Implementation :: PyPy'
|
32
|
+
]
|
33
|
+
)
|
pars-hitmotop-0.1.0/PKG-INFO
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.1
|
2
|
-
Name: pars-hitmotop
|
3
|
-
Version: 0.1.0
|
4
|
-
Summary: pars-hitmotop is now pars-hitmos
|
5
|
-
Classifier: Development Status :: 7 - Inactive
|
6
|
-
Description-Content-Type: text/markdown
|
7
|
-
|
8
|
-
# pars-hitmontop теперь называется pars-hitmos
|
9
|
-
|
10
|
-
Этот пакет был переименован. Вместо этого используйте `pip install pars-hitmos`.
|
11
|
-
|
12
|
-
Новый пакет: https://pypi.org/project/pars-hitmos/
|
13
|
-
|
14
|
-
|
15
|
-
# Оглавление
|
16
|
-
0. [Оглавление](https://github.com/JoyHubN/pars_hitmos#оглавление)
|
17
|
-
1. [Что именно парсит?](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#что-именно-парсит)
|
18
|
-
2. [Как использовать модуль entered_tracks](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#как-использовать-модуль-entered_tracks)
|
19
|
-
3. [Как использовать модуль rating_tracks_count](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#как-использовать-модуль-rating_tracks_count)
|
20
|
-
4. [Как использовать модуль rating_tracks_page](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#как-использовать-модуль-rating_tracks_page)
|
21
|
-
5. [Что можно достать при запросе?](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#что-можно-достать-при-запросе)
|
22
|
-
____
|
23
|
-
Этот проект парсит [музыкальный сайт](https://hitmos.me/)
|
24
|
-
____
|
25
|
-
# Что именно парсит?
|
26
|
-
1. [Рейтинговые треки](https://hitmos.me/songs/top-rated) от 1 до 48;
|
27
|
-
2. Тоже [рейтинговые треки](https://hitmos.me/songs/top-rated) но можно выбрать количество страниц, с которых будет произведен парсинг;
|
28
|
-
3. Треки введенные пользователем. Парсит от 1 трека до конечной страницы (на одной странице 48 треков)
|
29
|
-
____
|
30
|
-
## Как использовать модуль *entered_tracks*
|
31
|
-
```
|
32
|
-
from pars_hitmos.entered_tracks import EnteredTrack
|
33
|
-
result=EnteredTrack('linkin park',10)
|
34
|
-
```
|
35
|
-
1 аргументом (music_name) передается название песни или автора. 2 Аргументом (count) передается количество треков
|
36
|
-
____
|
37
|
-
## Как использовать модуль *rating_tracks_count*
|
38
|
-
```
|
39
|
-
from pars_hitmos.rating_tracks_count import RatingCount
|
40
|
-
result=RatingCount(10)
|
41
|
-
```
|
42
|
-
1 аргументом (count) передается количество песен
|
43
|
-
____
|
44
|
-
## Как использовать модуль *rating_tracks_page*
|
45
|
-
```
|
46
|
-
from pars_hitmos.rating_tracks_page import RatingPage
|
47
|
-
result=RatingPage(10)
|
48
|
-
```
|
49
|
-
1 аргументом (count) передается количество страниц (max 11)
|
50
|
-
____
|
51
|
-
# Что можно достать при запросе?
|
52
|
-
Все возвращается в виде list
|
53
|
-
| Метод | Описание |
|
54
|
-
|----------------|:---------|
|
55
|
-
| result.get_author | Получить автора трека|
|
56
|
-
|result.get_title| Получить название трека|
|
57
|
-
|result.get_url_down|Получить ссылку на скачивание трека|
|
58
|
-
|result.direct_download_link|Получить прямую ссылку на скачивание трека|
|
59
|
-
|result.get_duration|Получить продолжительность трека|
|
60
|
-
|result.get_picture_url|Получить ссылку на обложку трека|
|
61
|
-
|result.get_url_track|Получить ссылку трек|
|
62
|
-
|result.get_all|Получить все данные в виде словаря|
|
63
|
-
|result.get_author_title|Получить лист в виде автор - название|
|
64
|
-
|
65
|
-
____
|
@@ -1,65 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.1
|
2
|
-
Name: pars-hitmotop
|
3
|
-
Version: 0.1.0
|
4
|
-
Summary: pars-hitmotop is now pars-hitmos
|
5
|
-
Classifier: Development Status :: 7 - Inactive
|
6
|
-
Description-Content-Type: text/markdown
|
7
|
-
|
8
|
-
# pars-hitmontop теперь называется pars-hitmos
|
9
|
-
|
10
|
-
Этот пакет был переименован. Вместо этого используйте `pip install pars-hitmos`.
|
11
|
-
|
12
|
-
Новый пакет: https://pypi.org/project/pars-hitmos/
|
13
|
-
|
14
|
-
|
15
|
-
# Оглавление
|
16
|
-
0. [Оглавление](https://github.com/JoyHubN/pars_hitmos#оглавление)
|
17
|
-
1. [Что именно парсит?](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#что-именно-парсит)
|
18
|
-
2. [Как использовать модуль entered_tracks](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#как-использовать-модуль-entered_tracks)
|
19
|
-
3. [Как использовать модуль rating_tracks_count](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#как-использовать-модуль-rating_tracks_count)
|
20
|
-
4. [Как использовать модуль rating_tracks_page](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#как-использовать-модуль-rating_tracks_page)
|
21
|
-
5. [Что можно достать при запросе?](https://github.com/JoyHubN/pars_hitmos/blob/main/README.md#что-можно-достать-при-запросе)
|
22
|
-
____
|
23
|
-
Этот проект парсит [музыкальный сайт](https://hitmos.me/)
|
24
|
-
____
|
25
|
-
# Что именно парсит?
|
26
|
-
1. [Рейтинговые треки](https://hitmos.me/songs/top-rated) от 1 до 48;
|
27
|
-
2. Тоже [рейтинговые треки](https://hitmos.me/songs/top-rated) но можно выбрать количество страниц, с которых будет произведен парсинг;
|
28
|
-
3. Треки введенные пользователем. Парсит от 1 трека до конечной страницы (на одной странице 48 треков)
|
29
|
-
____
|
30
|
-
## Как использовать модуль *entered_tracks*
|
31
|
-
```
|
32
|
-
from pars_hitmos.entered_tracks import EnteredTrack
|
33
|
-
result=EnteredTrack('linkin park',10)
|
34
|
-
```
|
35
|
-
1 аргументом (music_name) передается название песни или автора. 2 Аргументом (count) передается количество треков
|
36
|
-
____
|
37
|
-
## Как использовать модуль *rating_tracks_count*
|
38
|
-
```
|
39
|
-
from pars_hitmos.rating_tracks_count import RatingCount
|
40
|
-
result=RatingCount(10)
|
41
|
-
```
|
42
|
-
1 аргументом (count) передается количество песен
|
43
|
-
____
|
44
|
-
## Как использовать модуль *rating_tracks_page*
|
45
|
-
```
|
46
|
-
from pars_hitmos.rating_tracks_page import RatingPage
|
47
|
-
result=RatingPage(10)
|
48
|
-
```
|
49
|
-
1 аргументом (count) передается количество страниц (max 11)
|
50
|
-
____
|
51
|
-
# Что можно достать при запросе?
|
52
|
-
Все возвращается в виде list
|
53
|
-
| Метод | Описание |
|
54
|
-
|----------------|:---------|
|
55
|
-
| result.get_author | Получить автора трека|
|
56
|
-
|result.get_title| Получить название трека|
|
57
|
-
|result.get_url_down|Получить ссылку на скачивание трека|
|
58
|
-
|result.direct_download_link|Получить прямую ссылку на скачивание трека|
|
59
|
-
|result.get_duration|Получить продолжительность трека|
|
60
|
-
|result.get_picture_url|Получить ссылку на обложку трека|
|
61
|
-
|result.get_url_track|Получить ссылку трек|
|
62
|
-
|result.get_all|Получить все данные в виде словаря|
|
63
|
-
|result.get_author_title|Получить лист в виде автор - название|
|
64
|
-
|
65
|
-
____
|
@@ -1 +0,0 @@
|
|
1
|
-
pars-hitmos
|
@@ -1 +0,0 @@
|
|
1
|
-
|
pars-hitmotop-0.1.0/setup.py
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
from setuptools import setup
|
2
|
-
import os
|
3
|
-
|
4
|
-
VERSION = "0.1.0"
|
5
|
-
|
6
|
-
|
7
|
-
def get_long_description():
|
8
|
-
with open(
|
9
|
-
os.path.join(os.path.dirname(os.path.abspath(__file__)), "README.md"),
|
10
|
-
encoding="utf8",
|
11
|
-
) as fp:
|
12
|
-
return fp.read()
|
13
|
-
|
14
|
-
|
15
|
-
setup(
|
16
|
-
name="pars-hitmotop",
|
17
|
-
description="pars-hitmotop is now pars-hitmos",
|
18
|
-
long_description=get_long_description(),
|
19
|
-
long_description_content_type="text/markdown",
|
20
|
-
version=VERSION,
|
21
|
-
install_requires=["pars-hitmos"],
|
22
|
-
classifiers=["Development Status :: 7 - Inactive"],
|
23
|
-
)
|
File without changes
|
File without changes
|