From 5b88425a3272f244b86ffdd2eb161020926c8524 Mon Sep 17 00:00:00 2001 From: Alexander Demidovskij Date: Sun, 31 Mar 2024 16:00:22 +0300 Subject: [PATCH 01/71] [SYNC] Aligned config with Hello, LLM! (#2) --- .github/workflows/crawler.yml | 9 +- README.rst | 6 +- config/collect_coverage/coverage_analyzer.py | 16 +- config/collect_coverage/run_coverage.py | 12 +- config/common.sh | 4 +- config/generate_stubs/generate_labs_stubs.py | 47 ++++-- config/generate_stubs/generator.py | 41 ++++- config/generate_stubs/run_generator.py | 3 +- config/intersphinx/fastapi.inv | Bin 0 -> 10663 bytes config/intersphinx/pandas.inv | Bin 0 -> 205141 bytes config/intersphinx/pydantic.inv | Bin 0 -> 4436 bytes config/intersphinx/pytorch.inv | Bin 0 -> 124325 bytes config/lab_settings.py | 80 +++++++++ config/labs.txt | 2 - config/precommit.sh | 21 ++- config/project_config.py | 5 +- config/skip_check.py | 1 + config/spellcheck/.wordlist_en.txt | 2 + .../stage_1_style_tests/_stage_run_flake8.sh | 5 + config/stage_1_style_tests/_stage_run_lint.sh | 11 ++ config/stage_1_style_tests/_stage_run_mypy.sh | 9 +- .../stage_1_style_tests/check_actual_stubs.py | 64 +++++-- .../stage_1_style_tests/check_docstrings.py | 49 +++--- config/stage_1_style_tests/newline_check.py | 30 ++-- config/stage_1_style_tests/pydoctest.json | 5 +- .../stage_1_style_tests/requirements_check.py | 42 +++-- .../_stage_check_student_conllu_validation.sh | 3 +- config/website_validation/utils.py | 8 +- .../website_validation/website_validator.py | 18 +- core_utils/article/article.py | 2 +- core_utils/tests/article_test.py | 9 +- .../tests/s2_1_crawler_config_test.py | 12 +- lab_5_scrapper/tests/s2_2_crawler_test.py | 6 +- lab_5_scrapper/tests/s2_3_parser_test.py | 4 - .../s2_4_check_raw_dataset_volume_test.py | 2 - .../tests/s2_5_raw_metadata_test.py | 3 - lab_6_pipeline/tests/s3_1_raw_dataset_test.py | 3 +- .../tests/s3_3_conllu_token_test.py | 8 +- .../s3_4_reference_text_preprocess_test.py | 6 +- .../tests/s3_6_advanced_pipeline_test.py | 3 +- .../tests/s4_pos_frequency_pipeline_test.py | 3 +- lab_6_pipeline/tests/utils.py | 3 +- pyproject.toml | 159 ++++++++++++++---- requirements_qa.txt | 5 +- 44 files changed, 528 insertions(+), 193 deletions(-) create mode 100644 config/intersphinx/fastapi.inv create mode 100644 config/intersphinx/pandas.inv create mode 100644 config/intersphinx/pydantic.inv create mode 100644 config/intersphinx/pytorch.inv create mode 100644 config/lab_settings.py delete mode 100644 config/labs.txt diff --git a/.github/workflows/crawler.yml b/.github/workflows/crawler.yml index 92ab015f..9a9855f6 100644 --- a/.github/workflows/crawler.yml +++ b/.github/workflows/crawler.yml @@ -217,6 +217,7 @@ jobs: name: raw-dataset - name: Run metadata validation run: | + source venv/bin/activate export PYTHONPATH=$(pwd):$PYTHONPATH python config/unpack_archived_dataset.py lab_5_scrapper bash config/_stage_run_pytest.sh "$PR_NAME" "$PR_AUTHOR" -l lab_5_scrapper -m stage_2_5_dataset_validation @@ -289,6 +290,7 @@ jobs: name: raw-dataset - name: Run CorpusManager tests run: | + source venv/bin/activate export PYTHONPATH=$(pwd):$PYTHONPATH python config/unpack_archived_dataset.py lab_6_pipeline bash config/_stage_run_pytest.sh "$PR_NAME" "$PR_AUTHOR" -l lab_6_pipeline -m stage_3_2_corpus_manager_checks @@ -337,6 +339,7 @@ jobs: name: raw-dataset - name: Run metadata validation run: | + source venv/bin/activate export PYTHONPATH=$(pwd):$PYTHONPATH python config/unpack_archived_dataset.py lab_6_pipeline bash config/_stage_run_pytest.sh "$PR_NAME" "$PR_AUTHOR" -l lab_6_pipeline -m stage_3_4_admin_data_processing @@ -394,6 +397,7 @@ jobs: name: processed-dataset - name: Run validation of `_processed.txt` files run: | + source venv/bin/activate export PYTHONPATH=$(pwd):$PYTHONPATH python config/unpack_archived_dataset.py lab_6_pipeline bash config/_stage_run_pytest.sh "$PR_NAME" "$PR_AUTHOR" -l lab_6_pipeline -m stage_3_5_student_dataset_validation @@ -426,9 +430,8 @@ jobs: name: processed-dataset - name: Congratulations run: | - echo "Does not work - #37" -# bash config/stage_5_pos_frequency_pipeline_tests/_stage_check_pos_pipeline.sh "$PR_AUTHOR" -# bash config/_stage_run_pytest.sh "$PR_NAME" "$PR_AUTHOR" -l lab_6_pipeline -m stage_4_pos_frequency_pipeline_checks + bash config/stage_5_pos_frequency_pipeline_tests/_stage_check_pos_pipeline.sh "$PR_AUTHOR" + bash config/_stage_run_pytest.sh "$PR_NAME" "$PR_AUTHOR" -l lab_6_pipeline -m stage_4_pos_frequency_pipeline_checks - name: Archive processed dataset continue-on-error: true uses: actions/upload-artifact@v3 diff --git a/README.rst b/README.rst index 0336676f..d18bc61c 100644 --- a/README.rst +++ b/README.rst @@ -159,8 +159,10 @@ are satisfied:** Resources --------- -1. Academic performance **TBD** -2. Media websites list **TBD** +1. `Academic performance + `__ +2. `Media websites list + `__ 3. `Documentation website `__ 4. `Python programming course from previous semester `__ diff --git a/config/collect_coverage/coverage_analyzer.py b/config/collect_coverage/coverage_analyzer.py index ea515802..b6314792 100644 --- a/config/collect_coverage/coverage_analyzer.py +++ b/config/collect_coverage/coverage_analyzer.py @@ -6,10 +6,10 @@ from pathlib import Path from typing import Iterable, Mapping, Optional -from config.collect_coverage.run_coverage import (CoverageCreateReportError, - CoverageRunError, +from config.collect_coverage.run_coverage import (CoverageCreateReportError, CoverageRunError, run_coverage_collection) from config.constants import PROJECT_CONFIG_PATH, PROJECT_ROOT +from config.lab_settings import LabSettings from config.project_config import ProjectConfig CoverageResults = Mapping[str, Optional[int]] @@ -88,9 +88,17 @@ def main() -> None: project_config = ProjectConfig(PROJECT_CONFIG_PATH) coverage_thresholds = project_config.get_thresholds() - all_labs_names = project_config.get_labs_paths() + all_labs_names = project_config.get_labs_paths(include_addons=False) - all_labs_results = collect_coverage(all_labs_names, artifacts_path) + not_skipped = [] + for lab_path in all_labs_names: + settings = LabSettings(lab_path / 'settings.json') + if settings.target_score == 0: + print(f'Skip {lab_path} as target score is 0') + continue + not_skipped.append(lab_path) + + all_labs_results = collect_coverage(not_skipped, artifacts_path) any_degradation, labs_with_thresholds = \ is_decrease_present(all_labs_results, coverage_thresholds) diff --git a/config/collect_coverage/run_coverage.py b/config/collect_coverage/run_coverage.py index 9b14e213..7a8ef25e 100644 --- a/config/collect_coverage/run_coverage.py +++ b/config/collect_coverage/run_coverage.py @@ -6,6 +6,7 @@ from pathlib import Path from config.cli_unifier import _run_console_tool, choose_python_exe +from config.lab_settings import LabSettings class CoverageRunError(Exception): @@ -30,10 +31,8 @@ def get_target_score(lab_path: Path) -> int: Returns: int: Desired score """ - target_score_file_path = lab_path.joinpath('target_score.txt') - with open(target_score_file_path, 'r', encoding='utf-8') as target_score_file: - content = target_score_file.readline() - return int(content) if content else 0 + settings = LabSettings(lab_path / 'settings.json') + return settings.target_score def extract_percentage_from_report(report_path: Path) -> int: @@ -74,7 +73,10 @@ def run_coverage_collection(lab_path: Path, artifacts_path: Path, args = [ '-m', 'coverage', 'run', - '--include', f'{lab_path.name}/main.py', + '--include', f'{lab_path.name}/main.py,' + f'{lab_path.name}/scrapper.py,' + f'{lab_path.name}/pipeline.py,' + f'{lab_path.name}/pos_pipeline.py', '-m', 'pytest', '-m', f'{lab_path.name}{mark}' ] res_process = _run_console_tool(str(python_exe_path), args, diff --git a/config/common.sh b/config/common.sh index e810587c..691efd51 100644 --- a/config/common.sh +++ b/config/common.sh @@ -1,5 +1,5 @@ get_score() { - export TARGET_SCORE=$(head -2 $1/target_score.txt | tail -1) + export TARGET_SCORE=$(jq -r '.target_score' $1/settings.json) echo ${TARGET_SCORE} } @@ -9,7 +9,7 @@ get_labs() { } configure_script() { - if [[ "$OSTYPE" == "linux-gnu"* ]]; then + if [[ "$OSTYPE" == "linux-gnu"* || "$OSTYPE" == "darwin"* ]]; then source venv/bin/activate export PYTHONPATH=$(pwd):$PYTHONPATH which python diff --git a/config/generate_stubs/generate_labs_stubs.py b/config/generate_stubs/generate_labs_stubs.py index 46b7ff9f..9d5abb52 100644 --- a/config/generate_stubs/generate_labs_stubs.py +++ b/config/generate_stubs/generate_labs_stubs.py @@ -2,13 +2,30 @@ Generator of all labs. """ +from pathlib import Path + from config.constants import PROJECT_CONFIG_PATH, PROJECT_ROOT from config.generate_stubs.generator import cleanup_code -from config.generate_stubs.run_generator import (format_stub_file, - sort_stub_imports) +from config.generate_stubs.run_generator import format_stub_file, sort_stub_imports from config.project_config import ProjectConfig +def _generate_stubs_single_module(module_path: Path) -> None: + """ + Process single module. + + Args: + module_path (Path): Path to module + """ + stub_path = module_path.parent / f'{module_path.stem}_stub{module_path.suffix}' + + source_code = cleanup_code(module_path) + with stub_path.open(mode='w', encoding='utf-8') as f: + f.write(source_code) + format_stub_file(stub_path) + sort_stub_imports(stub_path) + + def generate_all_stubs(project_config: ProjectConfig) -> None: """ Generate stubs for all labs. @@ -17,24 +34,18 @@ def generate_all_stubs(project_config: ProjectConfig) -> None: project_config (ProjectConfig): Project config """ labs = project_config.get_labs_names() - print(labs) for lab_name in labs: print(f'Generating stubs for {lab_name}') - if lab_name == 'lab_5_scrapper': - source_code = cleanup_code(PROJECT_ROOT / lab_name / 'scrapper.py') - with (PROJECT_ROOT / lab_name / 'main_stub.py').open(mode='w', - encoding='utf-8') as f: - f.write(source_code) - format_stub_file(PROJECT_ROOT / lab_name / 'main_stub.py') - sort_stub_imports(PROJECT_ROOT / lab_name / 'main_stub.py') - - elif lab_name == 'lab_6_pipeline': - source_code = cleanup_code(PROJECT_ROOT / lab_name / 'pipeline.py') - with (PROJECT_ROOT / lab_name / 'main_stub.py').open(mode='w', - encoding='utf-8') as f: - f.write(source_code) - format_stub_file(PROJECT_ROOT / lab_name / 'main_stub.py') - sort_stub_imports(PROJECT_ROOT / lab_name / 'main_stub.py') + module_paths = ( + PROJECT_ROOT / lab_name / 'main.py', + PROJECT_ROOT / lab_name / 'start.py', + PROJECT_ROOT / lab_name / 'service.py', + ) + for module_path in module_paths: + if not module_path.exists(): + continue + print(f'\t\t{module_path}') + _generate_stubs_single_module(module_path) def main() -> None: diff --git a/config/generate_stubs/generator.py b/config/generate_stubs/generator.py index 5c94fccc..bd11de6e 100644 --- a/config/generate_stubs/generator.py +++ b/config/generate_stubs/generator.py @@ -1,6 +1,7 @@ """ Generator of stubs for existing lab implementation. """ +# pylint: disable=too-many-statements import ast from _ast import alias, stmt from pathlib import Path @@ -67,8 +68,35 @@ def cleanup_code(source_code_path: Path) -> str: with source_code_path.open(encoding='utf-8') as file: data_2 = ast_comments.parse(file.read(), source_code_path.name) - accepted_modules: dict[str, list[str]] = {'typing': ['*'], 'pathlib': ['Path'], - 'lab_3_generate_by_ngrams.main': ['*']} + accepted_modules: dict[str, list[str]] = { + 'typing': ['*'], + 'torch.utils.data': ['Dataset'], + 'lab_3_generate_by_ngrams.main': ['*'], + 'core_utils.llm.time_decorator': ['report_time'], + } + + if source_code_path.name not in ('start.py', 'service.py'): + accepted_modules['pathlib'] = ['Path'] + accepted_modules['torch'] = [''] + accepted_modules['pandas'] = ['DataFrame'] + accepted_modules['core_utils.llm.llm_pipeline'] = ['AbstractLLMPipeline'] + accepted_modules['core_utils.llm.metrics'] = ['Metrics'] + accepted_modules['core_utils.llm.raw_data_importer'] = ['AbstractRawDataImporter'] + accepted_modules['core_utils.llm.raw_data_preprocessor'] = ['AbstractRawDataPreprocessor'] + accepted_modules['core_utils.llm.task_evaluator'] = ['AbstractTaskEvaluator'] + + if 'reference_lab' in source_code_path.parent.name: + accepted_modules['config.lab_settings'] = ['InferenceParams'] + + if source_code_path.name == 'start.py' and 'llm' in source_code_path.parent.name: + accepted_modules.pop('typing') + + if source_code_path.name == 'main.py' and 'reference_lab' in source_code_path.parent.name: + accepted_modules.pop('pandas') + + if source_code_path.name == 'service.py': + accepted_modules['fastapi'] = ['FastAPI'] + accepted_modules['lab_7_llm.main'] = ['LLMPipeline'] new_decl: list[stmt] = [] @@ -77,6 +105,15 @@ def cleanup_code(source_code_path: Path) -> str: data.body.insert(data_2.body.index(decl_2), decl_2) for decl in data.body: + if isinstance(decl, ast.AsyncFunctionDef) or \ + isinstance(decl, ast.ClassDef) and \ + decl.name == 'Query': + decl = [] # type: ignore + + if source_code_path.name == 'service.py' and \ + isinstance(decl, ast.Assign): + decl = ast.parse("app, pipeline = None, None") # type: ignore + if isinstance(decl, (ast.Import, ast.ImportFrom)): if (module_name := getattr(decl, 'module', None)) is None: module_name = decl.names[0].name diff --git a/config/generate_stubs/run_generator.py b/config/generate_stubs/run_generator.py index b2d2007d..ccd4f30d 100644 --- a/config/generate_stubs/run_generator.py +++ b/config/generate_stubs/run_generator.py @@ -6,8 +6,7 @@ from pathlib import Path from config.cli_unifier import _run_console_tool, choose_python_exe -from config.generate_stubs.generator import (ArgumentParser, - NoDocStringForAMethodError) +from config.generate_stubs.generator import ArgumentParser, NoDocStringForAMethodError def remove_implementation(source_code_path: Path, res_stub_path: Path) -> None: diff --git a/config/intersphinx/fastapi.inv b/config/intersphinx/fastapi.inv new file mode 100644 index 0000000000000000000000000000000000000000..1f4fbd22332526a577fe90f0d0fba47fbf9a1a48 GIT binary patch literal 10663 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 N!Ts|e{}05C46U8!tiS*O literal 0 HcmV?d00001 diff --git a/config/intersphinx/pandas.inv b/config/intersphinx/pandas.inv new file mode 100644 index 0000000000000000000000000000000000000000..d915a1bb875ac4f143f34bdcc98a9ddd6b011322 GIT binary patch literal 205141 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 a>yWz7kJDg3?SGnZ5_2lY!v6=a={G0TG`<=D literal 0 HcmV?d00001 diff --git a/config/intersphinx/pytorch.inv b/config/intersphinx/pytorch.inv new file mode 100644 index 0000000000000000000000000000000000000000..0b9c9947f100916e18fee88912c0871ebda52306 GIT binary patch literal 124325 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 No*l};{{vDyP4bQXJHG$` literal 0 HcmV?d00001 diff --git a/config/lab_settings.py b/config/lab_settings.py new file mode 100644 index 00000000..a4efd3bd --- /dev/null +++ b/config/lab_settings.py @@ -0,0 +1,80 @@ +""" +Settings manager. +""" +import json +# pylint: disable=no-name-in-module +from pathlib import Path + +from pydantic.dataclasses import dataclass +from pydantic.tools import parse_obj_as + + +@dataclass +class ParametersModel: + """ + Additional parameters of a lab. + """ + model: str + dataset: str + metrics: list[str] + + +@dataclass +class InferenceParams: + """ + Inference parameters. + """ + num_samples: int + max_length: int + batch_size: int + predictions_path: Path + device: str + + +@dataclass +class LabSettingsModel: + """ + DTO for storing labs settings. + """ + target_score: int + parameters: ParametersModel | None = None + + +class LabSettings: + """ + Main model for working with settings. + """ + # Labs settings + _dto: LabSettingsModel + + def __init__(self, config_path: Path) -> None: + """ + Initialize LabSettings. + + Args: + config_path (Path): Path to configuration + """ + super().__init__() + with config_path.open(encoding='utf-8') as config_file: + # pylint: disable=no-member + self._dto = parse_obj_as(LabSettingsModel, json.load(config_file)) + + @property + def target_score(self) -> int: + """ + Property for target score. + + Returns: + int: A target score. + """ + return self._dto.target_score + + @property + def parameters(self) -> ParametersModel | None: + """ + Property for additional parameters. + + Returns: + ParametersModel | None: Parameters DTO. + """ + return self._dto.parameters diff --git a/config/labs.txt b/config/labs.txt deleted file mode 100644 index 2d7859d2..00000000 --- a/config/labs.txt +++ /dev/null @@ -1,2 +0,0 @@ -lab_5_scrapper -lab_6_pipeline diff --git a/config/precommit.sh b/config/precommit.sh index b94c6aa6..3e1e5fab 100644 --- a/config/precommit.sh +++ b/config/precommit.sh @@ -1,10 +1,19 @@ set -x echo $1 -if [ $1 == "smoke" ]; then - DIRS_TO_CHECK=("config" "seminars") +if [[ "$1" == "smoke" ]]; then + DIRS_TO_CHECK=( + "config" + "seminars" + ) else - DIRS_TO_CHECK=("lab_1_classify_by_unigrams" "lab_2_tokenize_by_bpe" "lab_3_generate_by_ngrams" "config" "seminars") + DIRS_TO_CHECK=( + "config" + "seminars" + "core_utils" + "lab_5_scrapper" + "lab_6_pipeline" + ) fi python -m pylint --exit-zero --rcfile config/stage_1_style_tests/.pylintrc "${DIRS_TO_CHECK[@]}" @@ -12,3 +21,9 @@ python -m pylint --exit-zero --rcfile config/stage_1_style_tests/.pylintrc "${DI mypy "${DIRS_TO_CHECK[@]}" python -m flake8 "${DIRS_TO_CHECK[@]}" + +if [[ "$1" != "smoke" ]]; then + python -m pytest -m "mark10 and lab_5_scrapper" + python -m pytest -m "mark10 and lab_6_pipeline" +fi + diff --git a/config/project_config.py b/config/project_config.py index bf786a43..6c6d2762 100644 --- a/config/project_config.py +++ b/config/project_config.py @@ -11,6 +11,7 @@ # pylint: disable=no-name-in-module from pydantic.dataclasses import dataclass from pydantic.json import pydantic_encoder +from pydantic.tools import parse_obj_as from config.constants import PROJECT_ROOT @@ -67,9 +68,9 @@ def __init__(self, config_path: Path) -> None: """ super().__init__() with config_path.open(encoding='utf-8', mode='r') as config_file: - json_content = config_file.read() + json_content = json.load(config_file) # pylint: disable=no-member - self._dto = ProjectConfigDTO.__pydantic_model__.parse_raw(f"{json_content}") # type: ignore + self._dto = parse_obj_as(ProjectConfigDTO, json_content) def get_thresholds(self) -> dict: """ diff --git a/config/skip_check.py b/config/skip_check.py index 8beaa50e..8c46d53a 100644 --- a/config/skip_check.py +++ b/config/skip_check.py @@ -1,6 +1,7 @@ """ Check whether PR author is admin or not. """ + import sys from pathlib import Path from typing import Optional diff --git a/config/spellcheck/.wordlist_en.txt b/config/spellcheck/.wordlist_en.txt index ed7180ac..0b145b89 100644 --- a/config/spellcheck/.wordlist_en.txt +++ b/config/spellcheck/.wordlist_en.txt @@ -622,6 +622,7 @@ kwargs lab label laboratory +labsettings language large last @@ -813,6 +814,7 @@ papers param parameter parameters +parametersmodel params parent parsable diff --git a/config/stage_1_style_tests/_stage_run_flake8.sh b/config/stage_1_style_tests/_stage_run_flake8.sh index 510100ea..afe628e7 100644 --- a/config/stage_1_style_tests/_stage_run_flake8.sh +++ b/config/stage_1_style_tests/_stage_run_flake8.sh @@ -10,6 +10,11 @@ configure_script python -m flake8 config seminars +if [ -d "core_utils" ]; then + echo "core_utils exist" + python -m flake8 core_utils +fi + FAILED=0 LABS=$(get_labs) diff --git a/config/stage_1_style_tests/_stage_run_lint.sh b/config/stage_1_style_tests/_stage_run_lint.sh index dd6b3f84..5f5336ef 100644 --- a/config/stage_1_style_tests/_stage_run_lint.sh +++ b/config/stage_1_style_tests/_stage_run_lint.sh @@ -18,6 +18,17 @@ python config/stage_1_style_tests/lint_level.py \ check_if_failed +if [ -d "core_utils" ]; then + echo "core_utils exist" + lint_output=$(python -m pylint --exit-zero --rcfile config/stage_1_style_tests/.pylintrc core_utils) + + python config/stage_1_style_tests/lint_level.py \ + --lint-output "${lint_output}" \ + --target-score "10" + + check_if_failed +fi + LABS=$(get_labs) for LAB_NAME in $LABS; do diff --git a/config/stage_1_style_tests/_stage_run_mypy.sh b/config/stage_1_style_tests/_stage_run_mypy.sh index abfee667..ed41e3c4 100644 --- a/config/stage_1_style_tests/_stage_run_mypy.sh +++ b/config/stage_1_style_tests/_stage_run_mypy.sh @@ -11,10 +11,17 @@ configure_script FAILED=0 LABS=$(get_labs) -#mypy config seminars +mypy config seminars check_if_failed +if [ -d "core_utils" ]; then + echo "core_utils exist" + mypy core_utils + + check_if_failed +fi + for LAB_NAME in $LABS; do echo "Running mypy for lab ${LAB_NAME}" TARGET_SCORE=$(get_score ${LAB_NAME}) diff --git a/config/stage_1_style_tests/check_actual_stubs.py b/config/stage_1_style_tests/check_actual_stubs.py index 6c5df0e2..bbcfbffe 100644 --- a/config/stage_1_style_tests/check_actual_stubs.py +++ b/config/stage_1_style_tests/check_actual_stubs.py @@ -1,14 +1,13 @@ """ -Checks the relevance of stubs. +Check the relevance of stubs. """ - +# pylint: disable=too-many-locals, too-many-statements import sys from pathlib import Path from config.constants import PROJECT_CONFIG_PATH from config.generate_stubs.generator import cleanup_code -from config.generate_stubs.run_generator import (format_stub_file, - sort_stub_imports) +from config.generate_stubs.run_generator import format_stub_file, sort_stub_imports from config.project_config import ProjectConfig @@ -35,7 +34,11 @@ def clear_examples(lab_path: Path) -> None: lab_path (Path): Path to temp files """ example_main_stub_path = lab_path / 'example_main_stub.py' + example_start_stub_path = lab_path / 'example_start_stub.py' + example_service_stub_path = lab_path / 'example_service_stub.py' + example_start_stub_path.unlink() example_main_stub_path.unlink() + example_service_stub_path.unlink() def main() -> None: @@ -43,20 +46,25 @@ def main() -> None: Check the relevance of stubs. """ project_config = ProjectConfig(PROJECT_CONFIG_PATH) - labs_paths = project_config.get_labs_paths()[:2] + labs_paths = project_config.get_labs_paths() code_is_equal = True for lab_path in labs_paths: - print(lab_path.name) + print(f'Processing {lab_path}...') main_stub_path = lab_path / 'main_stub.py' + start_stub_path = lab_path / 'start_stub.py' + service_stub_path = lab_path / 'service_stub.py' - main_stub_code = get_code(main_stub_path) - - if lab_path.name == 'lab_5_scrapper': - clean_main = cleanup_code(lab_path / 'scrapper.py') + if not main_stub_path.exists() or not start_stub_path.exists() or \ + not service_stub_path.exists(): + print(f'Ignoring {main_stub_path} or {start_stub_path} or {service_stub_path}: ' + f'do not exist') + continue - elif lab_path.name == 'lab_6_pipeline': - clean_main = cleanup_code(lab_path / 'pipeline.py') + main_stub_code = get_code(main_stub_path) + start_stub_code = get_code(start_stub_path) + service_stub_code = get_code(service_stub_path) + clean_main = cleanup_code(lab_path / 'main.py') example_main_stub_path = lab_path / 'example_main_stub.py' with example_main_stub_path.open(mode='w', encoding='utf-8') as file: file.write(clean_main) @@ -64,10 +72,42 @@ def main() -> None: sort_stub_imports(example_main_stub_path) formatted_main = get_code(example_main_stub_path) + clean_start = cleanup_code(lab_path / 'start.py') + example_start_stub_path = lab_path / 'example_start_stub.py' + with example_start_stub_path.open(mode='w', encoding='utf-8') as file: + file.write(clean_start) + format_stub_file(example_start_stub_path) + sort_stub_imports(example_start_stub_path) + formatted_start = get_code(example_start_stub_path) + + clean_service = cleanup_code(lab_path / 'service.py') + example_service_stub_path = lab_path / 'example_service_stub.py' + with example_service_stub_path.open(mode='w', encoding='utf-8') as file: + file.write(clean_service) + format_stub_file(example_service_stub_path) + sort_stub_imports(example_service_stub_path) + formatted_service = get_code(example_service_stub_path) + if formatted_main != main_stub_code: code_is_equal = False print(f'You have different main and main_stub in {lab_path}') + if formatted_start != start_stub_code: + code_is_equal = False + print(f'You have different start and start_stub in {lab_path}') + + if formatted_service != service_stub_code: + code_is_equal = False + print(f'You have different service and service_stub in {lab_path}') + + if lab_path.name == 'lab_8_llm': + lab_7_main = get_code(lab_path / 'main.py') + lab_8_main = get_code(lab_path.parent / 'lab_7_llm' / 'main.py') + + if lab_7_main != lab_8_main: + code_is_equal = False + print('You have different main for Lab 7 and Lab 8!') + clear_examples(lab_path) if code_is_equal: print('All stubs are relevant') diff --git a/config/stage_1_style_tests/check_docstrings.py b/config/stage_1_style_tests/check_docstrings.py index 810daced..7e5c84eb 100644 --- a/config/stage_1_style_tests/check_docstrings.py +++ b/config/stage_1_style_tests/check_docstrings.py @@ -7,26 +7,21 @@ from pathlib import Path from config.cli_unifier import _run_console_tool, choose_python_exe -from config.constants import PROJECT_ROOT +from config.constants import PROJECT_CONFIG_PATH, PROJECT_ROOT +from config.project_config import ProjectConfig def get_files() -> list: """ - Get paths to files in config, core_utils and labs packages. + Get paths to files in config and core_utils packages. Returns: list: File paths """ - directories = [ - 'config', - 'core_utils', - 'lab_5_scrapper', - 'lab_6_pipeline' - ] - excluded_files = ['__init__.py', 'validate.py', 'main_stub.py'] + directories = ['config', 'core_utils'] file_paths = [file for directory in directories for file in Path(PROJECT_ROOT / directory).glob('**/*.py') - if file.name not in excluded_files] + if file.name != '__init__.py' and 'ud_validator' not in str(file)] return file_paths @@ -84,15 +79,17 @@ def check_file(path_to_file: Path) -> str: pydoctest_config = PROJECT_ROOT / 'config' / 'stage_1_style_tests' / 'pydoctest.json' pydoctest_checks = check_with_pydoctest(path_to_file, pydoctest_config) if pydoctest_checks.returncode == 0: - print(f'All docstrings in {path_to_file} conform to Google-style' - f'according to Pydoctest.\n') + # print(f'All docstrings in {path_to_file} conform to Google-style' + # f'according to Pydoctest.\n') + pass else: errors += f'Pydoctest errors:\n{pydoctest_checks.stdout}' pydocstyle_checks = check_with_pydocstyle(path_to_file) if pydocstyle_checks.returncode == 0: - print(f'All docstrings in {path_to_file} conform to Google-style' - f'according to Pydocstyle.\n') + # print(f'All docstrings in {path_to_file} conform to Google-style' + # f'according to Pydocstyle.\n') + pass else: errors += f'Pydocstyle errors:\n{pydocstyle_checks.stdout}' @@ -108,16 +105,30 @@ def main() -> None: """ all_errors = [] check_is_good = True + project_config = ProjectConfig(PROJECT_CONFIG_PATH) + labs_list = project_config.get_labs_paths() files_list = get_files() - # check docstrings in config, core_utils, lab_5 and lab_6 + # check docstrings in config and core_utils for file in files_list: - if not file.exists(): - print(f'\nIgnoring {file}: it does not exist.') - continue - print(f'\nChecking {file}') all_errors.append(check_file(file)) + # check docstrings in labs + for lab_path in labs_list: + paths = ( + lab_path / 'main.py', + lab_path / 'scrapper.py', + lab_path / 'scrapper_dynamic.py', + lab_path / 'pipeline.py', + lab_path / 'pos_frequency_pipeline.py', + ) + for path in paths: + if not path.exists(): + print(f'\nIgnoring {path}: it does not exist.') + continue + + all_errors.append(check_file(path)) + if not all(el == '' for el in all_errors): check_is_good = False print('\n'.join(all_errors)) diff --git a/config/stage_1_style_tests/newline_check.py b/config/stage_1_style_tests/newline_check.py index 3acc9d8f..87bd7176 100644 --- a/config/stage_1_style_tests/newline_check.py +++ b/config/stage_1_style_tests/newline_check.py @@ -1,6 +1,7 @@ """ -Check newline at the end. +Check newline at the end of a file. """ + import sys from config.constants import PROJECT_ROOT @@ -13,25 +14,34 @@ def get_paths() -> list: Returns: list: Paths to non-python files """ - paths_to_exclude = [ + paths_to_exclude = { 'venv', '.git', '.idea', '.coverage', '.mypy_cache', '.pytest_cache', + '__pycache__', 'build', - 'russian-syntagrus-ud-2.0-170801.udpipe' - ] + '_build', + 'intersphinx', + 'test_tmp', + 'dist' + } + + only_sources = [file for file in PROJECT_ROOT.iterdir() if file.name not in paths_to_exclude] list_with_paths = [] - for file in PROJECT_ROOT.iterdir(): - if file.name in paths_to_exclude or file.name.endswith('.udpipe'): + for source_file in only_sources: + if not source_file.is_dir(): + list_with_paths.append(source_file) continue - if file.is_dir(): - list_with_paths.extend(sorted(file.rglob('*'))) - else: - list_with_paths.append(file) + + list_with_paths.extend([ + file + for file in source_file.rglob('*') + if not set(i.name for i in file.parents) & paths_to_exclude + ]) return list_with_paths diff --git a/config/stage_1_style_tests/pydoctest.json b/config/stage_1_style_tests/pydoctest.json index 125bfe90..effee681 100644 --- a/config/stage_1_style_tests/pydoctest.json +++ b/config/stage_1_style_tests/pydoctest.json @@ -2,5 +2,8 @@ "parser": "google", "fail_on_missing_docstring": true, "fail_on_missing_summary": true, - "fail_on_raises_section": false + "fail_on_raises_section": false, + "exclude_functions": [ + "init_application" + ] } diff --git a/config/stage_1_style_tests/requirements_check.py b/config/stage_1_style_tests/requirements_check.py index 845f1e5f..66c2dfdf 100644 --- a/config/stage_1_style_tests/requirements_check.py +++ b/config/stage_1_style_tests/requirements_check.py @@ -1,6 +1,7 @@ """ -Checks dependencies. +Check dependencies. """ + import re import sys from pathlib import Path @@ -15,11 +16,11 @@ def get_paths() -> list[Path]: Returns: list[Path]: Paths to non-python files """ - list_with_paths = [] - for file in PROJECT_ROOT.iterdir(): - if file.name in ['requirements.txt', 'requirements_qa.txt']: - list_with_paths.append(file) - return list_with_paths + return [ + path + for path in PROJECT_ROOT.rglob('requirements*.txt') + if 'venv' not in str(path) + ] def get_requirements(path: Path) -> list: @@ -44,29 +45,41 @@ def compile_pattern() -> re.Pattern: Returns: re.Pattern: Compiled pattern """ - return re.compile(r'\w+(-\w+|\[\w+\])*==\d+(\.\d+)+') + return re.compile(r'((\w+(-\w+|\[\w+\])*==\d+(\.\d+)+)' + r'|((-r|--extra-index-url)\s.*))', re.MULTILINE) -def check_dependencies(lines: list, compiled_pattern: re.Pattern) -> bool: +def check_dependencies(lines: list, compiled_pattern: re.Pattern, path: Path) -> bool: """ Check that dependencies confirm to the template. Args: lines (list): Dependencies compiled_pattern (re.Pattern): Compiled pattern + path (Path): Path to file with dependencies Returns: bool: Do dependencies confirm to the template or not """ - expected = list(sorted(map(str.lower, lines))) - if expected != list(map(str.lower, lines)): - print('Dependencies in requirements.txt do not follow sorting rule.') + expected = [ + i + for i in sorted(map(str.lower, lines)) + if i.split()[0] not in ('--extra-index-url',) + ] + actual = [ + i + for i in map(str.lower, lines) + if i.split()[0] not in ('--extra-index-url',) + ] + if expected != actual: + print(f'Dependencies in {path.relative_to(PROJECT_ROOT)} do not follow sorting rule.') print('Expected:') print('\n'.join(expected)) return False for line in lines: if not re.search(compiled_pattern, line): - print('Specific dependency in requirements.txt do not conform to the template.') + print(f'Specific dependency in {path.relative_to(PROJECT_ROOT)} ' + 'do not conform to the template.') print(line) return False return True @@ -80,10 +93,11 @@ def main() -> None: compiled_pattern = compile_pattern() for path in paths: lines = get_requirements(path) - if not check_dependencies(lines, compiled_pattern): + if not check_dependencies(lines, compiled_pattern, path): + print(f'{path.relative_to(PROJECT_ROOT)} : FAIL') sys.exit(1) else: - print(f'{path.name} : OK.') + print(f'{path.relative_to(PROJECT_ROOT)} : OK') if __name__ == '__main__': diff --git a/config/stage_3_pipeline_tests/_stage_check_student_conllu_validation.sh b/config/stage_3_pipeline_tests/_stage_check_student_conllu_validation.sh index 6491f66b..8a780cf3 100644 --- a/config/stage_3_pipeline_tests/_stage_check_student_conllu_validation.sh +++ b/config/stage_3_pipeline_tests/_stage_check_student_conllu_validation.sh @@ -10,8 +10,7 @@ configure_script if [[ ${TARGET_SCORE} -gt 4 ]]; then echo "Running validation" for file in tmp/articles/*.conllu; do - echo "Skipped all conllu checks due to #36" -# python core_utils/tools/ud_validator/validate.py --lang ru --max-err=0 --level 5 --no-space-after --multiple-roots --no-tree-text $file + python core_utils/tools/ud_validator/validate.py --lang ru --max-err=0 --level 5 --no-space-after --multiple-roots --no-tree-text $file done else echo "Skip stage" diff --git a/config/website_validation/utils.py b/config/website_validation/utils.py index cd6b92b9..42aa570a 100644 --- a/config/website_validation/utils.py +++ b/config/website_validation/utils.py @@ -12,11 +12,9 @@ from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By -from config.website_validation.constants import (CSV_REPORT_PATH, DIST_PATH, - JSON_BLACKLIST_PATH, - JSON_REPORT_PATH, - JSON_WHITELIST_PATH, - CheckStatuses) +from config.website_validation.constants import (CheckStatuses, CSV_REPORT_PATH, DIST_PATH, + JSON_BLACKLIST_PATH, JSON_REPORT_PATH, + JSON_WHITELIST_PATH) from lab_5_scrapper.scrapper import Config diff --git a/config/website_validation/website_validator.py b/config/website_validation/website_validator.py index 01f7ece8..1126c256 100644 --- a/config/website_validation/website_validator.py +++ b/config/website_validation/website_validator.py @@ -8,23 +8,19 @@ import bs4 as bs import requests -from selenium.common.exceptions import (ElementClickInterceptedException, - NoSuchElementException, +from selenium.common.exceptions import (ElementClickInterceptedException, NoSuchElementException, TimeoutException, WebDriverException) from selenium.webdriver.chrome.webdriver import WebDriver from selenium.webdriver.common.by import By from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support.wait import WebDriverWait -from config.website_validation.constants import (BUTTONS_PATH, CONFIG_PATH, - DIST_PATH, HEADERS_ATTEMPTS, - CheckStatuses) -from config.website_validation.utils import (SiteCheckResult, SiteCheckStatus, - create_driver, - define_blacklist_and_whitelist, - get_amount_links_selenium, - save_lists_to_json, save_to_csv, - save_to_json) +from config.website_validation.constants import (BUTTONS_PATH, CheckStatuses, CONFIG_PATH, + DIST_PATH, HEADERS_ATTEMPTS) +from config.website_validation.utils import (create_driver, define_blacklist_and_whitelist, + get_amount_links_selenium, save_lists_to_json, + save_to_csv, save_to_json, SiteCheckResult, + SiteCheckStatus) from lab_5_scrapper.scrapper import Config, make_request diff --git a/core_utils/article/article.py b/core_utils/article/article.py index aa937959..22b2bcb3 100644 --- a/core_utils/article/article.py +++ b/core_utils/article/article.py @@ -177,7 +177,7 @@ def get_conllu_text(self, include_morphological_tags: bool) -> str: str: A text in the CONLL-U format """ return '\n'.join([sentence.get_conllu_text(include_morphological_tags) for sentence in - self._conllu_sentences]) + '\n' + self._conllu_sentences]) def set_conllu_sentences(self, sentences: Sequence[SentenceProtocol]) -> None: """ diff --git a/core_utils/tests/article_test.py b/core_utils/tests/article_test.py index 1b439b25..e68ff4bd 100644 --- a/core_utils/tests/article_test.py +++ b/core_utils/tests/article_test.py @@ -9,15 +9,12 @@ import pytest -from config.test_params import (CORE_UTILS_TEST_FILES_FOLDER, PROJECT_ROOT, - TEST_PATH) +from config.test_params import CORE_UTILS_TEST_FILES_FOLDER, PROJECT_ROOT, TEST_PATH from core_utils.article import article from core_utils.article.article import (Article, ArtifactType, date_from_meta, get_article_id_from_filepath) -from core_utils.article.io import (from_meta, from_raw, to_cleaned, to_conllu, - to_meta, to_raw) -from core_utils.article.ud import (TagConverter, - extract_sentences_from_raw_conllu) +from core_utils.article.io import from_meta, from_raw, to_cleaned, to_conllu, to_meta, to_raw +from core_utils.article.ud import extract_sentences_from_raw_conllu, TagConverter from core_utils.tests.utils import universal_setup diff --git a/lab_5_scrapper/tests/s2_1_crawler_config_test.py b/lab_5_scrapper/tests/s2_1_crawler_config_test.py index 59ca3c0c..91db35cb 100644 --- a/lab_5_scrapper/tests/s2_1_crawler_config_test.py +++ b/lab_5_scrapper/tests/s2_1_crawler_config_test.py @@ -11,15 +11,11 @@ import pytest from config.test_params import TEST_CRAWLER_CONFIG_PATH, TEST_PATH -from core_utils.constants import (CRAWLER_CONFIG_PATH, TIMEOUT_LOWER_LIMIT, - TIMEOUT_UPPER_LIMIT) +from core_utils.constants import CRAWLER_CONFIG_PATH, TIMEOUT_LOWER_LIMIT, TIMEOUT_UPPER_LIMIT from lab_5_scrapper import scrapper -from lab_5_scrapper.scrapper import (IncorrectEncodingError, - IncorrectHeadersError, - IncorrectNumberOfArticlesError, - IncorrectSeedURLError, - IncorrectTimeoutError, - IncorrectVerifyError, +from lab_5_scrapper.scrapper import (IncorrectEncodingError, IncorrectHeadersError, + IncorrectNumberOfArticlesError, IncorrectSeedURLError, + IncorrectTimeoutError, IncorrectVerifyError, NumberOfArticlesOutOfRangeError) from lab_5_scrapper.tests.config_generator import generate_config diff --git a/lab_5_scrapper/tests/s2_2_crawler_test.py b/lab_5_scrapper/tests/s2_2_crawler_test.py index dfd02c1d..04eeb1e7 100644 --- a/lab_5_scrapper/tests/s2_2_crawler_test.py +++ b/lab_5_scrapper/tests/s2_2_crawler_test.py @@ -9,8 +9,7 @@ from config.test_params import TEST_PATH from core_utils.constants import CRAWLER_CONFIG_PATH -from lab_5_scrapper.scrapper import (Config, Crawler, make_request, - prepare_environment) +from lab_5_scrapper.scrapper import Config, Crawler, make_request, prepare_environment class CrawlerTest(unittest.TestCase): @@ -45,7 +44,6 @@ def test_newly_created_crawler_instance_empty(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_2_crawler_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip('#38') def test_crawler_instance_is_filled_from_find_articles(self) -> None: """ Ensure find_articles() fills 'urls' field. @@ -78,7 +76,6 @@ def test_crawler_instance_stores_full_urls(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_2_crawler_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip('#38') def test_crawler_finds_required_number_of_articles(self) -> None: """ Ensure Crawler is capable to collect required number of articles. @@ -112,7 +109,6 @@ def test_crawler_get_search_urls(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_2_crawler_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip('#38') def test_crawler_handles_unavailable_websites(self) -> None: """ Ensure does not fail given unavailable webpage. diff --git a/lab_5_scrapper/tests/s2_3_parser_test.py b/lab_5_scrapper/tests/s2_3_parser_test.py index 54a6f0da..53293d7a 100644 --- a/lab_5_scrapper/tests/s2_3_parser_test.py +++ b/lab_5_scrapper/tests/s2_3_parser_test.py @@ -34,7 +34,6 @@ def setUp(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_3_HTML_parser_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_html_parser_instantiation(self) -> None: """ Ensure Parser is instantiated correctly. @@ -54,7 +53,6 @@ def test_html_parser_instantiation(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_3_HTML_parser_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_html_parser_parse_return_value_basic(self) -> None: """ Ensure Parser.parser() returns Article with filled text field. @@ -73,7 +71,6 @@ def test_html_parser_parse_return_value_basic(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_3_HTML_parser_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_html_parser_parse_return_value_medium(self) -> None: """ Ensure Parser.parser() returns Article with filled title and author. @@ -89,7 +86,6 @@ def test_html_parser_parse_return_value_medium(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_3_HTML_parser_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_html_parser_parse_method_advanced(self) -> None: """ Ensure Parser.parser() returns Article with filled date field. diff --git a/lab_5_scrapper/tests/s2_4_check_raw_dataset_volume_test.py b/lab_5_scrapper/tests/s2_4_check_raw_dataset_volume_test.py index 79c3c330..43bf98f7 100644 --- a/lab_5_scrapper/tests/s2_4_check_raw_dataset_volume_test.py +++ b/lab_5_scrapper/tests/s2_4_check_raw_dataset_volume_test.py @@ -27,7 +27,6 @@ def setUp(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_4_dataset_volume_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_folder_is_not_empty(self) -> None: """ Ensure there are collected articles. @@ -40,7 +39,6 @@ def test_folder_is_not_empty(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_4_dataset_volume_check @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_folder_has_equal_number_of_files(self) -> None: """ Ensure there are equal number of raw and meta files. diff --git a/lab_5_scrapper/tests/s2_5_raw_metadata_test.py b/lab_5_scrapper/tests/s2_5_raw_metadata_test.py index 51b14756..bc7f09df 100644 --- a/lab_5_scrapper/tests/s2_5_raw_metadata_test.py +++ b/lab_5_scrapper/tests/s2_5_raw_metadata_test.py @@ -122,7 +122,6 @@ def setUp(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_5_dataset_validation @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_validate_sort_metadata(self) -> None: """ Ensure meta files numeration is homogeneous. @@ -138,7 +137,6 @@ def test_validate_sort_metadata(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_5_dataset_validation @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_validate_metadata_medium(self) -> None: """ Ensure collected metadata is valid. @@ -209,7 +207,6 @@ def setUp(self) -> None: @pytest.mark.mark10 @pytest.mark.stage_2_5_dataset_validation @pytest.mark.lab_5_scrapper - @pytest.mark.skip("#34 - does not work") def test_validate_metadata_advanced(self) -> None: """ Ensure that collected data includes correct date and topics. diff --git a/lab_6_pipeline/tests/s3_1_raw_dataset_test.py b/lab_6_pipeline/tests/s3_1_raw_dataset_test.py index 87b9a2ed..0e9be9f0 100644 --- a/lab_6_pipeline/tests/s3_1_raw_dataset_test.py +++ b/lab_6_pipeline/tests/s3_1_raw_dataset_test.py @@ -9,8 +9,7 @@ import pytest from lab_5_scrapper.tests.s2_1_crawler_config_test import ExtendedTestCase -from lab_6_pipeline.pipeline import (CorpusManager, EmptyDirectoryError, - InconsistentDatasetError) +from lab_6_pipeline.pipeline import CorpusManager, EmptyDirectoryError, InconsistentDatasetError print("Stage 2A: Validating Assets Path") print("Starting tests with received assets folder") diff --git a/lab_6_pipeline/tests/s3_3_conllu_token_test.py b/lab_6_pipeline/tests/s3_3_conllu_token_test.py index 611d5598..4759a239 100644 --- a/lab_6_pipeline/tests/s3_3_conllu_token_test.py +++ b/lab_6_pipeline/tests/s3_3_conllu_token_test.py @@ -13,6 +13,7 @@ class ConlluTokenTestMinimal(unittest.TestCase): """ Tests for ConlluToken mark 4 realization. """ + def setUp(self) -> None: """ Define start instructions for ConlluTokenTestMinimal class. @@ -25,7 +26,7 @@ def test_conllu_token_instantiation(self) -> None: """ new_token = ConlluToken('оригинальное слово') self.assertTrue(hasattr(new_token, '_text'), - "ConlluToken instance must possess the following arguments: '_text'") + "ConlluToken instance must possess the following arguments: '_text'") @pytest.mark.mark4 @pytest.mark.mark6 @@ -92,6 +93,7 @@ class ConlluSentenceMinimalTest(unittest.TestCase): """ Tests for ConlluSentence mark 4 realization. """ + def setUp(self) -> None: """ Define start instructions for ConlluSentenceMinimalTest class. @@ -113,6 +115,7 @@ def test_get_cleaned(self) -> None: self.assertEqual(self.sentence.get_cleaned_sentence(), 'мама мыла 10') +@pytest.mark.skip class ConlluSentenceTest(unittest.TestCase): """ Tests for ConlluSentence realization. @@ -132,7 +135,8 @@ def test_get_tokens(self) -> None: """ Test for get_tokens method. """ - self.assertEqual(self.sentence.get_tokens(), self.sentence._tokens) # pylint: disable=protected-access + self.assertEqual(self.sentence.get_tokens(), + self.sentence._tokens) # pylint: disable=protected-access @pytest.mark.skip diff --git a/lab_6_pipeline/tests/s3_4_reference_text_preprocess_test.py b/lab_6_pipeline/tests/s3_4_reference_text_preprocess_test.py index 2092f36f..eddb0b19 100644 --- a/lab_6_pipeline/tests/s3_4_reference_text_preprocess_test.py +++ b/lab_6_pipeline/tests/s3_4_reference_text_preprocess_test.py @@ -11,14 +11,14 @@ from config.test_params import PIPE_TEST_FILES_FOLDER, TEST_PATH from core_utils.article import article from core_utils.article.ud import extract_sentences_from_raw_conllu -from lab_6_pipeline.pipeline import (CorpusManager, - MorphologicalAnalysisPipeline) +from lab_6_pipeline.pipeline import CorpusManager, MorphologicalAnalysisPipeline from lab_6_pipeline.tests.utils import pipeline_test_files_setup UD_TAGS = ['ADJ', 'ADP', 'ADV', 'AUX', 'CCONJ', 'DET', 'INTJ', 'NOUN', 'NUM', 'PART', 'PRON', 'PROPN', 'PUNCT', 'SCONJ', 'SYM', 'VERB', 'X'] +@pytest.mark.skip class ReferenceTextPreprocessTestSimplified(unittest.TestCase): """ Tests for simplified preprocessing of reference text. @@ -89,6 +89,7 @@ def tearDownClass(cls) -> None: """ shutil.rmtree(TEST_PATH) + @pytest.mark.skip class ReferenceTextPreprocessAdvancedTest(unittest.TestCase): """ @@ -226,6 +227,7 @@ def tearDownClass(cls) -> None: """ shutil.rmtree(TEST_PATH) + @pytest.mark.skip class ReferenceTextPreprocessBasicTest(unittest.TestCase): """ diff --git a/lab_6_pipeline/tests/s3_6_advanced_pipeline_test.py b/lab_6_pipeline/tests/s3_6_advanced_pipeline_test.py index 2828d015..e7bb20a9 100644 --- a/lab_6_pipeline/tests/s3_6_advanced_pipeline_test.py +++ b/lab_6_pipeline/tests/s3_6_advanced_pipeline_test.py @@ -12,8 +12,7 @@ from config.test_params import PIPE_TEST_FILES_FOLDER, TEST_PATH from core_utils.article import article from core_utils.article.ud import TagConverter -from lab_6_pipeline.pipeline import (CorpusManager, - MorphologicalAnalysisPipeline) +from lab_6_pipeline.pipeline import CorpusManager, MorphologicalAnalysisPipeline from lab_6_pipeline.tests.utils import pipeline_test_files_setup diff --git a/lab_6_pipeline/tests/s4_pos_frequency_pipeline_test.py b/lab_6_pipeline/tests/s4_pos_frequency_pipeline_test.py index a5606634..102b80f9 100644 --- a/lab_6_pipeline/tests/s4_pos_frequency_pipeline_test.py +++ b/lab_6_pipeline/tests/s4_pos_frequency_pipeline_test.py @@ -12,8 +12,7 @@ from config.test_params import PIPE_TEST_FILES_FOLDER, TEST_PATH from core_utils.article.article import ArtifactType from lab_6_pipeline.pipeline import CorpusManager -from lab_6_pipeline.pos_frequency_pipeline import (EmptyFileError, - POSFrequencyPipeline) +from lab_6_pipeline.pos_frequency_pipeline import EmptyFileError, POSFrequencyPipeline from lab_6_pipeline.tests.utils import pipeline_test_files_setup UD_TAGS = ['ADJ', 'ADP', 'ADV', 'AUX', 'CCONJ', 'DET', 'INTJ', 'NOUN', 'NUM', diff --git a/lab_6_pipeline/tests/utils.py b/lab_6_pipeline/tests/utils.py index 0ec0f9a8..eef5c8fd 100644 --- a/lab_6_pipeline/tests/utils.py +++ b/lab_6_pipeline/tests/utils.py @@ -7,8 +7,7 @@ from core_utils.article import article from core_utils.constants import ASSETS_PATH from core_utils.tests.utils import copy_student_data -from lab_6_pipeline.pipeline import (CorpusManager, - MorphologicalAnalysisPipeline) +from lab_6_pipeline.pipeline import CorpusManager, MorphologicalAnalysisPipeline def pipeline_test_files_setup(txt: bool = True, meta: bool = True) -> None: diff --git a/pyproject.toml b/pyproject.toml index 76c85321..217fe997 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,44 +27,15 @@ norecursedirs = [ [tool.coverage.run] omit = [ '*/tests/*', + '*/start.py', '*/ud_validator/*', 'lab_5_scrapper/scrapper_dynamic.py', ] -[tool.mypy] -python_version = "3.10" -exclude = [ - 'venv*', - 'tests/', - 'tools/' -] - [tool.black] line-length = 100 target-version = ['py310'] -disallow_untyped_defs = true -disallow_any_unimported = false -no_implicit_optional = true -check_untyped_defs = true -warn_return_any = true -show_error_codes = true -warn_unused_ignores = false - -# simplifications -disable_error_code = [ - 'var-annotated', - 'union-attr', - - # needed for seminars, to this moment not fixed: https://github.com/python/mypy/issues/9440 - 'attr-defined' -] - -[[tool.mypy.overrides]] -module = ['ghapi.all', 'matplotlib', 'matplotlib.pyplot', 'pydantic', -'pymorphy2', 'pymorphy2.tagset', 'pymystem3', 'ast_comments'] -ignore_missing_imports = true - [tool.doc8] allow-long-titles = true max-line-length = 100 @@ -92,6 +63,76 @@ application_import_names = ['config'] select = ['I'] count = true +[tool.isort] +py_version = '310' +skip_gitignore = true +line_length = 100 +order_by_type = true +remove_redundant_aliases = true +group_by_package = true +force_alphabetical_sort_within_sections = true +src_paths = [ + "reference_lab_classification", + "reference_lab_summarization", + "reference_lab_nmt", + "reference_lab_nli", + "reference_lab_generation", + "reference_lab_open_qa", + "core_utils", + "config", + "lab_5_scrapper", + "lab_6_pipeline", + "lab_7_llm", + "lab_8_llm" +] + +[tool.mypy] +python_version = "3.10" +exclude = [ + 'venv*', + 'test.py', + 'tests/', + 'tools/' +] + +disallow_untyped_defs = true +disallow_any_unimported = true +no_implicit_optional = true +check_untyped_defs = true +warn_return_any = true +show_error_codes = true +warn_unused_ignores = false + +# simplifications +disable_error_code = [ + 'var-annotated', + 'union-attr', + + # needed for seminars, to this moment not fixed: https://github.com/python/mypy/issues/9440 + 'attr-defined' +] + +[[tool.mypy.overrides]] +module = [ + 'ast_comments', + 'datasets', + 'evaluate', + 'fastapi', + 'ghapi.all', + 'matplotlib', + 'matplotlib.pyplot', + 'memory_profiler', + 'pydantic', + 'pymorphy2', + 'pymorphy2.tagset', + 'pymystem3', + 'spacy_udpipe', + 'spacy_conll', + 'torch.*', + 'transformers', +] +ignore_missing_imports = true + [[tool.mypy.overrides]] module = ['seminars.*', ] disable_error_code = [ @@ -100,6 +141,53 @@ disable_error_code = [ 'operator' ] +[[tool.mypy.overrides]] +module = ['config.lab_settings', ] +disable_error_code = [ + 'assignment' +] + +[[tool.mypy.overrides]] +module = ['seminars.seminar_01_16_2024.try_iter_data', ] +disable_error_code = [ + 'arg-type' +] + +[[tool.mypy.overrides]] +module = [ + 'core_utils.llm.llm_pipeline', + 'lab_7_llm.service', + 'lab_7_llm.main', + 'lab_8_llm.service', + 'lab_8_llm.main', +] +disable_error_code = [ + 'no-any-unimported' +] + +[[tool.mypy.overrides]] +module = [ + 'core_utils.udpipe.tools', +] +disable_error_code = [ + 'no-any-unimported', + 'no-any-return', +] + +[[tool.mypy.overrides]] +module = [ + 'config.get_datasets_analytics', + 'config.get_inference_analytics', + 'config.get_references', + 'config.website_validation.utils', + 'config.website_validation.website_validator', + 'seminars.seminar_02_06_2024.try_fastapi', +] +disable_error_code = [ + 'no-any-unimported', + 'assignment' +] + [[tool.mypy.overrides]] module = [ '*.main', @@ -108,6 +196,10 @@ module = [ '*.start_stub', '*.service', '*.service_stub', + '*.scrapper', + '*.scrapper_stub', + '*.pipeline', + '*.pipeline_stub', ] disable_error_code = [ 'empty-body', @@ -123,6 +215,13 @@ disable_error_code = [ 'import' ] +[[tool.mypy.overrides]] +module = ['*.nmt_demo.*', ] +disable_error_code = [ + 'no-any-unimported', + 'no-any-return' +] + [tool.pylint.main] # Analyse import fallback blocks. This can be used to support both Python 2 and 3 # compatible code, which means that the block might have code that exists only in diff --git a/requirements_qa.txt b/requirements_qa.txt index be17d1e0..d920d907 100644 --- a/requirements_qa.txt +++ b/requirements_qa.txt @@ -6,9 +6,10 @@ flake8-isort==6.1.1 flake8-pyproject==1.2.3 flake8==6.1.0 ghapi==1.0.4 -mypy==1.1.1 +mypy==1.9.0 +pandas-stubs==2.1.4.231227 pandas==2.2.1 -pydantic==1.10.7 +pydantic==2.5.3 pydocstyle==6.3.0 pydoctest==0.1.22 pylint==3.1.0 From abc6dae0496e3bf11924eda12c5e27ac52876074 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Wed, 24 Apr 2024 17:38:17 +0300 Subject: [PATCH 02/71] test --- delete this | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 delete this diff --git a/delete this b/delete this new file mode 100644 index 00000000..e69de29b From e7c3c9dedbd8f104c93fb1ee0320acffbf192b35 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 26 May 2024 19:07:59 +0300 Subject: [PATCH 03/71] almost done with the work on '4' but help with stage 3.2 pls --- lab_5_scrapper/scrapper.py | 71 +++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index c060232b..d75b8d45 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -3,8 +3,15 @@ """ # pylint: disable=too-many-arguments, too-many-instance-attributes, unused-import, undefined-variable import pathlib +import json +import shutil +import datetime +import re from typing import Pattern, Union - +import requests +from bs4 import BeautifulSoup +from core_utils.config_dto import ConfigDTO +from core_utils.constants import ASSETS_PATH, CRAWLER_CONFIG_PATH class Config: """ @@ -18,6 +25,9 @@ def __init__(self, path_to_config: pathlib.Path) -> None: Args: path_to_config (pathlib.Path): Path to configuration. """ + self.path_to_config = path_to_config + self._validate_config_content() + self.config_dto = self._extract_config_content() def _extract_config_content(self) -> ConfigDTO: """ @@ -26,11 +36,39 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ + with open(self.path_to_config, 'r', encoding = 'utf-8') as f: + config = json.load(f) + return ConfigDTO def _validate_config_content(self) -> None: """ Ensure configuration parameters are not corrupt. """ + valid_url = self.config_dto.seed_urls + if not valid_url.startswith("https?://(www.)?") and not isinstance(valid_url, str): + raise IncorrectSeedURLError + + number_articles = self.config_dto.total_articles + if number_articles > 150 or number_articles < 1: + raise NumberOfArticlesOutOfRangeError + if number_articles <= 0 or not isinstance(number_articles, int): + raise IncorrectNumberOfArticlesError + + headers_articles = self.config_dto.headers + if not isinstance(headers_articles, dict): + raise IncorrectHeadersError + encode_articles = self.config_dto.encoding + if not isinstance(encode_articles, str): + raise IncorrectEncodingError + + timeout_articles = self.config_dto.timeout + if timeout_articles > 60 or timeout_articles < 0: + raise IncorrectTimeoutError + + certificate_articles = self.config_dto.should_verify_certificate + headless_articles = self.config_dto.headless_mode + if not isinstance(certificate_articles, bool) or not isinstance (headless_articles, bool): + raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: """ @@ -39,6 +77,7 @@ def get_seed_urls(self) -> list[str]: Returns: list[str]: Seed urls """ + return self._seed_urls() def get_num_articles(self) -> int: """ @@ -47,6 +86,7 @@ def get_num_articles(self) -> int: Returns: int: Total number of articles to scrape """ + return self._num_articles def get_headers(self) -> dict[str, str]: """ @@ -55,6 +95,7 @@ def get_headers(self) -> dict[str, str]: Returns: dict[str, str]: Headers """ + return self._headers def get_encoding(self) -> str: """ @@ -63,6 +104,7 @@ def get_encoding(self) -> str: Returns: str: Encoding """ + return self._encoding def get_timeout(self) -> int: """ @@ -71,6 +113,7 @@ def get_timeout(self) -> int: Returns: int: Number of seconds to wait for response """ + return self._timeout def get_verify_certificate(self) -> bool: """ @@ -79,6 +122,7 @@ def get_verify_certificate(self) -> bool: Returns: bool: Whether to verify certificate or not """ + return self._verify_certificate def get_headless_mode(self) -> bool: """ @@ -87,7 +131,7 @@ def get_headless_mode(self) -> bool: Returns: bool: Whether to use headless mode or not """ - + return self._headless_mode def make_request(url: str, config: Config) -> requests.models.Response: """ @@ -100,7 +144,7 @@ def make_request(url: str, config: Config) -> requests.models.Response: Returns: requests.models.Response: A response from a request """ - + return requests.get(url = url, timeout = config.get_timeout(), headers = config.get_headers(), verify = config.get_verify_certificate()) class Crawler: """ @@ -116,6 +160,8 @@ def __init__(self, config: Config) -> None: Args: config (Config): Configuration """ + self.config = config + self.urls = [] def _extract_url(self, article_bs: BeautifulSoup) -> str: """ @@ -127,12 +173,25 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: Returns: str: Url from HTML """ + all_links = article_bs.find_all('a', #???) + for link in all_links: + url = link['href'] + ###i dont know what to do here :( def find_articles(self) -> None: """ Find articles. """ + while len(self_url) < self.config.get_num_articles(): + for seed_url in self.get_search_urls(): + response = make_request(seed_url, self.config) + if not response.ok: + continue + soup = BeautifulSoup(response.text, 'html.parser') + extra_urls = self._extract_url(soup) + self.urls.append(extra_urls) + def get_search_urls(self) -> list: """ Get seed_urls param. @@ -140,7 +199,7 @@ def get_search_urls(self) -> list: Returns: list: seed_urls param """ - + return self.config.get_seed_urls() # 10 # 4, 6, 8, 10 @@ -204,7 +263,9 @@ def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: Args: base_path (Union[pathlib.Path, str]): Path where articles stores """ - + if base_path.exists(): + shutil.rmtree(base_path.parent) + base_path.mkdir(parents=True) def main() -> None: """ From 67f713eb2fdb0d109ae9724e6d60ba108c863247 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 26 May 2024 19:11:12 +0300 Subject: [PATCH 04/71] almost done with the work on '4' but help with stage 3.2 pls --- lab_5_scrapper/target_score.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/target_score.txt b/lab_5_scrapper/target_score.txt index 573541ac..3083e517 100644 --- a/lab_5_scrapper/target_score.txt +++ b/lab_5_scrapper/target_score.txt @@ -1 +1 @@ -0 +4git add From f163df68a9008ee1d969cf253d3a2285e47c4370 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 17:36:00 +0300 Subject: [PATCH 05/71] some steps forward --- lab_5_scrapper/scrapper.py | 135 ++++++++++++++++++++++++++++--------- 1 file changed, 102 insertions(+), 33 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index d75b8d45..a15675c1 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -2,17 +2,62 @@ Crawler implementation. """ # pylint: disable=too-many-arguments, too-many-instance-attributes, unused-import, undefined-variable -import pathlib -import json -import shutil import datetime +import json +import pathlib import re +import shutil from typing import Pattern, Union + import requests from bs4 import BeautifulSoup + +from core_utils.article.article import Article +from core_utils.article.io import to_meta, to_raw from core_utils.config_dto import ConfigDTO from core_utils.constants import ASSETS_PATH, CRAWLER_CONFIG_PATH +class IncorrectSeedURLError(Exception): + """ + Seed URL does not match standard pattern. + """ + + +class IncorrectNumberOfArticlesError(Exception): + """ + Total number of articles to parse is not integer. + """ + + +class NumberOfArticlesOutOfRangeError(Exception): + """ + Total number of articles is out of range from 1 to 150. + """ + + +class IncorrectHeadersError(Exception): + """ + Headers are not in a form of dictionary. + """ + + +class IncorrectEncodingError(Exception): + """ + encoding must be specified as a string. + """ + + +class IncorrectTimeoutError(Exception): + """ + timeout value must be a positive integer less than 60. + """ + + +class IncorrectVerifyError(Exception): + """ + verify certificate value must either be True or False. + """ + class Config: """ Class for unpacking and validating configurations. @@ -26,8 +71,15 @@ def __init__(self, path_to_config: pathlib.Path) -> None: path_to_config (pathlib.Path): Path to configuration. """ self.path_to_config = path_to_config + self._config = self._extract_config_content() self._validate_config_content() - self.config_dto = self._extract_config_content() + self._seed_urls = self._config.seed_urls + self._num_articles = self._config.total_articles + self._headers = self._config.headers + self._encoding = self._config.encoding + self._timeout = self._config.timeout + self._should_verify_certificate = self._config.should_verify_certificate + self._headless_mode = self._config.headless_mode def _extract_config_content(self) -> ConfigDTO: """ @@ -36,38 +88,34 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - with open(self.path_to_config, 'r', encoding = 'utf-8') as f: - config = json.load(f) - return ConfigDTO + with open(file=self.path_to_config, mode='r', encoding='utf-8') as file: + config = json.load(file) + return ConfigDTO(**config) def _validate_config_content(self) -> None: """ Ensure configuration parameters are not corrupt. """ - valid_url = self.config_dto.seed_urls - if not valid_url.startswith("https?://(www.)?") and not isinstance(valid_url, str): - raise IncorrectSeedURLError + for seed_url in self.config.seed_urls: + if not (isinstance(self.config.seed_urls, list) and all (re.match(r"https?://(www.)?", seed_url))): + raise IncorrectSeedURLError - number_articles = self.config_dto.total_articles - if number_articles > 150 or number_articles < 1: + if self._num_articles > 150 or self._num_articles < 1: raise NumberOfArticlesOutOfRangeError - if number_articles <= 0 or not isinstance(number_articles, int): + + if self._config.total_articles <= 0 or not isinstance(self._config.total_articles, int): raise IncorrectNumberOfArticlesError - headers_articles = self.config_dto.headers - if not isinstance(headers_articles, dict): + if not isinstance(self._config.headers, dict): raise IncorrectHeadersError - encode_articles = self.config_dto.encoding - if not isinstance(encode_articles, str): + + if not isinstance(self._config.encoding, str): raise IncorrectEncodingError - timeout_articles = self.config_dto.timeout - if timeout_articles > 60 or timeout_articles < 0: + if self._config.timeout > 60 or self._config.timeout < 0: raise IncorrectTimeoutError - certificate_articles = self.config_dto.should_verify_certificate - headless_articles = self.config_dto.headless_mode - if not isinstance(certificate_articles, bool) or not isinstance (headless_articles, bool): + if not isinstance(self._config.should_verify_certificate, bool) or not isinstance (self._config.headless_mode, bool): raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: @@ -77,7 +125,8 @@ def get_seed_urls(self) -> list[str]: Returns: list[str]: Seed urls """ - return self._seed_urls() + return self._seed_urls + def get_num_articles(self) -> int: """ @@ -122,7 +171,7 @@ def get_verify_certificate(self) -> bool: Returns: bool: Whether to verify certificate or not """ - return self._verify_certificate + return self._should_verify_certificate def get_headless_mode(self) -> bool: """ @@ -162,6 +211,7 @@ def __init__(self, config: Config) -> None: """ self.config = config self.urls = [] + self.url_pattern = 'https://donday.ru/lenta' def _extract_url(self, article_bs: BeautifulSoup) -> str: """ @@ -173,24 +223,26 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: Returns: str: Url from HTML """ - all_links = article_bs.find_all('a', #???) - for link in all_links: - url = link['href'] - ###i dont know what to do here :( + url = "" + all_news = article_bs.find_all('h3') + for news in all_news: + url = news.find('a')['href'] + if url not in self.urls: + break + return url + def find_articles(self) -> None: """ Find articles. """ - while len(self_url) < self.config.get_num_articles(): + while len(self.get_search_urls()) < self.config.get_num_articles(): for seed_url in self.get_search_urls(): response = make_request(seed_url, self.config) if not response.ok: continue - soup = BeautifulSoup(response.text, 'html.parser') - extra_urls = self._extract_url(soup) - self.urls.append(extra_urls) + self.urls.append(self._extract_url(BeautifulSoup(response.text, "lxml"))) def get_search_urls(self) -> list: """ @@ -219,7 +271,11 @@ def __init__(self, full_url: str, article_id: int, config: Config) -> None: article_id (int): Article id config (Config): Configuration """ - + self.full_url = full_url + self.article_id = article_id + self.config = config + self.article = Article(self.full_url, self.article_id) + def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: """ Find text of article. @@ -227,6 +283,11 @@ def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: Args: article_soup (bs4.BeautifulSoup): BeautifulSoup instance """ + texts = [] + allNews = article_soup.findAll(itemprop="articleBody") + for paragraph in allNews: + texts.append(paragraph.text) + self.article.text = ''.join(texts) def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> None: """ @@ -254,7 +315,15 @@ def parse(self) -> Union[Article, bool, list]: Returns: Union[Article, bool, list]: Article instance """ + response = make_request(url=self.full_url, config=self.config) + if not response.ok: + return False + article_bs = BeautifulSoup(response.text, features="lxml") + + self._fill_article_with_text(article_bs) + self._fill_article_with_meta_information(article_bs) + return self.article def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: """ From d78e55768d5d2f043aede4e122f9403a8ad8100d Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 18:07:03 +0300 Subject: [PATCH 06/71] this was awkward --- lab_5_scrapper/scrapper.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index a15675c1..471c18d5 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -341,6 +341,5 @@ def main() -> None: Entrypoint for scrapper module. """ - if __name__ == "__main__": main() From c3930f77e15bc226dbd96cfb37743f99adc45a08 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 18:09:58 +0300 Subject: [PATCH 07/71] this was akward 2.0 --- lab_5_scrapper/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/settings.json b/lab_5_scrapper/settings.json index ee7a97c3..88a8b073 100644 --- a/lab_5_scrapper/settings.json +++ b/lab_5_scrapper/settings.json @@ -1,3 +1,3 @@ { - "target_score": 0 + "target_score": 4 } From 755189a0a32650199f1bfc804c5d24e16b35c3ce Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 18:10:04 +0300 Subject: [PATCH 08/71] this was akward 2.0 --- lab_5_scrapper/scrapper_config.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 771fe42b..50cd54ca 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,9 +1,12 @@ { - "seed_urls": [], - "headers": {}, - "total_articles_to_find_and_parse": 0, - "encoding": "", - "timeout": 0, + "seed_urls": ["https://donday.ru/lenta"], + "headers": { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + "accept-Language" : "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}, + "total_articles_to_find_and_parse": 5, + "encoding": "utf-8", + "timeout": 10, "should_verify_certificate": true, "headless_mode": true } From 1314c1a6df759f39c7d6053ca2a77f0444338983 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 20:09:48 +0300 Subject: [PATCH 09/71] still trying --- lab_5_scrapper/scrapper.py | 47 +++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 471c18d5..f161a0f3 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -71,15 +71,15 @@ def __init__(self, path_to_config: pathlib.Path) -> None: path_to_config (pathlib.Path): Path to configuration. """ self.path_to_config = path_to_config - self._config = self._extract_config_content() + self.config = self._extract_config_content() self._validate_config_content() - self._seed_urls = self._config.seed_urls - self._num_articles = self._config.total_articles - self._headers = self._config.headers - self._encoding = self._config.encoding - self._timeout = self._config.timeout - self._should_verify_certificate = self._config.should_verify_certificate - self._headless_mode = self._config.headless_mode + self._seed_urls = self.config.seed_urls + self._num_articles = self.config.total_articles + self._headers = self.config.headers + self._encoding = self.config.encoding + self._timeout = self.config.timeout + self._should_verify_certificate = self.config.should_verify_certificate + self._headless_mode = self.config.headless_mode def _extract_config_content(self) -> ConfigDTO: """ @@ -88,7 +88,7 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - with open(file=self.path_to_config, mode='r', encoding='utf-8') as file: + with open(self.path_to_config, 'r', encoding='utf-8') as file: config = json.load(file) return ConfigDTO(**config) @@ -103,19 +103,19 @@ def _validate_config_content(self) -> None: if self._num_articles > 150 or self._num_articles < 1: raise NumberOfArticlesOutOfRangeError - if self._config.total_articles <= 0 or not isinstance(self._config.total_articles, int): + if self.config.total_articles <= 0 or not isinstance(self.config.total_articles, int): raise IncorrectNumberOfArticlesError - if not isinstance(self._config.headers, dict): + if not isinstance(self.config.headers, dict): raise IncorrectHeadersError - if not isinstance(self._config.encoding, str): + if not isinstance(self.config.encoding, str): raise IncorrectEncodingError - if self._config.timeout > 60 or self._config.timeout < 0: + if self.config.timeout > 60 or self.config.timeout < 0: raise IncorrectTimeoutError - if not isinstance(self._config.should_verify_certificate, bool) or not isinstance (self._config.headless_mode, bool): + if not isinstance(self.config.should_verify_certificate, bool) or not isinstance (self.config.headless_mode, bool): raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: @@ -284,8 +284,8 @@ def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: article_soup (bs4.BeautifulSoup): BeautifulSoup instance """ texts = [] - allNews = article_soup.findAll(itemprop="articleBody") - for paragraph in allNews: + allnews = article_soup.findAll(itemprop="articleBody") + for paragraph in allnews: texts.append(paragraph.text) self.article.text = ''.join(texts) @@ -333,13 +333,24 @@ def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: base_path (Union[pathlib.Path, str]): Path where articles stores """ if base_path.exists(): - shutil.rmtree(base_path.parent) + shutil.rmtree(base_path) base_path.mkdir(parents=True) def main() -> None: """ Entrypoint for scrapper module. """ +conf = Config(CRAWLER_CONFIG_PATH) +prepare_environment(ASSETS_PATH) +crawler = Crawler(conf) +crawler.find_articles() + + +for i, url in enumerate(crawler.urls, 1): + parser = HTMLParser(url, i, conf) + article = parser.parse() + to_raw(article) + to_meta(article) if __name__ == "__main__": - main() + main() \ No newline at end of file From 2317fa7bff3b614b00c0db40ccda128b39f49efe Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 20:15:21 +0300 Subject: [PATCH 10/71] still trying --- lab_5_scrapper/scrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index f161a0f3..8d0750a1 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -97,7 +97,7 @@ def _validate_config_content(self) -> None: Ensure configuration parameters are not corrupt. """ for seed_url in self.config.seed_urls: - if not (isinstance(self.config.seed_urls, list) and all (re.match(r"https?://(www.)?", seed_url))): + if not (isinstance(self.config.seed_urls, list) and seed_url.startswith('https://donday.ru/')): raise IncorrectSeedURLError if self._num_articles > 150 or self._num_articles < 1: From c4249fdc3ff9a133a3cbf4b455afa38b2a27ee9f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 20:18:50 +0300 Subject: [PATCH 11/71] still trying --- lab_5_scrapper/scrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 8d0750a1..08b70840 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -100,7 +100,7 @@ def _validate_config_content(self) -> None: if not (isinstance(self.config.seed_urls, list) and seed_url.startswith('https://donday.ru/')): raise IncorrectSeedURLError - if self._num_articles > 150 or self._num_articles < 1: + if self.config.total_articles > 150 or self.config.total_articles < 1: raise NumberOfArticlesOutOfRangeError if self.config.total_articles <= 0 or not isinstance(self.config.total_articles, int): From 0c3336462f4083f47158fb0e7bc9f2dad724fdcd Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sat, 1 Jun 2024 20:30:16 +0300 Subject: [PATCH 12/71] still trying --- lab_5_scrapper/scrapper.py | 2 +- lab_5_scrapper/scrapper_config.json | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 08b70840..ae32eb2b 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -193,7 +193,7 @@ def make_request(url: str, config: Config) -> requests.models.Response: Returns: requests.models.Response: A response from a request """ - return requests.get(url = url, timeout = config.get_timeout(), headers = config.get_headers(), verify = config.get_verify_certificate()) + return requests.get(url=url, timeout=config.get_timeout(), headers=config.get_headers(), verify=config.get_verify_certificate()) class Crawler: """ diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 50cd54ca..083c9785 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,9 +1,6 @@ { "seed_urls": ["https://donday.ru/lenta"], - "headers": { - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", - "accept-Language" : "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}, + "headers": {}, "total_articles_to_find_and_parse": 5, "encoding": "utf-8", "timeout": 10, From 8958e09eadddaa4943cbc20741fbcd336f973bd6 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:04:02 +0300 Subject: [PATCH 13/71] maybe --- lab_5_scrapper/scrapper.py | 33 +++++++++++++++++------------ lab_5_scrapper/scrapper_config.json | 9 +++++--- requirements.txt | 3 ++- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index ae32eb2b..42285548 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -88,9 +88,9 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - with open(self.path_to_config, 'r', encoding='utf-8') as file: - config = json.load(file) - return ConfigDTO(**config) + file_config = json.load(open(self.path_to_config)) + config = ConfigDTO(**file_config) + return config def _validate_config_content(self) -> None: """ @@ -193,7 +193,10 @@ def make_request(url: str, config: Config) -> requests.models.Response: Returns: requests.models.Response: A response from a request """ - return requests.get(url=url, timeout=config.get_timeout(), headers=config.get_headers(), verify=config.get_verify_certificate()) + return requests.get(url=url, + timeout=config.get_timeout(), + headers=config.get_headers() + ) class Crawler: """ @@ -211,7 +214,7 @@ def __init__(self, config: Config) -> None: """ self.config = config self.urls = [] - self.url_pattern = 'https://donday.ru/lenta' + self.url_pattern = 'https://donday.ru/' def _extract_url(self, article_bs: BeautifulSoup) -> str: """ @@ -224,7 +227,7 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: str: Url from HTML """ url = "" - all_news = article_bs.find_all('h3') + all_news = article_bs.find_all('div', class_="news") for news in all_news: url = news.find('a')['href'] if url not in self.urls: @@ -288,6 +291,7 @@ def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: for paragraph in allnews: texts.append(paragraph.text) self.article.text = ''.join(texts) + print(self.article.text) def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> None: """ @@ -340,17 +344,18 @@ def main() -> None: """ Entrypoint for scrapper module. """ -conf = Config(CRAWLER_CONFIG_PATH) +config = Config(path_to_config=CRAWLER_CONFIG_PATH) +crawler = Crawler(config) prepare_environment(ASSETS_PATH) -crawler = Crawler(conf) -crawler.find_articles() - -for i, url in enumerate(crawler.urls, 1): - parser = HTMLParser(url, i, conf) +crawler.find_articles() +for index, url in enumerate(crawler.urls, 1): + parser = HTMLParser(url, index, config) article = parser.parse() - to_raw(article) - to_meta(article) + if isinstance(article, Article): + to_raw(article) + to_meta(article) + if __name__ == "__main__": main() \ No newline at end of file diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 083c9785..9d95329e 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,7 +1,10 @@ { - "seed_urls": ["https://donday.ru/lenta"], - "headers": {}, - "total_articles_to_find_and_parse": 5, + "seed_urls": ["https://donday.ru/"], + "headers": { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + "accept-Language" : "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}, + "total_articles_to_find_and_parse": 3, "encoding": "utf-8", "timeout": 10, "should_verify_certificate": true, diff --git a/requirements.txt b/requirements.txt index 8b137891..20349554 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ - +beautifulsoup4~=4.12.3 +requests~=2.32.3 \ No newline at end of file From 76a5c0199a7b452df2aa9c06592b19cd3f74066e Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:18:36 +0300 Subject: [PATCH 14/71] maybe --- lab_5_scrapper/scrapper.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 42285548..0cd18740 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -71,8 +71,8 @@ def __init__(self, path_to_config: pathlib.Path) -> None: path_to_config (pathlib.Path): Path to configuration. """ self.path_to_config = path_to_config - self.config = self._extract_config_content() self._validate_config_content() + self.config = self._extract_config_content() self._seed_urls = self.config.seed_urls self._num_articles = self.config.total_articles self._headers = self.config.headers @@ -88,19 +88,19 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - file_config = json.load(open(self.path_to_config)) - config = ConfigDTO(**file_config) - return config + with open(file=self.path_to_config, mode='r', encoding='utf-8') as file: + config = json.load(file) + return ConfigDTO(**config) def _validate_config_content(self) -> None: """ Ensure configuration parameters are not corrupt. """ for seed_url in self.config.seed_urls: - if not (isinstance(self.config.seed_urls, list) and seed_url.startswith('https://donday.ru/')): + if not isinstance(config.seed_urls, list) and not all(re.match('https?://(www.)?donday.ru/proisshestviya/', seed_url)): raise IncorrectSeedURLError - if self.config.total_articles > 150 or self.config.total_articles < 1: + if self.config.total_articles > 150: raise NumberOfArticlesOutOfRangeError if self.config.total_articles <= 0 or not isinstance(self.config.total_articles, int): @@ -115,7 +115,7 @@ def _validate_config_content(self) -> None: if self.config.timeout > 60 or self.config.timeout < 0: raise IncorrectTimeoutError - if not isinstance(self.config.should_verify_certificate, bool) or not isinstance (self.config.headless_mode, bool): + if not isinstance(self.config.should_verify_certificate, bool) or not isinstance(self.config.headless_mode, bool): raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: @@ -195,7 +195,8 @@ def make_request(url: str, config: Config) -> requests.models.Response: """ return requests.get(url=url, timeout=config.get_timeout(), - headers=config.get_headers() + headers=config.get_headers(), + verify=config.get_verify_certificate() ) class Crawler: From 488b860a9754a121f178a12c01a2ac8714c47298 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:22:37 +0300 Subject: [PATCH 15/71] maybe --- lab_5_scrapper/scrapper.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 0cd18740..ed956d25 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -17,6 +17,7 @@ from core_utils.config_dto import ConfigDTO from core_utils.constants import ASSETS_PATH, CRAWLER_CONFIG_PATH + class IncorrectSeedURLError(Exception): """ Seed URL does not match standard pattern. @@ -58,6 +59,7 @@ class IncorrectVerifyError(Exception): verify certificate value must either be True or False. """ + class Config: """ Class for unpacking and validating configurations. @@ -97,7 +99,8 @@ def _validate_config_content(self) -> None: Ensure configuration parameters are not corrupt. """ for seed_url in self.config.seed_urls: - if not isinstance(config.seed_urls, list) and not all(re.match('https?://(www.)?donday.ru/proisshestviya/', seed_url)): + if not isinstance(config.seed_urls, list) and not all( + re.match('https?://(www.)?donday.ru/proisshestviya/', seed_url)): raise IncorrectSeedURLError if self.config.total_articles > 150: @@ -115,7 +118,8 @@ def _validate_config_content(self) -> None: if self.config.timeout > 60 or self.config.timeout < 0: raise IncorrectTimeoutError - if not isinstance(self.config.should_verify_certificate, bool) or not isinstance(self.config.headless_mode, bool): + if not isinstance(self.config.should_verify_certificate, bool) or not isinstance(self.config.headless_mode, + bool): raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: @@ -127,7 +131,6 @@ def get_seed_urls(self) -> list[str]: """ return self._seed_urls - def get_num_articles(self) -> int: """ Retrieve total number of articles to scrape. @@ -182,6 +185,7 @@ def get_headless_mode(self) -> bool: """ return self._headless_mode + def make_request(url: str, config: Config) -> requests.models.Response: """ Deliver a response from a request with given configuration. @@ -199,6 +203,7 @@ def make_request(url: str, config: Config) -> requests.models.Response: verify=config.get_verify_certificate() ) + class Crawler: """ Crawler implementation. @@ -235,7 +240,6 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: break return url - def find_articles(self) -> None: """ Find articles. @@ -257,6 +261,7 @@ def get_search_urls(self) -> list: """ return self.config.get_seed_urls() + # 10 # 4, 6, 8, 10 @@ -279,7 +284,7 @@ def __init__(self, full_url: str, article_id: int, config: Config) -> None: self.article_id = article_id self.config = config self.article = Article(self.full_url, self.article_id) - + def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: """ Find text of article. @@ -330,6 +335,7 @@ def parse(self) -> Union[Article, bool, list]: return self.article + def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: """ Create ASSETS_PATH folder if no created and remove existing folder. @@ -341,10 +347,13 @@ def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: shutil.rmtree(base_path) base_path.mkdir(parents=True) + def main() -> None: """ Entrypoint for scrapper module. """ + + config = Config(path_to_config=CRAWLER_CONFIG_PATH) crawler = Crawler(config) prepare_environment(ASSETS_PATH) @@ -357,6 +366,5 @@ def main() -> None: to_raw(article) to_meta(article) - if __name__ == "__main__": - main() \ No newline at end of file + main() From 780318785826897a385750e2d5c0a10e68908a3b Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:25:51 +0300 Subject: [PATCH 16/71] maybe --- lab_5_scrapper/scrapper.py | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index ed956d25..1a20b13f 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -17,7 +17,6 @@ from core_utils.config_dto import ConfigDTO from core_utils.constants import ASSETS_PATH, CRAWLER_CONFIG_PATH - class IncorrectSeedURLError(Exception): """ Seed URL does not match standard pattern. @@ -59,7 +58,6 @@ class IncorrectVerifyError(Exception): verify certificate value must either be True or False. """ - class Config: """ Class for unpacking and validating configurations. @@ -73,8 +71,8 @@ def __init__(self, path_to_config: pathlib.Path) -> None: path_to_config (pathlib.Path): Path to configuration. """ self.path_to_config = path_to_config - self._validate_config_content() self.config = self._extract_config_content() + self._validate_config_content() self._seed_urls = self.config.seed_urls self._num_articles = self.config.total_articles self._headers = self.config.headers @@ -90,20 +88,19 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - with open(file=self.path_to_config, mode='r', encoding='utf-8') as file: - config = json.load(file) - return ConfigDTO(**config) + file_config = json.load(open(self.path_to_config)) + config = ConfigDTO(**file_config) + return config def _validate_config_content(self) -> None: """ Ensure configuration parameters are not corrupt. """ for seed_url in self.config.seed_urls: - if not isinstance(config.seed_urls, list) and not all( - re.match('https?://(www.)?donday.ru/proisshestviya/', seed_url)): + if not (isinstance(self.config.seed_urls, list) and seed_url.startswith('https://donday.ru/')): raise IncorrectSeedURLError - if self.config.total_articles > 150: + if self.config.total_articles > 150 or self.config.total_articles < 1: raise NumberOfArticlesOutOfRangeError if self.config.total_articles <= 0 or not isinstance(self.config.total_articles, int): @@ -118,8 +115,7 @@ def _validate_config_content(self) -> None: if self.config.timeout > 60 or self.config.timeout < 0: raise IncorrectTimeoutError - if not isinstance(self.config.should_verify_certificate, bool) or not isinstance(self.config.headless_mode, - bool): + if not isinstance(self.config.should_verify_certificate, bool) or not isinstance (self.config.headless_mode, bool): raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: @@ -131,6 +127,7 @@ def get_seed_urls(self) -> list[str]: """ return self._seed_urls + def get_num_articles(self) -> int: """ Retrieve total number of articles to scrape. @@ -185,7 +182,6 @@ def get_headless_mode(self) -> bool: """ return self._headless_mode - def make_request(url: str, config: Config) -> requests.models.Response: """ Deliver a response from a request with given configuration. @@ -199,11 +195,9 @@ def make_request(url: str, config: Config) -> requests.models.Response: """ return requests.get(url=url, timeout=config.get_timeout(), - headers=config.get_headers(), - verify=config.get_verify_certificate() + headers=config.get_headers() ) - class Crawler: """ Crawler implementation. @@ -240,6 +234,7 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: break return url + def find_articles(self) -> None: """ Find articles. @@ -261,7 +256,6 @@ def get_search_urls(self) -> list: """ return self.config.get_seed_urls() - # 10 # 4, 6, 8, 10 @@ -335,7 +329,6 @@ def parse(self) -> Union[Article, bool, list]: return self.article - def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: """ Create ASSETS_PATH folder if no created and remove existing folder. @@ -347,13 +340,10 @@ def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: shutil.rmtree(base_path) base_path.mkdir(parents=True) - def main() -> None: """ Entrypoint for scrapper module. """ - - config = Config(path_to_config=CRAWLER_CONFIG_PATH) crawler = Crawler(config) prepare_environment(ASSETS_PATH) @@ -366,5 +356,6 @@ def main() -> None: to_raw(article) to_meta(article) + if __name__ == "__main__": - main() + main() \ No newline at end of file From 0b739f7c38e5a7c18dadf299e6cd08ebc36e3cf2 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:26:53 +0300 Subject: [PATCH 17/71] maybe --- lab_5_scrapper/scrapper.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 1a20b13f..75ad4484 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -88,9 +88,9 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - file_config = json.load(open(self.path_to_config)) - config = ConfigDTO(**file_config) - return config + with open(self.path_to_config, encoding='utf-8') as file: + config = json.load(file) + return ConfigDTO(**config) def _validate_config_content(self) -> None: """ From dbfddab0a569abaea4634d223ff0e1cc19a3d7ed Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:44:38 +0300 Subject: [PATCH 18/71] maybe --- lab_5_scrapper/scrapper.py | 2 +- lab_5_scrapper/scrapper_config.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 75ad4484..6e3c71cd 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -227,7 +227,7 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: str: Url from HTML """ url = "" - all_news = article_bs.find_all('div', class_="news") + all_news = article_bs.find_all('span', itemprop="articleBody") for news in all_news: url = news.find('a')['href'] if url not in self.urls: diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 9d95329e..a1716de1 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,12 +1,12 @@ { - "seed_urls": ["https://donday.ru/"], + "seed_urls": ["https://donday.ru/proisshestviya/page/2/, https://donday.ru/proisshestviya/page/3/, https://donday.ru/proisshestviya/page/4/"], "headers": { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "accept-Language" : "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}, "total_articles_to_find_and_parse": 3, "encoding": "utf-8", - "timeout": 10, + "timeout": 4, "should_verify_certificate": true, "headless_mode": true } From 3a46d1cb68fae33eee569dff691a5d5097fa8d72 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 11:51:48 +0300 Subject: [PATCH 19/71] maybe --- lab_5_scrapper/scrapper.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 6e3c71cd..4fd7ee3f 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -226,13 +226,9 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: Returns: str: Url from HTML """ - url = "" - all_news = article_bs.find_all('span', itemprop="articleBody") - for news in all_news: - url = news.find('a')['href'] - if url not in self.urls: - break - return url + urls = [] + for link in article_bs.find_all('a'): + print(link.get('href')) def find_articles(self) -> None: From ed0fc1124f89893c3c46239650cdbe99896f5e92 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 12:22:06 +0300 Subject: [PATCH 20/71] maybe --- lab_5_scrapper/scrapper.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 4fd7ee3f..e2eb27a9 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -226,10 +226,8 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: Returns: str: Url from HTML """ - urls = [] - for link in article_bs.find_all('a'): - print(link.get('href')) + return str(article_bs['href']) def find_articles(self) -> None: """ @@ -237,11 +235,14 @@ def find_articles(self) -> None: """ while len(self.get_search_urls()) < self.config.get_num_articles(): - for seed_url in self.get_search_urls(): - response = make_request(seed_url, self.config) + for url in self.get_search_urls(): + response = make_request(url, self.config) if not response.ok: continue - self.urls.append(self._extract_url(BeautifulSoup(response.text, "lxml"))) + soup = BeautifulSoup(response.text, "lxml") + for link in soup.find_all('a'): + if self._extract_url(link) not in self.urls: + self.urls.append(self._extract_url(link)) def get_search_urls(self) -> list: """ From df387dbfe8bf3e20e37ffb3d6add36468735931c Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 12:24:53 +0300 Subject: [PATCH 21/71] maybe --- lab_5_scrapper/scrapper.py | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index e2eb27a9..b277e06b 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -288,7 +288,6 @@ def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: for paragraph in allnews: texts.append(paragraph.text) self.article.text = ''.join(texts) - print(self.article.text) def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> None: """ @@ -316,15 +315,6 @@ def parse(self) -> Union[Article, bool, list]: Returns: Union[Article, bool, list]: Article instance """ - response = make_request(url=self.full_url, config=self.config) - if not response.ok: - return False - article_bs = BeautifulSoup(response.text, features="lxml") - - self._fill_article_with_text(article_bs) - self._fill_article_with_meta_information(article_bs) - - return self.article def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: """ @@ -341,17 +331,17 @@ def main() -> None: """ Entrypoint for scrapper module. """ -config = Config(path_to_config=CRAWLER_CONFIG_PATH) -crawler = Crawler(config) -prepare_environment(ASSETS_PATH) - -crawler.find_articles() -for index, url in enumerate(crawler.urls, 1): - parser = HTMLParser(url, index, config) - article = parser.parse() - if isinstance(article, Article): - to_raw(article) - to_meta(article) + config = Config(path_to_config=CRAWLER_CONFIG_PATH) + crawler = Crawler(config) + prepare_environment(ASSETS_PATH) + + crawler.find_articles() + for index, url in enumerate(crawler.urls, 1): + parser = HTMLParser(url, index, config) + article = parser.parse() + if isinstance(article, Article): + to_raw(article) + to_meta(article) if __name__ == "__main__": From 42ba7bb804186d455d5134f7cd83a0a2117d176f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 13:57:36 +0300 Subject: [PATCH 22/71] requirements check --- lab_5_scrapper/scrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index b277e06b..399b6f42 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -342,7 +342,7 @@ def main() -> None: if isinstance(article, Article): to_raw(article) to_meta(article) - +#test if __name__ == "__main__": main() \ No newline at end of file From 9bd30076ff457a7ece4d3892c7e2a7f912393482 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 16:46:03 +0300 Subject: [PATCH 23/71] check --- lab_5_scrapper/scrapper.py | 13 +++++++++---- lab_5_scrapper/scrapper_config.json | 2 +- lab_6_pipeline/pipeline.py | 30 ++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 399b6f42..ab83dcdf 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -227,7 +227,8 @@ def _extract_url(self, article_bs: BeautifulSoup) -> str: str: Url from HTML """ - return str(article_bs['href']) + article_url = article_bs.find('a').get('href') + return article_url def find_articles(self) -> None: """ @@ -240,9 +241,12 @@ def find_articles(self) -> None: if not response.ok: continue soup = BeautifulSoup(response.text, "lxml") - for link in soup.find_all('a'): - if self._extract_url(link) not in self.urls: - self.urls.append(self._extract_url(link)) + contents = soup.find_all('div', id='dle-content') + for content in contents: + for item in content.find_all('h3', class_='btl'): + url_news = self._extract_url(item) + if url_news not in self.urls: + self.urls.append(url_news) def get_search_urls(self) -> list: """ @@ -297,6 +301,7 @@ def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> No article_soup (bs4.BeautifulSoup): BeautifulSoup instance """ + def unify_date_format(self, date_str: str) -> datetime.datetime: """ Unify date format. diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index a1716de1..6a978f36 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,5 +1,5 @@ { - "seed_urls": ["https://donday.ru/proisshestviya/page/2/, https://donday.ru/proisshestviya/page/3/, https://donday.ru/proisshestviya/page/4/"], + "seed_urls": [], "headers": { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index f70f27de..91e9b7ac 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -15,6 +15,12 @@ PipelineProtocol, StanzaDocument, TreeNode) +class InconsistentDatasetError(Exception): + """ + IDs contain slips, number of meta and raw files is not equal, files are empty + """ + + class CorpusManager: """ Work with articles and store them. @@ -27,17 +33,35 @@ def __init__(self, path_to_raw_txt_data: pathlib.Path) -> None: Args: path_to_raw_txt_data (pathlib.Path): Path to raw txt data """ + self.path_to_raw_txt_data = path_to_raw_txt_data + self._storage = {} + self._validate_dataset() + self._scan_dataset() def _validate_dataset(self) -> None: """ Validate folder with assets. """ + if not self.path_to_raw_txt_data.exists: + raise FileNotFoundError + if not self.path_to_raw_txt_data.is_dir: + raise NotADirectoryError + if not any(self.path_to_raw_txt_data.iterdir()): + raise InconsistentDatasetError + + raw_t = list(self.path_to_raw_txt_data.glob("*_raw.txt"))) + meta_t = list(self.path_to_raw_txt_data.glob("*_meta.txt"))) + if len(raw_t) != len(meta_t): + raise InconsistentDatasetError + def _scan_dataset(self) -> None: """ Register each dataset entry. """ + + def get_articles(self) -> dict: """ Get storage params. @@ -53,7 +77,7 @@ class TextProcessingPipeline(PipelineProtocol): """ def __init__( - self, corpus_manager: CorpusManager, analyzer: LibraryWrapper | None = None + self, corpus_manager: CorpusManager, analyzer: LibraryWrapper | None = None ) -> None: """ Initialize an instance of the TextProcessingPipeline class. @@ -197,7 +221,7 @@ class PatternSearchPipeline(PipelineProtocol): """ def __init__( - self, corpus_manager: CorpusManager, analyzer: LibraryWrapper, pos: tuple[str, ...] + self, corpus_manager: CorpusManager, analyzer: LibraryWrapper, pos: tuple[str, ...] ) -> None: """ Initialize an instance of the PatternSearchPipeline class. @@ -220,7 +244,7 @@ def _make_graphs(self, doc: CoNLLUDocument) -> list[DiGraph]: """ def _add_children( - self, graph: DiGraph, subgraph_to_graph: dict, node_id: int, tree_node: TreeNode + self, graph: DiGraph, subgraph_to_graph: dict, node_id: int, tree_node: TreeNode ) -> None: """ Add children to TreeNode. From 3ea458dec60587c602bdf3043d2901f0b7ad6deb Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 17:05:57 +0300 Subject: [PATCH 24/71] check --- lab_5_scrapper/scrapper_config.json | 2 +- requirements.txt | Bin 39 -> 318 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 6a978f36..2f6a3782 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,5 +1,5 @@ { - "seed_urls": [], + "seed_urls": ["https://donday.ru/"], "headers": { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", diff --git a/requirements.txt b/requirements.txt index 20349554d2cf4137a3c273a8874d18522ccc3a3c..314040e6bcf48006eacb1de1b04eb8ca75d81d76 100644 GIT binary patch literal 318 zcmYL^+YW*-5JczM#7~jPMSb#P081pPiUoY| Date: Sun, 2 Jun 2024 17:51:30 +0300 Subject: [PATCH 25/71] check --- lab_5_scrapper/scrapper.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index ab83dcdf..7e880bde 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -287,11 +287,11 @@ def _fill_article_with_text(self, article_soup: BeautifulSoup) -> None: Args: article_soup (bs4.BeautifulSoup): BeautifulSoup instance """ - texts = [] - allnews = article_soup.findAll(itemprop="articleBody") - for paragraph in allnews: - texts.append(paragraph.text) - self.article.text = ''.join(texts) + allnews = article_soup.find(itemprop="articleBody") + text_split = allnews.text.replace('\n', '').split() + text = ' '.join(text_split) + clear_text = '. '.join(text.split('. ')[:-2]) + self.article.text = clear_text def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> None: """ @@ -320,6 +320,11 @@ def parse(self) -> Union[Article, bool, list]: Returns: Union[Article, bool, list]: Article instance """ + response = make_request(self.full_url, self.config) + if response.ok: + article_bs = BeautifulSoup(response.text, features='html.parser') + self._fill_article_with_text(article_bs) + return self.article def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: """ @@ -336,17 +341,16 @@ def main() -> None: """ Entrypoint for scrapper module. """ - config = Config(path_to_config=CRAWLER_CONFIG_PATH) - crawler = Crawler(config) + config = Config(CRAWLER_CONFIG_PATH) prepare_environment(ASSETS_PATH) - + crawler = Crawler(config) crawler.find_articles() - for index, url in enumerate(crawler.urls, 1): - parser = HTMLParser(url, index, config) - article = parser.parse() - if isinstance(article, Article): - to_raw(article) - to_meta(article) + for i, url in enumerate(crawler.urls): + parser = HTMLParser(url, i + 1, config) + text = parser.parse() + if isinstance(text, Article): + to_raw(text) + to_meta(text) #test if __name__ == "__main__": From 7704b140bd53fd43904b3ffda6869e9c6d6ff35b Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 17:55:45 +0300 Subject: [PATCH 26/71] check --- lab_5_scrapper/scrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 7e880bde..29cdbfac 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -97,7 +97,7 @@ def _validate_config_content(self) -> None: Ensure configuration parameters are not corrupt. """ for seed_url in self.config.seed_urls: - if not (isinstance(self.config.seed_urls, list) and seed_url.startswith('https://donday.ru/')): + if not re.match(r"https?://(www.)?donday\.ru", seed_url): raise IncorrectSeedURLError if self.config.total_articles > 150 or self.config.total_articles < 1: From bd80bc410a72f5345d39c2eebc76bc54b043bf51 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 18:04:15 +0300 Subject: [PATCH 27/71] check --- lab_5_scrapper/scrapper.py | 75 ++++++++++++++++++----------- lab_5_scrapper/scrapper_config.json | 9 ++-- 2 files changed, 49 insertions(+), 35 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 29cdbfac..1fa61bca 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -71,8 +71,8 @@ def __init__(self, path_to_config: pathlib.Path) -> None: path_to_config (pathlib.Path): Path to configuration. """ self.path_to_config = path_to_config - self.config = self._extract_config_content() self._validate_config_content() + self.config = self._extract_config_content() self._seed_urls = self.config.seed_urls self._num_articles = self.config.total_articles self._headers = self.config.headers @@ -88,35 +88,50 @@ def _extract_config_content(self) -> ConfigDTO: Returns: ConfigDTO: Config values """ - with open(self.path_to_config, encoding='utf-8') as file: + with open(self.path_to_config, 'r', encoding='utf-8') as file: config = json.load(file) - return ConfigDTO(**config) + return ConfigDTO( + seed_urls=config["seed_urls"], + total_articles_to_find_and_parse=config["total_articles_to_find_and_parse"], + headers=config["headers"], + encoding=config["encoding"], + timeout=config["timeout"], + should_verify_certificate=config["should_verify_certificate"], + headless_mode=config["headless_mode"] + ) def _validate_config_content(self) -> None: """ Ensure configuration parameters are not corrupt. """ - for seed_url in self.config.seed_urls: - if not re.match(r"https?://(www.)?donday\.ru", seed_url): + with open(self.path_to_config, 'r', encoding='utf-8') as f: + config = json.load(f) + + if not isinstance(config['seed_urls'], list): raise IncorrectSeedURLError - if self.config.total_articles > 150 or self.config.total_articles < 1: - raise NumberOfArticlesOutOfRangeError + if not all(seed_url.startswith('https://donday.ru/') for seed_url in config['seed_urls']): + raise IncorrectSeedURLError - if self.config.total_articles <= 0 or not isinstance(self.config.total_articles, int): - raise IncorrectNumberOfArticlesError + if (not isinstance(config['total_articles_to_find_and_parse'], int) or + config['total_articles_to_find_and_parse'] <= 0): + raise IncorrectNumberOfArticlesError - if not isinstance(self.config.headers, dict): - raise IncorrectHeadersError + if not 1 < config['total_articles_to_find_and_parse'] <= 150: + raise NumberOfArticlesOutOfRangeError - if not isinstance(self.config.encoding, str): - raise IncorrectEncodingError + if not isinstance(config['headers'], dict): + raise IncorrectHeadersError - if self.config.timeout > 60 or self.config.timeout < 0: - raise IncorrectTimeoutError + if not isinstance(config['encoding'], str): + raise IncorrectEncodingError - if not isinstance(self.config.should_verify_certificate, bool) or not isinstance (self.config.headless_mode, bool): - raise IncorrectVerifyError + if not isinstance(config['timeout'], int) or not 0 < config['timeout'] < 60: + raise IncorrectTimeoutError + + if (not isinstance(config['should_verify_certificate'], bool) or + not isinstance(config['headless_mode'], bool)): + raise IncorrectVerifyError def get_seed_urls(self) -> list[str]: """ @@ -193,10 +208,11 @@ def make_request(url: str, config: Config) -> requests.models.Response: Returns: requests.models.Response: A response from a request """ - return requests.get(url=url, + res = requests.get(url=url, timeout=config.get_timeout(), - headers=config.get_headers() - ) + headers=config.get_headers(), + verify=config.get_verify_certificate()) + return res class Crawler: """ @@ -322,8 +338,9 @@ def parse(self) -> Union[Article, bool, list]: """ response = make_request(self.full_url, self.config) if response.ok: - article_bs = BeautifulSoup(response.text, features='html.parser') + article_bs = BeautifulSoup(response.text, features='lxml') self._fill_article_with_text(article_bs) + return self.article def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: @@ -341,16 +358,16 @@ def main() -> None: """ Entrypoint for scrapper module. """ - config = Config(CRAWLER_CONFIG_PATH) + conf = Config(CRAWLER_CONFIG_PATH) prepare_environment(ASSETS_PATH) - crawler = Crawler(config) + crawler = Crawler(conf) crawler.find_articles() - for i, url in enumerate(crawler.urls): - parser = HTMLParser(url, i + 1, config) - text = parser.parse() - if isinstance(text, Article): - to_raw(text) - to_meta(text) + + for i, url in enumerate(crawler.urls, 1): + parser = HTMLParser(url, i, conf) + article = parser.parse() + to_raw(article) + to_meta(article) #test if __name__ == "__main__": diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 2f6a3782..7d915f6b 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,12 +1,9 @@ { "seed_urls": ["https://donday.ru/"], - "headers": { - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", - "accept-Language" : "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}, - "total_articles_to_find_and_parse": 3, + "headers": {}, + "total_articles_to_find_and_parse": 30, "encoding": "utf-8", - "timeout": 4, + "timeout": 10, "should_verify_certificate": true, "headless_mode": true } From 5390e88fa4a46e4afd5c77e0ad4892047e46ccc1 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 18:55:23 +0300 Subject: [PATCH 28/71] check --- requirements.txt | Bin 318 -> 2356 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 314040e6bcf48006eacb1de1b04eb8ca75d81d76..585f23146ae3d2a54c2cd93f76c73ebb9a370d19 100644 GIT binary patch literal 2356 zcmZ9O%Wm6H3`Fm`KtIJs?7Z4VcU=|es@(^U{A^^|mF4E~@ondD#7GGO$&ScN4u?a^ z|NbsYqrXGx%0kzwEXzcn&*iA^r}9OA7iC&*bzPK?<%7Ih*>|NXwLH>3lYJKUdp%v0 zbNHMFP=W zmbvmx%Z;vi-aPpCbO(sAN@ss%m^daQ&K{Gl%l)m1QyxabX`#P-ij*le6fAd00o4 zT~q)g?mH}82kYr|k_81;J;v-OSnRVC?@iAnS=^IdumgsPG7+H>=Hn;|T#+xMpib12 zmCi=p|E7u>)w@uY*j)|h>DYs;kGhCZmp{s7zB7Y6R_k;l_0r#^d|WY+1{CRYmhVPB zck*N!t&{Ao5!dBO71ghJ;on+CS8d=~#0>M@9VCJ;aDNZKhnUG9`i|zP&Yeu95v>z* zbhFcaSFCK1f7WF*d$C|Fp1G_&tw&)c&Neb&<$PMt!n+raHfHlQ@*2-~BYd5hrcV#5 zK0D$4(daxK9!~;u=N>VcXc1oN<)*K6;QpxRM0CdFlBadl{uowv%^3SpSm@)>bncu;?;J4wRvb9#bS1vaP?hn4%H6XT zhwXR@l`w_F)DppcOugiLggC31x6I;6V`I>5D}lOU(mEJyli;w4?s6W#K@DR+cG>1# zM61MHzV+n|#q7d9aj6mS#K!Zw$Ht_Q(>oW&P{E7td6KSXmgjf+9`D>v`tn>3^Jlwf zj9#M!tIJVSFQ_v&iR*|Y4oo8Z=Q477ehQ4URz5YF5#ZCoJ`sb6{@%10*O<#Q*>R delta 47 zcmdlYw2z7D|G$Yw0TYkJ2xc;*Fyt{LGS~v4F@qk1`Q*PW(vv;d)F!WElbgJVLjeGN CLk@ue From 80d260eca35b40e068e167b916c99eeeab8a7569 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 19:12:19 +0300 Subject: [PATCH 29/71] check --- lab_5_scrapper/scrapper.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 1fa61bca..1a8e85c9 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -230,7 +230,6 @@ def __init__(self, config: Config) -> None: """ self.config = config self.urls = [] - self.url_pattern = 'https://donday.ru/' def _extract_url(self, article_bs: BeautifulSoup) -> str: """ @@ -256,13 +255,13 @@ def find_articles(self) -> None: response = make_request(url, self.config) if not response.ok: continue - soup = BeautifulSoup(response.text, "lxml") + soup = BeautifulSoup(response.text, "html.parser") contents = soup.find_all('div', id='dle-content') for content in contents: for item in content.find_all('h3', class_='btl'): url_news = self._extract_url(item) if url_news not in self.urls: - self.urls.append(url_news) + self.urls.extend(url_news) def get_search_urls(self) -> list: """ From fcf0a1f1f4346c26a03a4962073eabbd1f37d309 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 19:19:48 +0300 Subject: [PATCH 30/71] check --- lab_5_scrapper/scrapper.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 1a8e85c9..98ae197f 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -142,7 +142,6 @@ def get_seed_urls(self) -> list[str]: """ return self._seed_urls - def get_num_articles(self) -> int: """ Retrieve total number of articles to scrape. @@ -214,6 +213,7 @@ def make_request(url: str, config: Config) -> requests.models.Response: verify=config.get_verify_certificate()) return res + class Crawler: """ Crawler implementation. @@ -272,6 +272,7 @@ def get_search_urls(self) -> list: """ return self.config.get_seed_urls() + # 10 # 4, 6, 8, 10 @@ -316,7 +317,6 @@ def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> No article_soup (bs4.BeautifulSoup): BeautifulSoup instance """ - def unify_date_format(self, date_str: str) -> datetime.datetime: """ Unify date format. @@ -342,6 +342,7 @@ def parse(self) -> Union[Article, bool, list]: return self.article + def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: """ Create ASSETS_PATH folder if no created and remove existing folder. @@ -353,6 +354,7 @@ def prepare_environment(base_path: Union[pathlib.Path, str]) -> None: shutil.rmtree(base_path) base_path.mkdir(parents=True) + def main() -> None: """ Entrypoint for scrapper module. @@ -369,5 +371,6 @@ def main() -> None: to_meta(article) #test + if __name__ == "__main__": main() \ No newline at end of file From 94b74f393241f324fbf22acdc84e3c9cfe6544b6 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 19:35:31 +0300 Subject: [PATCH 31/71] check --- lab_5_scrapper/scrapper.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 98ae197f..d78862f4 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -17,6 +17,7 @@ from core_utils.config_dto import ConfigDTO from core_utils.constants import ASSETS_PATH, CRAWLER_CONFIG_PATH + class IncorrectSeedURLError(Exception): """ Seed URL does not match standard pattern. @@ -58,6 +59,7 @@ class IncorrectVerifyError(Exception): verify certificate value must either be True or False. """ + class Config: """ Class for unpacking and validating configurations. @@ -196,6 +198,7 @@ def get_headless_mode(self) -> bool: """ return self._headless_mode + def make_request(url: str, config: Config) -> requests.models.Response: """ Deliver a response from a request with given configuration. @@ -369,7 +372,6 @@ def main() -> None: article = parser.parse() to_raw(article) to_meta(article) -#test if __name__ == "__main__": From 98b75979a0e3574d9c9ea302be1c67bfd3af4f45 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 19:56:00 +0300 Subject: [PATCH 32/71] check --- lab_5_scrapper/scrapper.py | 23 +++++++++++------------ requirements.txt | Bin 2356 -> 2388 bytes 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index d78862f4..7fafb1d9 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -253,18 +253,17 @@ def find_articles(self) -> None: Find articles. """ - while len(self.get_search_urls()) < self.config.get_num_articles(): - for url in self.get_search_urls(): - response = make_request(url, self.config) - if not response.ok: - continue - soup = BeautifulSoup(response.text, "html.parser") - contents = soup.find_all('div', id='dle-content') - for content in contents: - for item in content.find_all('h3', class_='btl'): - url_news = self._extract_url(item) - if url_news not in self.urls: - self.urls.extend(url_news) + for url in self.get_search_urls(): + response = make_request(url, self.config) + if not response.ok: + continue + soup = BeautifulSoup(response.text, "html.parser") + contents = soup.find_all('div', id='dle-content') + for content in contents: + for item in content.find_all('h3', class_='btl'): + url_news = self._extract_url(item) + if url_news not in self.urls: + self.urls.extend(url_news) def get_search_urls(self) -> list: """ diff --git a/requirements.txt b/requirements.txt index 585f23146ae3d2a54c2cd93f76c73ebb9a370d19..1e6b62fd5c985624f18ce48b536e10e912a601cd 100644 GIT binary patch delta 38 qcmdlYbVXeGLlT265E?S*F&F@`;pV?A<}3iP3 Date: Sun, 2 Jun 2024 19:58:36 +0300 Subject: [PATCH 33/71] check --- lab_5_scrapper/scrapper_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 7d915f6b..87d32f0b 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,7 +1,7 @@ { "seed_urls": ["https://donday.ru/"], "headers": {}, - "total_articles_to_find_and_parse": 30, + "total_articles_to_find_and_parse": 3, "encoding": "utf-8", "timeout": 10, "should_verify_certificate": true, From 53a8209fdb1fa95537e65297cc00199b8ad015eb Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 20:16:59 +0300 Subject: [PATCH 34/71] please be right --- lab_5_scrapper/scrapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 7fafb1d9..db5e575e 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -263,7 +263,7 @@ def find_articles(self) -> None: for item in content.find_all('h3', class_='btl'): url_news = self._extract_url(item) if url_news not in self.urls: - self.urls.extend(url_news) + self.urls.append(url_news) def get_search_urls(self) -> list: """ @@ -371,7 +371,7 @@ def main() -> None: article = parser.parse() to_raw(article) to_meta(article) - + print('Done') if __name__ == "__main__": main() \ No newline at end of file From 23a9261b952ba767aa1c00ade545a75770d82acd Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 20:27:33 +0300 Subject: [PATCH 35/71] checking requirements --- requirements.txt | Bin 2388 -> 2392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1e6b62fd5c985624f18ce48b536e10e912a601cd..d17b59cf5e7b40dce3495eef80fc0d5a015f94fb 100644 GIT binary patch delta 20 bcmca2bVF!^02`z7W_~t)W=7@7vYh4sJp2Ty delta 16 Xcmca1bVX=`0NZ9EHa_ObN}Of@F0KS; From 659871ee5493ba15fac4fc7f114676c7313bda4c Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 20:38:20 +0300 Subject: [PATCH 36/71] checking requirements --- lab_5_scrapper/scrapper.py | 3 ++- requirements.txt | Bin 2392 -> 1558 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index db5e575e..c7600545 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -259,7 +259,8 @@ def find_articles(self) -> None: continue soup = BeautifulSoup(response.text, "html.parser") contents = soup.find_all('div', id='dle-content') - for content in contents: + max_articles = self.config.get_num_articles() + for content in contents[:max_articles]: for item in content.find_all('h3', class_='btl'): url_news = self._extract_url(item) if url_news not in self.urls: diff --git a/requirements.txt b/requirements.txt index d17b59cf5e7b40dce3495eef80fc0d5a015f94fb..e1d162cb4abf551c2861314379e53b9f099b886e 100644 GIT binary patch literal 1558 zcmZ{kOK;Oq5QS%r#7{{SJ1K<)i?Txk2~_qdah=4)v4i7~v_Bp=-;8hE@=!FffBjobt!cKK^M6EA=*faNq;=;C4Og^PlPn0*c-g)+w zJvu*irvg}t+u4J%qMjS!mwMmo3&@4{2#wdSaV>xAOpWSMDN^q^lth;FajowMv6Sj| z^f~2mC0uCTN_pnq=p3iRQ`wz&EGdo1_sXMm)}>-@FHz$(QENL36MZHQorw&0-aYzw zCo2Zc)RfaPTdnJD^dFhy!GeLl_ddI*Kv|k3FniU6N`(IXr3amQK$TWr)lP3@@H{W# z6=Fzz>)apOBlagDKFV(GvwgV4j^2|u{#z+1?AySO?^+g9PJ}OtT+5=rJ9{U5Z#O#o z-Wj8Jub-Wv%B?yvQPrq<={2Z^3ZszC{5yZP`@68@+7F6iOX45R2hAT-^1ta|g3;Tk zW=C}u92#@4d(@fTKD#Gs5&aBy&c&Xz7sR;t>@oL8sm!>K8ohJ(H2N~$1~JhoR%|{o zOZy=Ud# literal 2392 zcmZXWO;g)o420ivXZkBRCqojxdg!gE&h*sYncx7SI8N#~4e;aJ?xVG^p~Kh-mR@PK zTFLqQXIUEkZA({{x^By=O!WC&cKW_ApY?ZIrsY!CY57<_$g7q8p;V=oN7`qy&%%DA zr^|8(pF4flin7(`uAGJUS$NKMU-bU9qP@*D>tj`cX{i|7a<3T9$5}AVdPJ3;8`GU4 zfoLwvT=}NuLf1U{Wqi5uQi5Q$+=mb}u!djKbhdIBHe_i@sZuERr18Ul_xoqH)DiXJeqPR993|~f9XZe^FAlfyU5!r?{oNIhZT3A z(o=V*9YuI+-zd)}tjXq8#QzeN+?F4z8Xpjxzh>vmw)}i$nT$hR*hdr8nT)~YEIMHx z?xM;rDu5C99Tv`m_4L}yf&!}^WA+m)_IVKRP0u7*+>?i32MiNsB0?j~yHOOlB40*9 zov0@(osGKxRTVX=cd06|yBf~Zu}4{tx`vSXa(%+SQTrrUb6zOx2 z@4bAk<;gT!C)r&iuFI1us$cQKzqN|4+Q74n8Rok?NCaQt{uX|ZF_Yi*9nDdlJDEx& zS|{e{W~ci@v9dw_Nte-V#DcMS=Cby*?u3;%>&SqW^JzT@??yPD4id+b~;B!KS{26S_e1Bu(FHB zwe5tJUaxgug@@~gJ4bDU*R5DRr~_m`+w;+;r6zR1yt9L{N9ez9jJy$)}M5e(VsRKQf;TSe>oj*_9%E_L>tS#Kp!{ZbrQ z>2xK+Md;25!R7vfXcpVsTG@w=nA2gdiQrDBqVi2coZFbl%;H&Or=SOGh05X5N*QdE zV6ln*avr}yFJnKp-Tk|W)`{7C>&rWg>4tyerp^)@&+8r=vq(;FWf(&TFS_SR`kGmu z-%Y@HD|b?uCwG`o+s!P!Mh(`Nqo!hb&*ZLgUEG}&TdPx^Z17s)sJm0AS2_t+s<`O; zWSf6m4DTkkiF@GR9oFWxn0itqHaPu6kHgzyTp{~|S!6>kBBysE3L@iCtnGE($RpW< mdu#5f4A^;RV9hx;q7!lM_sBF@0#B=XMMa*nRA5em+4%>pv{Y^Y From a91975d951284bb54e8029ae96dfbe89345ebb40 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 21:22:27 +0300 Subject: [PATCH 37/71] for 6 --- lab_5_scrapper/scrapper.py | 9 +++++++++ lab_5_scrapper/settings.json | 2 +- lab_5_scrapper/target_score.txt | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index c7600545..f723afa4 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -319,6 +319,14 @@ def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> No Args: article_soup (bs4.BeautifulSoup): BeautifulSoup instance """ + title_find = article_soup.find(itemprop="headline") + self.article.title = title_find.text.replace('\n', '') + author = article_soup.find(class_="argauthor") + self.article.author = author.text.replace('\n', '').strip() + topics = article_soup.find(class_="argcat") + self.article.topics = topics.text.replace('\n', '') + time = article_soup.find('time', itemprop="datePublished") + self.article.time = time.text.replace('\n', '') def unify_date_format(self, date_str: str) -> datetime.datetime: """ @@ -342,6 +350,7 @@ def parse(self) -> Union[Article, bool, list]: if response.ok: article_bs = BeautifulSoup(response.text, features='lxml') self._fill_article_with_text(article_bs) + self._fill_article_with_meta_information(article_bs) return self.article diff --git a/lab_5_scrapper/settings.json b/lab_5_scrapper/settings.json index 88a8b073..a44d6454 100644 --- a/lab_5_scrapper/settings.json +++ b/lab_5_scrapper/settings.json @@ -1,3 +1,3 @@ { - "target_score": 4 + "target_score": 6 } diff --git a/lab_5_scrapper/target_score.txt b/lab_5_scrapper/target_score.txt index bf0d87ab..62f94575 100644 --- a/lab_5_scrapper/target_score.txt +++ b/lab_5_scrapper/target_score.txt @@ -1 +1 @@ -4 \ No newline at end of file +6 \ No newline at end of file From c4b6be031feaf0ecb0b2afb0e1d17fc374cc03ae Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 21:35:19 +0300 Subject: [PATCH 38/71] for 6 --- lab_5_scrapper/scrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index f723afa4..e6e3b62a 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -322,7 +322,7 @@ def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> No title_find = article_soup.find(itemprop="headline") self.article.title = title_find.text.replace('\n', '') author = article_soup.find(class_="argauthor") - self.article.author = author.text.replace('\n', '').strip() + self.article.author = [author.text.replace('\n', '').strip()] topics = article_soup.find(class_="argcat") self.article.topics = topics.text.replace('\n', '') time = article_soup.find('time', itemprop="datePublished") From d466f21c216e1a13c459a490b6f4d97e5390e784 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 21:42:22 +0300 Subject: [PATCH 39/71] final hope --- requirements.txt | Bin 1558 -> 314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index e1d162cb4abf551c2861314379e53b9f099b886e..818a1279e9a9498ed97123ea4a59706e5f89721b 100644 GIT binary patch delta 38 wcmV+>0NMYR47vgW|NfD>GLsYmK9g<%G?Ov{7L#fM8k6z^CX>hn9+PMVAQ!O>H~;_u literal 1558 zcmZ{kOK;Oq5QS%r#7{{SJ1K<)i?Txk2~_qdah=4)v4i7~v_Bp=-;8hE@=!FffBjobt!cKK^M6EA=*faNq;=;C4Og^PlPn0*c-g)+w zJvu*irvg}t+u4J%qMjS!mwMmo3&@4{2#wdSaV>xAOpWSMDN^q^lth;FajowMv6Sj| z^f~2mC0uCTN_pnq=p3iRQ`wz&EGdo1_sXMm)}>-@FHz$(QENL36MZHQorw&0-aYzw zCo2Zc)RfaPTdnJD^dFhy!GeLl_ddI*Kv|k3FniU6N`(IXr3amQK$TWr)lP3@@H{W# z6=Fzz>)apOBlagDKFV(GvwgV4j^2|u{#z+1?AySO?^+g9PJ}OtT+5=rJ9{U5Z#O#o z-Wj8Jub-Wv%B?yvQPrq<={2Z^3ZszC{5yZP`@68@+7F6iOX45R2hAT-^1ta|g3;Tk zW=C}u92#@4d(@fTKD#Gs5&aBy&c&Xz7sR;t>@oL8sm!>K8ohJ(H2N~$1~JhoR%|{o zOZy=Ud# From 820524e7851ae734581b9b3a1ed0b9b54a8af86f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 21:46:55 +0300 Subject: [PATCH 40/71] final hope --- requirements.txt | Bin 314 -> 310 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 818a1279e9a9498ed97123ea4a59706e5f89721b..435b8b143a72eccfd0588bad79fd0b84dc1bf0c1 100644 GIT binary patch literal 310 zcmZXP*$Toi6hzOn;HOw>Q&1oLm{#k8wT)eH`FM41N1p+Pa<)1-2}?4~lsPl@@*U~4<2eOK8XSq7rq?{UYR27-)GR2CNCS7JcUsX~r_skvrq(I;g^FO{?Y4o>`1I-7K;&gR#Dt|Ms?hR3_mnXIT2y+Hoc z7%8>1yv**j$JrP)DH}@+dN3KRTU$c*M>scb@Z=0sB2E|l?#Ng6 Date: Sun, 2 Jun 2024 22:07:32 +0300 Subject: [PATCH 41/71] final hope --- delete this | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 delete this diff --git a/delete this b/delete this deleted file mode 100644 index e69de29b..00000000 From 3ad818ef07be4485438a19ce40840d541a5a55d3 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 22:36:50 +0300 Subject: [PATCH 42/71] final hope --- requirements.txt | Bin 310 -> 2302 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 435b8b143a72eccfd0588bad79fd0b84dc1bf0c1..f4de09c3d5ef2eafc6ae6650658e692b2d6c7b26 100644 GIT binary patch literal 2302 zcmZve-EP`I5QX=;QXhpVKz=WBU8z#9`T&tJ1SrOKjVU1y-}Zbno~}U^T5xvH&YU^( z zJ0YiOHo{jzURs(8;kFLLEqt(MwqF{TLbjWgO4y0T+NHhr;PqiPh;ptQtYE-tnRaIPN&8c+$AKNZj#8>Mo*T2YFeEWd&3kZc zEQ(G@e1@LR5e-V&s-@&gPiV?tfx_qg;FJB{{C4ttHVo&e;%b)KE#(bWvW3g@y-xRb z8fre7{iQsA(Y->pH>2A(QWKWkYSIs(uMCa}stIeov>{);zPIY?&;Xy#X0PgZ zE;H@S%u9|7ZQYL73mk|%?jFT=FCLxhsgN=mDY?i%rG^@8WXP7@QxV+KuROspJLRA;u>i#0Q0GSt&b3}Fx%^Xeg% zR=9)CTygyV6qdMqt>7@X{5l5Do(r!mG>;RnL?&r;85TS%8Rc&T?5wPN!i)C}9Zv2% zuf&F0p4EIdF`a75Aonl(YK&v{tgkG3mAPJ*Sl%ggA_`-d7(riin@A;Q{8lUX8pzNB z3)K(>(~!#Zd5X5w#D~7a2RRNt=c~H*H>S_=Ue)IPnEP)0MkVu9hS!=~jq0IRV}iH> ze7jf9I^FV4gm3QGUNy1QO}G-p!;n#CO8hsF-zv-q&z7HgoxVz?ccGcQWS;8GQ+^yF zy~O+X=D!L@t-Bgb5PFyyH8*}R&+nd-EFH8KLWI&ji{O3|8_szzaEcmUN1XlzrmaWE delta 77 zcmew-xQ&VF|G$Yw2COLznGETZd6}dq_c2RNZeWp{{E1a<@*Xy>$@ADWCd;ua0NEUq c8`wl7N*EFu@))Xsq%9B{GUzc_0I?AR0K#Dung9R* From b14b84c8a873a033a59d2c0bac6a4e13397af346 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 22:42:42 +0300 Subject: [PATCH 43/71] final hope --- lab_5_scrapper/scrapper_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index 87d32f0b..dcbcb0f9 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -2,7 +2,7 @@ "seed_urls": ["https://donday.ru/"], "headers": {}, "total_articles_to_find_and_parse": 3, - "encoding": "utf-8", + "encoding": "", "timeout": 10, "should_verify_certificate": true, "headless_mode": true From f2cb8c46421574d7af705371e7e16a5e7ab6b457 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 22:50:50 +0300 Subject: [PATCH 44/71] final hope --- requirements.txt | Bin 2302 -> 140 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index f4de09c3d5ef2eafc6ae6650658e692b2d6c7b26..1a5b604f3acb5f6e692133c476572001f56cb663 100644 GIT binary patch literal 140 zcmWlRNe;sx3`O@G#$uA1E;x*nQVE3ujg8V|!P#qee|o=NFD#t45iC5ws+If*8uXMA zJEwQgRC|-ugR!915x+eW( zJ0YiOHo{jzURs(8;kFLLEqt(MwqF{TLbjWgO4y0T+NHhr;PqiPh;ptQtYE-tnRaIPN&8c+$AKNZj#8>Mo*T2YFeEWd&3kZc zEQ(G@e1@LR5e-V&s-@&gPiV?tfx_qg;FJB{{C4ttHVo&e;%b)KE#(bWvW3g@y-xRb z8fre7{iQsA(Y->pH>2A(QWKWkYSIs(uMCa}stIeov>{);zPIY?&;Xy#X0PgZ zE;H@S%u9|7ZQYL73mk|%?jFT=FCLxhsgN=mDY?i%rG^@8WXP7@QxV+KuROspJLRA;u>i#0Q0GSt&b3}Fx%^Xeg% zR=9)CTygyV6qdMqt>7@X{5l5Do(r!mG>;RnL?&r;85TS%8Rc&T?5wPN!i)C}9Zv2% zuf&F0p4EIdF`a75Aonl(YK&v{tgkG3mAPJ*Sl%ggA_`-d7(riin@A;Q{8lUX8pzNB z3)K(>(~!#Zd5X5w#D~7a2RRNt=c~H*H>S_=Ue)IPnEP)0MkVu9hS!=~jq0IRV}iH> ze7jf9I^FV4gm3QGUNy1QO}G-p!;n#CO8hsF-zv-q&z7HgoxVz?ccGcQWS;8GQ+^yF zy~O+X=D!L@t-Bgb5PFyyH8*}R&+nd-EFH8KLWI&ji{O3|8_szzaEcmUN1XlzrmaWE From d0c2e95ed5688e22477659c46cd3d0b85b6ebf3f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 22:55:57 +0300 Subject: [PATCH 45/71] final hope --- requirements.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1a5b604f..e1d91d2f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ -pydantic~=2.7.2 -bs4~=0.0.2 beautifulsoup4~=4.12.0 -requests~=2.31.0 -stanza~=1.8.2 -spacy~=3.7.4 +bs4~=0.0.2 +matplotlib~=3.9.0 networkx~=3.3 pillow~=10.3.0 -matplotlib~=3.9.0 \ No newline at end of file +pydantic~=2.7.2 +requests~=2.31.0 +spacy~=3.7.4 +stanza~=1.8.2 \ No newline at end of file From d25f6a5b5141c928cce61ccd879e805583ae064b Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:04:05 +0300 Subject: [PATCH 46/71] final hope --- requirements.txt | Bin 140 -> 314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index e1d91d2f10be6c288d55ab0d893e92935dc8df18..818a1279e9a9498ed97123ea4a59706e5f89721b 100644 GIT binary patch literal 314 zcmYk1+YW*-5JczM#81&k0e$jgKx-taw*toa@#^VfqajO^o!K+H?^i3YMxzFGI`9Vd zy6|3AY0Fn>sX~r_skvrq(I;g^FO{?Y4o>`1I-7K;&gR#Dt|Ms?hR3_mnXIT2y+Hoc z7%8>1yv**j$JrP)DH}@+dN3KRTU$c*M>scb@Z=0sB2E|l?#Ng6!&ycD%leo$9%icFtflIFbE&VCB5eU}2N|NS~32X|XeMppN^s P(ha;K#`;5v;Rf~(fBh^< From 373179bd823fe8504772788f3c52041ab2445fd3 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:07:24 +0300 Subject: [PATCH 47/71] final hope --- requirements.txt | Bin 314 -> 50 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 818a1279e9a9498ed97123ea4a59706e5f89721b..2859b987ce7999b214276f51dea1beb9c836f39e 100644 GIT binary patch literal 50 zcmYc)HmS2U&@<38;z~+QEG@}QE6pj+FD(Fyn&=rC=^1ksr52W^7MB#)*#db$1OS-{ B55WKc literal 314 zcmYk1+YW*-5JczM#81&k0e$jgKx-taw*toa@#^VfqajO^o!K+H?^i3YMxzFGI`9Vd zy6|3AY0Fn>sX~r_skvrq(I;g^FO{?Y4o>`1I-7K;&gR#Dt|Ms?hR3_mnXIT2y+Hoc z7%8>1yv**j$JrP)DH}@+dN3KRTU$c*M>scb@Z=0sB2E|l?#Ng6 Date: Sun, 2 Jun 2024 23:11:04 +0300 Subject: [PATCH 48/71] final hope --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2859b987..1e653d0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -bs4~=0.0.2 beautifulsoup4~=4.12.3 +bs4~=0.0.2 requests~=2.32.3 \ No newline at end of file From 7a6a77b1d795d59451dbc797c130ca2902b63d51 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:17:08 +0300 Subject: [PATCH 49/71] final hope --- lab_5_scrapper/scrapper.py | 1 + requirements.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index e6e3b62a..041b2297 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -383,5 +383,6 @@ def main() -> None: to_meta(article) print('Done') + if __name__ == "__main__": main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 1e653d0b..2859b987 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -beautifulsoup4~=4.12.3 bs4~=0.0.2 +beautifulsoup4~=4.12.3 requests~=2.32.3 \ No newline at end of file From 4c28e8c3f3365769d2f01306728a744088ccc19e Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:19:10 +0300 Subject: [PATCH 50/71] final hope --- lab_6_pipeline/pipeline.py | 55 ++++++++++++++++++++++++++++++------ lab_6_pipeline/settings.json | 2 +- requirements.txt | 2 +- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 91e9b7ac..63875642 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -10,7 +10,9 @@ DiGraph = None # type: ignore print('No libraries installed. Failed to import.') -from core_utils.article.article import Article +from core_utils.article.article import Article, get_article_id_from_filepath, split_by_sentence +from core_utils.article.io import from_raw, to_cleaned +from core_utils.constants import ASSETS_PATH from core_utils.pipeline import (AbstractCoNLLUAnalyzer, CoNLLUDocument, LibraryWrapper, PipelineProtocol, StanzaDocument, TreeNode) @@ -21,6 +23,18 @@ class InconsistentDatasetError(Exception): """ +class EmptyDirectoryError(Exception): + """ + Directory is empty + """ + + +class EmptyFileError(Exception): + """ + Article file is empty + """ + + class CorpusManager: """ Work with articles and store them. @@ -42,25 +56,34 @@ def _validate_dataset(self) -> None: """ Validate folder with assets. """ - if not self.path_to_raw_txt_data.exists: + if not self.path_to_raw_txt_data.exists(): raise FileNotFoundError - if not self.path_to_raw_txt_data.is_dir: + if not self.path_to_raw_txt_data.is_dir(): raise NotADirectoryError if not any(self.path_to_raw_txt_data.iterdir()): raise InconsistentDatasetError - raw_t = list(self.path_to_raw_txt_data.glob("*_raw.txt"))) - meta_t = list(self.path_to_raw_txt_data.glob("*_meta.txt"))) - if len(raw_t) != len(meta_t): + raw_files = [i for i in self.path_to_raw_txt_data.glob('*_raw.txt')] + meta_files = [i for i in self.path_to_raw_txt_data.glob('*_meta.json')] + if len(raw_files) != len(meta_files): raise InconsistentDatasetError + sorted_raw_files = sorted(raw_files, key=get_article_id_from_filepath) + sorted_meta_files = sorted(meta_files, key=get_article_id_from_filepath) + + for index, (raw_file, meta_file) in enumerate(zip(sorted_raw_files, sorted_meta_files), 1): + if (index != get_article_id_from_filepath(raw_file) or index != get_article_id_from_filepath(meta_file) + or raw_file.stat().st_size == 0 or meta_file.stat().st_size == 0): + raise InconsistentDatasetError def _scan_dataset(self) -> None: """ Register each dataset entry. """ - - + for file in self.path_to_raw_txt_data.glob('*_raw.txt'): + article_id = get_article_id_from_filepath(file) + article_text = from_raw(path=file, article=Article(url=None, article_id=article_id)) + self._storage[article_id] = article_text def get_articles(self) -> dict: """ @@ -69,6 +92,7 @@ def get_articles(self) -> dict: Returns: dict: Storage params """ + return self._storage class TextProcessingPipeline(PipelineProtocol): @@ -86,11 +110,20 @@ def __init__( corpus_manager (CorpusManager): CorpusManager instance analyzer (LibraryWrapper | None): Analyzer instance """ + self._corpus_manager = corpus_manager + self._analyzer = analyzer def run(self) -> None: """ Perform basic preprocessing and write processed text to files. """ + for article in self._corpus_manager.get_articles().values(): + to_cleaned(article) + if self._analyzer: + texts = split_by_sentence(article.text) + text_analyze = self._analyzer.analyze(texts) + article.set_conllu_info(text_analyze) + self._analyzer.to_conllu(article) class UDPipeAnalyzer(LibraryWrapper): @@ -277,7 +310,11 @@ def main() -> None: """ Entrypoint for pipeline module. """ - + corpus_manager = CorpusManager(path_to_raw_txt_data=ASSETS_PATH) + analyzer = UDPipeAnalyzer() + pipeline = TextProcessingPipeline(corpus_manager, analyzer) + pipeline.run() + print('done') if __name__ == "__main__": main() diff --git a/lab_6_pipeline/settings.json b/lab_6_pipeline/settings.json index ee7a97c3..88a8b073 100644 --- a/lab_6_pipeline/settings.json +++ b/lab_6_pipeline/settings.json @@ -1,3 +1,3 @@ { - "target_score": 0 + "target_score": 4 } diff --git a/requirements.txt b/requirements.txt index 2859b987..1e653d0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -bs4~=0.0.2 beautifulsoup4~=4.12.3 +bs4~=0.0.2 requests~=2.32.3 \ No newline at end of file From e29eb758851dd152fc815c080331aedfdca1898f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:23:10 +0300 Subject: [PATCH 51/71] final hope --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1e653d0b..0d5f5af8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -beautifulsoup4~=4.12.3 -bs4~=0.0.2 -requests~=2.32.3 \ No newline at end of file +beautifulsoup4==4.12.3 +bs4==0.0.2 +requests==2.32.3 \ No newline at end of file From 5298fafe2bef3f8883456c9980ec1fcdb8fa2c95 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:28:58 +0300 Subject: [PATCH 52/71] final hope --- lab_6_pipeline/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_6_pipeline/settings.json b/lab_6_pipeline/settings.json index 88a8b073..ee7a97c3 100644 --- a/lab_6_pipeline/settings.json +++ b/lab_6_pipeline/settings.json @@ -1,3 +1,3 @@ { - "target_score": 4 + "target_score": 0 } From 514e2648fe22102c87af9022ca63a17045946c50 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:38:52 +0300 Subject: [PATCH 53/71] for 4 --- lab_6_pipeline/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_6_pipeline/settings.json b/lab_6_pipeline/settings.json index ee7a97c3..88a8b073 100644 --- a/lab_6_pipeline/settings.json +++ b/lab_6_pipeline/settings.json @@ -1,3 +1,3 @@ { - "target_score": 0 + "target_score": 4 } From c0bcd9e848fa62b748d0889264d24915ce31b6c2 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:47:01 +0300 Subject: [PATCH 54/71] for 4 --- lab_6_pipeline/pipeline.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 63875642..2d8e4367 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -3,6 +3,7 @@ """ # pylint: disable=too-few-public-methods, unused-import, undefined-variable, too-many-nested-blocks import pathlib +import stanza try: from networkx import DiGraph From 32a90fbdffb0854228ad718557a9ac62a8a9649f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Sun, 2 Jun 2024 23:52:48 +0300 Subject: [PATCH 55/71] for 4 --- requirements.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0d5f5af8..c75dd0e8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,10 @@ beautifulsoup4==4.12.3 bs4==0.0.2 -requests==2.32.3 \ No newline at end of file +requests~=2.31.0 +pydantic~=2.7.2 +DateTime~=5.5 +stanza~=1.8.2 +spacy~=3.7.4 +networkx~=3.2.1 +pillow~=10.3.0 +matplotlib~=3.8.4 \ No newline at end of file From 600e3f60e8ed7bb5b093bfae22ec868c48182f69 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 00:11:38 +0300 Subject: [PATCH 56/71] for 4 --- lab_5_scrapper/scrapper.py | 3 ++- lab_6_pipeline/pipeline.py | 9 ++++++--- requirements.txt | 16 ++++++++-------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lab_5_scrapper/scrapper.py b/lab_5_scrapper/scrapper.py index 041b2297..2c8a7bd4 100644 --- a/lab_5_scrapper/scrapper.py +++ b/lab_5_scrapper/scrapper.py @@ -326,7 +326,7 @@ def _fill_article_with_meta_information(self, article_soup: BeautifulSoup) -> No topics = article_soup.find(class_="argcat") self.article.topics = topics.text.replace('\n', '') time = article_soup.find('time', itemprop="datePublished") - self.article.time = time.text.replace('\n', '') + self.article.time = self.unify_date_format(time.attrs.get('datetime')) def unify_date_format(self, date_str: str) -> datetime.datetime: """ @@ -339,6 +339,7 @@ def unify_date_format(self, date_str: str) -> datetime.datetime: datetime.datetime: Datetime object """ + def parse(self) -> Union[Article, bool, list]: """ Parse each article. diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 2d8e4367..4b246e42 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -2,7 +2,6 @@ Pipeline for CONLL-U formatting. """ # pylint: disable=too-few-public-methods, unused-import, undefined-variable, too-many-nested-blocks -import pathlib import stanza try: @@ -11,9 +10,13 @@ DiGraph = None # type: ignore print('No libraries installed. Failed to import.') -from core_utils.article.article import Article, get_article_id_from_filepath, split_by_sentence +import pathlib +import spacy_udpipe + +from core_utils.article.article import (Article, ArtifactType, get_article_id_from_filepath, + split_by_sentence) from core_utils.article.io import from_raw, to_cleaned -from core_utils.constants import ASSETS_PATH +from core_utils.constants import ASSETS_PATH, UDPIPE_MODEL_PATH from core_utils.pipeline import (AbstractCoNLLUAnalyzer, CoNLLUDocument, LibraryWrapper, PipelineProtocol, StanzaDocument, TreeNode) diff --git a/requirements.txt b/requirements.txt index c75dd0e8..d09c9a9a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ beautifulsoup4==4.12.3 bs4==0.0.2 -requests~=2.31.0 -pydantic~=2.7.2 -DateTime~=5.5 -stanza~=1.8.2 -spacy~=3.7.4 -networkx~=3.2.1 -pillow~=10.3.0 -matplotlib~=3.8.4 \ No newline at end of file +datetime==5.5 +matplotlib==3.8.4 +networkx==3.2.1 +pillow==10.3.0 +pydantic==2.7.2 +requests==2.31.0 +spacy==3.7.4 +stanza==1.8.2 \ No newline at end of file From ef598aafe28139f272895e097a5b8c607a09c514 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 00:24:56 +0300 Subject: [PATCH 57/71] for 4 --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index d09c9a9a..993cd744 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,5 +6,6 @@ networkx==3.2.1 pillow==10.3.0 pydantic==2.7.2 requests==2.31.0 +spacy-udpipe==1.0.0 spacy==3.7.4 stanza==1.8.2 \ No newline at end of file From 4b8788a231e10de77eeb1357b7dcd95e0fe854f7 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 00:37:51 +0300 Subject: [PATCH 58/71] for 4 --- lab_6_pipeline/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 4b246e42..0f085507 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -65,7 +65,7 @@ def _validate_dataset(self) -> None: if not self.path_to_raw_txt_data.is_dir(): raise NotADirectoryError if not any(self.path_to_raw_txt_data.iterdir()): - raise InconsistentDatasetError + raise EmptyDirectoryError raw_files = [i for i in self.path_to_raw_txt_data.glob('*_raw.txt')] meta_files = [i for i in self.path_to_raw_txt_data.glob('*_meta.json')] From 01597dee826699e409cd0039727f810070d979ab Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 00:49:57 +0300 Subject: [PATCH 59/71] for 4 --- lab_6_pipeline/pipeline.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 0f085507..a08c6ed3 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -75,10 +75,12 @@ def _validate_dataset(self) -> None: sorted_raw_files = sorted(raw_files, key=get_article_id_from_filepath) sorted_meta_files = sorted(meta_files, key=get_article_id_from_filepath) - for index, (raw_file, meta_file) in enumerate(zip(sorted_raw_files, sorted_meta_files), 1): - if (index != get_article_id_from_filepath(raw_file) or index != get_article_id_from_filepath(meta_file) - or raw_file.stat().st_size == 0 or meta_file.stat().st_size == 0): - raise InconsistentDatasetError + for ind, (raw, meta) in enumerate(iterable=zip(sorted_raw_files, sorted_meta_files), start=1): + if ind != get_article_id_from_filepath(raw) \ + or ind != get_article_id_from_filepath(meta) \ + or not raw.stat().st_size \ + or not meta.stat().st_size: + raise InconsistentDatasetError() def _scan_dataset(self) -> None: """ From 60e0a77a3a818fe5ea2ddabf219c7ee62c1b6858 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 07:35:40 +0300 Subject: [PATCH 60/71] for 4 --- lab_6_pipeline/pipeline.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index a08c6ed3..8cffe3db 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -75,12 +75,11 @@ def _validate_dataset(self) -> None: sorted_raw_files = sorted(raw_files, key=get_article_id_from_filepath) sorted_meta_files = sorted(meta_files, key=get_article_id_from_filepath) - for ind, (raw, meta) in enumerate(iterable=zip(sorted_raw_files, sorted_meta_files), start=1): - if ind != get_article_id_from_filepath(raw) \ - or ind != get_article_id_from_filepath(meta) \ - or not raw.stat().st_size \ - or not meta.stat().st_size: - raise InconsistentDatasetError() + for index, (meta, raw) in enumerate(zip(sorted_meta_files, sorted_raw_files), 1): + if index != get_article_id_from_filepath(meta) \ + or index != get_article_id_from_filepath(raw) \ + or not meta.stat().st_size or not raw.stat().st_size: + raise InconsistentDatasetError def _scan_dataset(self) -> None: """ From c76969a3921749aee9b82eb313134811f5001af8 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 08:00:41 +0300 Subject: [PATCH 61/71] for 4 --- lab_6_pipeline/pipeline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 8cffe3db..721a303b 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -115,14 +115,14 @@ def __init__( corpus_manager (CorpusManager): CorpusManager instance analyzer (LibraryWrapper | None): Analyzer instance """ - self._corpus_manager = corpus_manager + self._corpus = corpus_manager self._analyzer = analyzer def run(self) -> None: """ Perform basic preprocessing and write processed text to files. """ - for article in self._corpus_manager.get_articles().values(): + for article in self._corpus.get_articles().values(): to_cleaned(article) if self._analyzer: texts = split_by_sentence(article.text) From 8946377f1cff2c5cedd174c5988f9cd92aeb5b31 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 08:16:23 +0300 Subject: [PATCH 62/71] for 4 --- lab_6_pipeline/pipeline.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 721a303b..cd0a559e 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -122,13 +122,9 @@ def run(self) -> None: """ Perform basic preprocessing and write processed text to files. """ - for article in self._corpus.get_articles().values(): + articles = self._corpus.get_articles().values() + for article in articles: to_cleaned(article) - if self._analyzer: - texts = split_by_sentence(article.text) - text_analyze = self._analyzer.analyze(texts) - article.set_conllu_info(text_analyze) - self._analyzer.to_conllu(article) class UDPipeAnalyzer(LibraryWrapper): @@ -143,6 +139,7 @@ def __init__(self) -> None: Initialize an instance of the UDPipeAnalyzer class. """ + def _bootstrap(self) -> AbstractCoNLLUAnalyzer: """ Load and set up the UDPipe model. @@ -170,7 +167,6 @@ def to_conllu(self, article: Article) -> None: article (Article): Article containing information to save """ - class StanzaAnalyzer(LibraryWrapper): """ Wrapper for stanza library. From 1f4ca81d8eaf5e3a2fef91451651065a9dad0404 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 08:42:37 +0300 Subject: [PATCH 63/71] for 4 --- lab_6_pipeline/pipeline.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index cd0a559e..430f75a7 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -67,9 +67,9 @@ def _validate_dataset(self) -> None: if not any(self.path_to_raw_txt_data.iterdir()): raise EmptyDirectoryError - raw_files = [i for i in self.path_to_raw_txt_data.glob('*_raw.txt')] - meta_files = [i for i in self.path_to_raw_txt_data.glob('*_meta.json')] - if len(raw_files) != len(meta_files): + meta_files = list(self.path_to_raw_txt_data.glob("*_meta.json")) + raw_files = list(self.path_to_raw_txt_data.glob("*_raw.txt")) + if len(meta_files) != len(raw_files): raise InconsistentDatasetError sorted_raw_files = sorted(raw_files, key=get_article_id_from_filepath) @@ -116,7 +116,6 @@ def __init__( analyzer (LibraryWrapper | None): Analyzer instance """ self._corpus = corpus_manager - self._analyzer = analyzer def run(self) -> None: """ @@ -311,11 +310,7 @@ def main() -> None: """ Entrypoint for pipeline module. """ - corpus_manager = CorpusManager(path_to_raw_txt_data=ASSETS_PATH) - analyzer = UDPipeAnalyzer() - pipeline = TextProcessingPipeline(corpus_manager, analyzer) - pipeline.run() - print('done') + if __name__ == "__main__": main() From 72f6375e9776cd18897132d6cb7d06d57c9ec134 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 08:56:44 +0300 Subject: [PATCH 64/71] for 4 --- lab_6_pipeline/pipeline.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 430f75a7..4b235d23 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -11,12 +11,9 @@ print('No libraries installed. Failed to import.') import pathlib -import spacy_udpipe -from core_utils.article.article import (Article, ArtifactType, get_article_id_from_filepath, - split_by_sentence) +from core_utils.article.article import (Article, get_article_id_from_filepath) from core_utils.article.io import from_raw, to_cleaned -from core_utils.constants import ASSETS_PATH, UDPIPE_MODEL_PATH from core_utils.pipeline import (AbstractCoNLLUAnalyzer, CoNLLUDocument, LibraryWrapper, PipelineProtocol, StanzaDocument, TreeNode) @@ -138,7 +135,6 @@ def __init__(self) -> None: Initialize an instance of the UDPipeAnalyzer class. """ - def _bootstrap(self) -> AbstractCoNLLUAnalyzer: """ Load and set up the UDPipe model. From 711a2f03e137acb085d2b0afde215c2768804ded Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 09:06:09 +0300 Subject: [PATCH 65/71] for 4 --- lab_6_pipeline/pipeline.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 4b235d23..7ac97b3d 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -11,9 +11,12 @@ print('No libraries installed. Failed to import.') import pathlib +import spacy_udpipe -from core_utils.article.article import (Article, get_article_id_from_filepath) +from core_utils.article.article import (Article, ArtifactType, get_article_id_from_filepath, + split_by_sentence) from core_utils.article.io import from_raw, to_cleaned +from core_utils.constants import ASSETS_PATH, UDPIPE_MODEL_PATH from core_utils.pipeline import (AbstractCoNLLUAnalyzer, CoNLLUDocument, LibraryWrapper, PipelineProtocol, StanzaDocument, TreeNode) @@ -135,6 +138,7 @@ def __init__(self) -> None: Initialize an instance of the UDPipeAnalyzer class. """ + def _bootstrap(self) -> AbstractCoNLLUAnalyzer: """ Load and set up the UDPipe model. @@ -162,6 +166,7 @@ def to_conllu(self, article: Article) -> None: article (Article): Article containing information to save """ + class StanzaAnalyzer(LibraryWrapper): """ Wrapper for stanza library. @@ -306,7 +311,10 @@ def main() -> None: """ Entrypoint for pipeline module. """ - + corpus_manager = CorpusManager(path_to_raw_txt_data=ASSETS_PATH) + udpipe_analyzer = UDPipeAnalyzer() + pipeline = TextProcessingPipeline(corpus_manager, udpipe_analyzer) + pipeline.run() if __name__ == "__main__": main() From d0888df43053f56d83592845e4bce819c437588e Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 09:16:32 +0300 Subject: [PATCH 66/71] for 4 --- lab_6_pipeline/pipeline.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 7ac97b3d..0566b5ca 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -53,6 +53,7 @@ def __init__(self, path_to_raw_txt_data: pathlib.Path) -> None: """ self.path_to_raw_txt_data = path_to_raw_txt_data self._storage = {} + self._validate_dataset() self._scan_dataset() @@ -116,6 +117,7 @@ def __init__( analyzer (LibraryWrapper | None): Analyzer instance """ self._corpus = corpus_manager + self.analyzer = analyzer def run(self) -> None: """ From acaba63ecf717b44d81c1f5929bdd5595428c408 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 09:24:45 +0300 Subject: [PATCH 67/71] for 4 --- lab_6_pipeline/pipeline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 0566b5ca..e538d3a6 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -117,7 +117,7 @@ def __init__( analyzer (LibraryWrapper | None): Analyzer instance """ self._corpus = corpus_manager - self.analyzer = analyzer + self._analyzer = analyzer def run(self) -> None: """ @@ -140,7 +140,6 @@ def __init__(self) -> None: Initialize an instance of the UDPipeAnalyzer class. """ - def _bootstrap(self) -> AbstractCoNLLUAnalyzer: """ Load and set up the UDPipe model. @@ -318,5 +317,6 @@ def main() -> None: pipeline = TextProcessingPipeline(corpus_manager, udpipe_analyzer) pipeline.run() + if __name__ == "__main__": main() From 022f408f9f1f14be16ffb8331e254fc520adb08d Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 09:34:19 +0300 Subject: [PATCH 68/71] for 4 --- lab_6_pipeline/pipeline.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index e538d3a6..7f5319b5 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -11,7 +11,6 @@ print('No libraries installed. Failed to import.') import pathlib -import spacy_udpipe from core_utils.article.article import (Article, ArtifactType, get_article_id_from_filepath, split_by_sentence) @@ -140,6 +139,7 @@ def __init__(self) -> None: Initialize an instance of the UDPipeAnalyzer class. """ + def _bootstrap(self) -> AbstractCoNLLUAnalyzer: """ Load and set up the UDPipe model. @@ -317,6 +317,5 @@ def main() -> None: pipeline = TextProcessingPipeline(corpus_manager, udpipe_analyzer) pipeline.run() - if __name__ == "__main__": main() From 075384a9749cee8feea3d4e8cf38c03d7f7c72d8 Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 09:44:30 +0300 Subject: [PATCH 69/71] for 4 --- lab_6_pipeline/pipeline.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 7f5319b5..62e49256 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -313,8 +313,7 @@ def main() -> None: Entrypoint for pipeline module. """ corpus_manager = CorpusManager(path_to_raw_txt_data=ASSETS_PATH) - udpipe_analyzer = UDPipeAnalyzer() - pipeline = TextProcessingPipeline(corpus_manager, udpipe_analyzer) + pipeline = TextProcessingPipeline(corpus_manager) pipeline.run() if __name__ == "__main__": From fa6d44d23008f888146a4443069c4a8a8353e63f Mon Sep 17 00:00:00 2001 From: RostislavHmelevski Date: Mon, 3 Jun 2024 09:59:34 +0300 Subject: [PATCH 70/71] for 4 --- lab_5_scrapper/scrapper_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_5_scrapper/scrapper_config.json b/lab_5_scrapper/scrapper_config.json index dcbcb0f9..b6f510ec 100644 --- a/lab_5_scrapper/scrapper_config.json +++ b/lab_5_scrapper/scrapper_config.json @@ -1,5 +1,5 @@ { - "seed_urls": ["https://donday.ru/"], + "seed_urls": ["https://donday.ru/page/2/"], "headers": {}, "total_articles_to_find_and_parse": 3, "encoding": "", From 99a096d7b3e06ca7f037cbb92c6e5978b7dfdbf9 Mon Sep 17 00:00:00 2001 From: Marina Date: Mon, 3 Jun 2024 11:35:32 +0300 Subject: [PATCH 71/71] student work from my computer --- lab_6_pipeline/pipeline.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lab_6_pipeline/pipeline.py b/lab_6_pipeline/pipeline.py index 62e49256..e1c4a84b 100644 --- a/lab_6_pipeline/pipeline.py +++ b/lab_6_pipeline/pipeline.py @@ -67,18 +67,12 @@ def _validate_dataset(self) -> None: if not any(self.path_to_raw_txt_data.iterdir()): raise EmptyDirectoryError - meta_files = list(self.path_to_raw_txt_data.glob("*_meta.json")) raw_files = list(self.path_to_raw_txt_data.glob("*_raw.txt")) - if len(meta_files) != len(raw_files): - raise InconsistentDatasetError - sorted_raw_files = sorted(raw_files, key=get_article_id_from_filepath) - sorted_meta_files = sorted(meta_files, key=get_article_id_from_filepath) - for index, (meta, raw) in enumerate(zip(sorted_meta_files, sorted_raw_files), 1): - if index != get_article_id_from_filepath(meta) \ - or index != get_article_id_from_filepath(raw) \ - or not meta.stat().st_size or not raw.stat().st_size: + for index, raw in enumerate(sorted_raw_files, 1): + if index != get_article_id_from_filepath(raw) \ + or not raw.stat().st_size: raise InconsistentDatasetError def _scan_dataset(self) -> None: