From 3eb06b36b39e15563c33691906e63426e0316ae7 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 31 Jul 2021 16:02:10 +0500 Subject: [PATCH 01/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_1/1.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 PARSING/Lesson_1/1.py diff --git a/PARSING/Lesson_1/1.py b/PARSING/Lesson_1/1.py new file mode 100644 index 0000000..a4abaf4 --- /dev/null +++ b/PARSING/Lesson_1/1.py @@ -0,0 +1,14 @@ +import requests +import json + + +url = 'https://api.github.com' +user = 'softicer-67' + + +request = requests.get(f'{url}/users/{user}/repos') + +js = request.json() +for i in range(0, len(js)): + res = f'Project Number: {i + 1}\nProject Name: {js[i]["name"]}\nProject URL: {js[i]["svn_url"]}' + print(res) From adc45e82cdac02edd15a2d34561676fd8772fee3 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 31 Jul 2021 16:32:32 +0500 Subject: [PATCH 02/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_1/1.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/PARSING/Lesson_1/1.py b/PARSING/Lesson_1/1.py index a4abaf4..ac96de8 100644 --- a/PARSING/Lesson_1/1.py +++ b/PARSING/Lesson_1/1.py @@ -6,9 +6,12 @@ user = 'softicer-67' -request = requests.get(f'{url}/users/{user}/repos') +r = requests.get(f'{url}/users/{user}/repos').json() -js = request.json() -for i in range(0, len(js)): - res = f'Project Number: {i + 1}\nProject Name: {js[i]["name"]}\nProject URL: {js[i]["svn_url"]}' - print(res) + +for i in range(len(r)): + x = f'Project Number: {i + 1}\nProject Name: {r[i]["name"]}\nProject URL: {r[i]["svn_url"]}' + print(x) + +with open('data.json', 'w') as f: + json.dump(r, f) From cd798ac15c990f6d3d053aa68bd8b7700639afc0 Mon Sep 17 00:00:00 2001 From: softicer-67 <57116431+softicer-67@users.noreply.github.com> Date: Sat, 31 Jul 2021 16:33:49 +0500 Subject: [PATCH 03/62] Add files via upload --- PARSING/Lesson_1/data.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 PARSING/Lesson_1/data.json diff --git a/PARSING/Lesson_1/data.json b/PARSING/Lesson_1/data.json new file mode 100644 index 0000000..9516753 --- /dev/null +++ b/PARSING/Lesson_1/data.json @@ -0,0 +1 @@ +[{"id": 339833490, "node_id": "MDEwOlJlcG9zaXRvcnkzMzk4MzM0OTA=", "name": "LESSONS", "full_name": "softicer-67/LESSONS", "private": false, "owner": {"login": "softicer-67", "id": 57116431, "node_id": "MDQ6VXNlcjU3MTE2NDMx", "avatar_url": "https://avatars.githubusercontent.com/u/57116431?v=4", "gravatar_id": "", "url": "https://api.github.com/users/softicer-67", "html_url": "https://github.com/softicer-67", "followers_url": "https://api.github.com/users/softicer-67/followers", "following_url": "https://api.github.com/users/softicer-67/following{/other_user}", "gists_url": "https://api.github.com/users/softicer-67/gists{/gist_id}", "starred_url": "https://api.github.com/users/softicer-67/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/softicer-67/subscriptions", "organizations_url": "https://api.github.com/users/softicer-67/orgs", "repos_url": "https://api.github.com/users/softicer-67/repos", "events_url": "https://api.github.com/users/softicer-67/events{/privacy}", "received_events_url": "https://api.github.com/users/softicer-67/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/softicer-67/LESSONS", "description": null, "fork": false, "url": "https://api.github.com/repos/softicer-67/LESSONS", "forks_url": "https://api.github.com/repos/softicer-67/LESSONS/forks", "keys_url": "https://api.github.com/repos/softicer-67/LESSONS/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/softicer-67/LESSONS/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/softicer-67/LESSONS/teams", "hooks_url": "https://api.github.com/repos/softicer-67/LESSONS/hooks", "issue_events_url": "https://api.github.com/repos/softicer-67/LESSONS/issues/events{/number}", "events_url": "https://api.github.com/repos/softicer-67/LESSONS/events", "assignees_url": "https://api.github.com/repos/softicer-67/LESSONS/assignees{/user}", "branches_url": "https://api.github.com/repos/softicer-67/LESSONS/branches{/branch}", "tags_url": "https://api.github.com/repos/softicer-67/LESSONS/tags", "blobs_url": "https://api.github.com/repos/softicer-67/LESSONS/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/softicer-67/LESSONS/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/softicer-67/LESSONS/git/refs{/sha}", "trees_url": "https://api.github.com/repos/softicer-67/LESSONS/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/softicer-67/LESSONS/statuses/{sha}", "languages_url": "https://api.github.com/repos/softicer-67/LESSONS/languages", "stargazers_url": "https://api.github.com/repos/softicer-67/LESSONS/stargazers", "contributors_url": "https://api.github.com/repos/softicer-67/LESSONS/contributors", "subscribers_url": "https://api.github.com/repos/softicer-67/LESSONS/subscribers", "subscription_url": "https://api.github.com/repos/softicer-67/LESSONS/subscription", "commits_url": "https://api.github.com/repos/softicer-67/LESSONS/commits{/sha}", "git_commits_url": "https://api.github.com/repos/softicer-67/LESSONS/git/commits{/sha}", "comments_url": "https://api.github.com/repos/softicer-67/LESSONS/comments{/number}", "issue_comment_url": "https://api.github.com/repos/softicer-67/LESSONS/issues/comments{/number}", "contents_url": "https://api.github.com/repos/softicer-67/LESSONS/contents/{+path}", "compare_url": "https://api.github.com/repos/softicer-67/LESSONS/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/softicer-67/LESSONS/merges", "archive_url": "https://api.github.com/repos/softicer-67/LESSONS/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/softicer-67/LESSONS/downloads", "issues_url": "https://api.github.com/repos/softicer-67/LESSONS/issues{/number}", "pulls_url": "https://api.github.com/repos/softicer-67/LESSONS/pulls{/number}", "milestones_url": "https://api.github.com/repos/softicer-67/LESSONS/milestones{/number}", "notifications_url": "https://api.github.com/repos/softicer-67/LESSONS/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/softicer-67/LESSONS/labels{/name}", "releases_url": "https://api.github.com/repos/softicer-67/LESSONS/releases{/id}", "deployments_url": "https://api.github.com/repos/softicer-67/LESSONS/deployments", "created_at": "2021-02-17T19:28:44Z", "updated_at": "2021-03-24T13:22:32Z", "pushed_at": "2021-07-31T11:02:20Z", "git_url": "git://github.com/softicer-67/LESSONS.git", "ssh_url": "git@github.com:softicer-67/LESSONS.git", "clone_url": "https://github.com/softicer-67/LESSONS.git", "svn_url": "https://github.com/softicer-67/LESSONS", "homepage": null, "size": 258, "stargazers_count": 0, "watchers_count": 0, "language": "Python", "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 0, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 1, "license": null, "forks": 0, "open_issues": 1, "watchers": 0, "default_branch": "master"}] \ No newline at end of file From be59e3f97c61abcfbb3f7827c742ab21f17ff54c Mon Sep 17 00:00:00 2001 From: softicer-67 <57116431+softicer-67@users.noreply.github.com> Date: Sat, 31 Jul 2021 17:00:45 +0500 Subject: [PATCH 04/62] Add files via upload --- PARSING/Lesson_1/2.py | 24 ++++++++++++++++++++++++ PARSING/Lesson_1/data2.json | 1 + 2 files changed, 25 insertions(+) create mode 100644 PARSING/Lesson_1/2.py create mode 100644 PARSING/Lesson_1/data2.json diff --git a/PARSING/Lesson_1/2.py b/PARSING/Lesson_1/2.py new file mode 100644 index 0000000..62271cd --- /dev/null +++ b/PARSING/Lesson_1/2.py @@ -0,0 +1,24 @@ +import requests +import json +import csv + + +url = 'https://cloud-api.yandex.net/v1/' +token = 'MDEwOlJlcG9zaXRvcnkzMzk4MzM0OTA=' + +headers = { + 'Content-Type': 'application/json', + 'Authorization': token +} + +disk_info = 'disk' +folder_info = 'disk/resources' + +res = requests.get(f'{url}{disk_info}') + +print(res.json()) + +with open('data2.json', 'w') as f: + writer = csv.writer(f) + writer.writerow((res.json(),)) + diff --git a/PARSING/Lesson_1/data2.json b/PARSING/Lesson_1/data2.json new file mode 100644 index 0000000..9b6f12c --- /dev/null +++ b/PARSING/Lesson_1/data2.json @@ -0,0 +1 @@ +"{'message': ' .', 'description': 'Unauthorized', 'error': 'UnauthorizedError'}" From ee0e20362131d5b6bc4b1882004f16e9a0634177 Mon Sep 17 00:00:00 2001 From: softicer-67 <57116431+softicer-67@users.noreply.github.com> Date: Sat, 31 Jul 2021 17:14:47 +0500 Subject: [PATCH 05/62] Delete data2.json --- PARSING/Lesson_1/data2.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 PARSING/Lesson_1/data2.json diff --git a/PARSING/Lesson_1/data2.json b/PARSING/Lesson_1/data2.json deleted file mode 100644 index 9b6f12c..0000000 --- a/PARSING/Lesson_1/data2.json +++ /dev/null @@ -1 +0,0 @@ -"{'message': ' .', 'description': 'Unauthorized', 'error': 'UnauthorizedError'}" From c86ea01a6ded196e031890ff18f13d42dd53f4a4 Mon Sep 17 00:00:00 2001 From: softicer-67 <57116431+softicer-67@users.noreply.github.com> Date: Sat, 31 Jul 2021 17:14:56 +0500 Subject: [PATCH 06/62] Delete data.json --- PARSING/Lesson_1/data.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 PARSING/Lesson_1/data.json diff --git a/PARSING/Lesson_1/data.json b/PARSING/Lesson_1/data.json deleted file mode 100644 index 9516753..0000000 --- a/PARSING/Lesson_1/data.json +++ /dev/null @@ -1 +0,0 @@ -[{"id": 339833490, "node_id": "MDEwOlJlcG9zaXRvcnkzMzk4MzM0OTA=", "name": "LESSONS", "full_name": "softicer-67/LESSONS", "private": false, "owner": {"login": "softicer-67", "id": 57116431, "node_id": "MDQ6VXNlcjU3MTE2NDMx", "avatar_url": "https://avatars.githubusercontent.com/u/57116431?v=4", "gravatar_id": "", "url": "https://api.github.com/users/softicer-67", "html_url": "https://github.com/softicer-67", "followers_url": "https://api.github.com/users/softicer-67/followers", "following_url": "https://api.github.com/users/softicer-67/following{/other_user}", "gists_url": "https://api.github.com/users/softicer-67/gists{/gist_id}", "starred_url": "https://api.github.com/users/softicer-67/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/softicer-67/subscriptions", "organizations_url": "https://api.github.com/users/softicer-67/orgs", "repos_url": "https://api.github.com/users/softicer-67/repos", "events_url": "https://api.github.com/users/softicer-67/events{/privacy}", "received_events_url": "https://api.github.com/users/softicer-67/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/softicer-67/LESSONS", "description": null, "fork": false, "url": "https://api.github.com/repos/softicer-67/LESSONS", "forks_url": "https://api.github.com/repos/softicer-67/LESSONS/forks", "keys_url": "https://api.github.com/repos/softicer-67/LESSONS/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/softicer-67/LESSONS/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/softicer-67/LESSONS/teams", "hooks_url": "https://api.github.com/repos/softicer-67/LESSONS/hooks", "issue_events_url": "https://api.github.com/repos/softicer-67/LESSONS/issues/events{/number}", "events_url": "https://api.github.com/repos/softicer-67/LESSONS/events", "assignees_url": "https://api.github.com/repos/softicer-67/LESSONS/assignees{/user}", "branches_url": "https://api.github.com/repos/softicer-67/LESSONS/branches{/branch}", "tags_url": "https://api.github.com/repos/softicer-67/LESSONS/tags", "blobs_url": "https://api.github.com/repos/softicer-67/LESSONS/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/softicer-67/LESSONS/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/softicer-67/LESSONS/git/refs{/sha}", "trees_url": "https://api.github.com/repos/softicer-67/LESSONS/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/softicer-67/LESSONS/statuses/{sha}", "languages_url": "https://api.github.com/repos/softicer-67/LESSONS/languages", "stargazers_url": "https://api.github.com/repos/softicer-67/LESSONS/stargazers", "contributors_url": "https://api.github.com/repos/softicer-67/LESSONS/contributors", "subscribers_url": "https://api.github.com/repos/softicer-67/LESSONS/subscribers", "subscription_url": "https://api.github.com/repos/softicer-67/LESSONS/subscription", "commits_url": "https://api.github.com/repos/softicer-67/LESSONS/commits{/sha}", "git_commits_url": "https://api.github.com/repos/softicer-67/LESSONS/git/commits{/sha}", "comments_url": "https://api.github.com/repos/softicer-67/LESSONS/comments{/number}", "issue_comment_url": "https://api.github.com/repos/softicer-67/LESSONS/issues/comments{/number}", "contents_url": "https://api.github.com/repos/softicer-67/LESSONS/contents/{+path}", "compare_url": "https://api.github.com/repos/softicer-67/LESSONS/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/softicer-67/LESSONS/merges", "archive_url": "https://api.github.com/repos/softicer-67/LESSONS/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/softicer-67/LESSONS/downloads", "issues_url": "https://api.github.com/repos/softicer-67/LESSONS/issues{/number}", "pulls_url": "https://api.github.com/repos/softicer-67/LESSONS/pulls{/number}", "milestones_url": "https://api.github.com/repos/softicer-67/LESSONS/milestones{/number}", "notifications_url": "https://api.github.com/repos/softicer-67/LESSONS/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/softicer-67/LESSONS/labels{/name}", "releases_url": "https://api.github.com/repos/softicer-67/LESSONS/releases{/id}", "deployments_url": "https://api.github.com/repos/softicer-67/LESSONS/deployments", "created_at": "2021-02-17T19:28:44Z", "updated_at": "2021-03-24T13:22:32Z", "pushed_at": "2021-07-31T11:02:20Z", "git_url": "git://github.com/softicer-67/LESSONS.git", "ssh_url": "git@github.com:softicer-67/LESSONS.git", "clone_url": "https://github.com/softicer-67/LESSONS.git", "svn_url": "https://github.com/softicer-67/LESSONS", "homepage": null, "size": 258, "stargazers_count": 0, "watchers_count": 0, "language": "Python", "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 0, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 1, "license": null, "forks": 0, "open_issues": 1, "watchers": 0, "default_branch": "master"}] \ No newline at end of file From b8996f636717d464a5344acff55849cd5945e6ee Mon Sep 17 00:00:00 2001 From: softicer-67 <57116431+softicer-67@users.noreply.github.com> Date: Sat, 31 Jul 2021 17:15:05 +0500 Subject: [PATCH 07/62] Delete 2.py --- PARSING/Lesson_1/2.py | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 PARSING/Lesson_1/2.py diff --git a/PARSING/Lesson_1/2.py b/PARSING/Lesson_1/2.py deleted file mode 100644 index 62271cd..0000000 --- a/PARSING/Lesson_1/2.py +++ /dev/null @@ -1,24 +0,0 @@ -import requests -import json -import csv - - -url = 'https://cloud-api.yandex.net/v1/' -token = 'MDEwOlJlcG9zaXRvcnkzMzk4MzM0OTA=' - -headers = { - 'Content-Type': 'application/json', - 'Authorization': token -} - -disk_info = 'disk' -folder_info = 'disk/resources' - -res = requests.get(f'{url}{disk_info}') - -print(res.json()) - -with open('data2.json', 'w') as f: - writer = csv.writer(f) - writer.writerow((res.json(),)) - From 129d9dc4441fd14741328cf23949b8bd034a133a Mon Sep 17 00:00:00 2001 From: softicer-67 <57116431+softicer-67@users.noreply.github.com> Date: Sat, 31 Jul 2021 17:15:10 +0500 Subject: [PATCH 08/62] Delete 1.py --- PARSING/Lesson_1/1.py | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 PARSING/Lesson_1/1.py diff --git a/PARSING/Lesson_1/1.py b/PARSING/Lesson_1/1.py deleted file mode 100644 index ac96de8..0000000 --- a/PARSING/Lesson_1/1.py +++ /dev/null @@ -1,17 +0,0 @@ -import requests -import json - - -url = 'https://api.github.com' -user = 'softicer-67' - - -r = requests.get(f'{url}/users/{user}/repos').json() - - -for i in range(len(r)): - x = f'Project Number: {i + 1}\nProject Name: {r[i]["name"]}\nProject URL: {r[i]["svn_url"]}' - print(x) - -with open('data.json', 'w') as f: - json.dump(r, f) From bf82de9f5063fefaf68892d98141ea197b7bd03d Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 31 Jul 2021 16:56:36 +0500 Subject: [PATCH 09/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_1/2.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 PARSING/Lesson_1/2.py diff --git a/PARSING/Lesson_1/2.py b/PARSING/Lesson_1/2.py new file mode 100644 index 0000000..ee44b1a --- /dev/null +++ b/PARSING/Lesson_1/2.py @@ -0,0 +1,23 @@ +import requests +import json +import csv + + +url = 'https://cloud-api.yandex.net/v1/' +token = 'MDEwOlJlcG9zaXRvcnkzMzk4MzM0OTA=' + +headers = { + 'Content-Type': 'application/json', + 'Authorization': token +} + +disk_info = 'disk' +folder_info = 'disk/resources' + +res = requests.get(f'{url}{disk_info}') + +print(res.json()) + +with open('data2.json', 'w') as f: + writer = csv.writer(f) + writer.writerow((res.json(),)) From 0ae3a5c232e0f2e9c9377e20452cd691f430c73d Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 31 Jul 2021 16:58:47 +0500 Subject: [PATCH 10/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_1/2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PARSING/Lesson_1/2.py b/PARSING/Lesson_1/2.py index ee44b1a..e859bb4 100644 --- a/PARSING/Lesson_1/2.py +++ b/PARSING/Lesson_1/2.py @@ -21,3 +21,4 @@ with open('data2.json', 'w') as f: writer = csv.writer(f) writer.writerow((res.json(),)) + From 9312e4ac66737b8d90dc304c122763d28ef90354 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 31 Jul 2021 17:13:08 +0500 Subject: [PATCH 11/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_1/2.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PARSING/Lesson_1/2.py b/PARSING/Lesson_1/2.py index e859bb4..760df2b 100644 --- a/PARSING/Lesson_1/2.py +++ b/PARSING/Lesson_1/2.py @@ -22,3 +22,5 @@ writer = csv.writer(f) writer.writerow((res.json(),)) + + From e55f906cbbe97b7000867ad6f6d1cfea738200e3 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Mon, 2 Aug 2021 03:47:42 +0500 Subject: [PATCH 12/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ALGORITMS/Lesson_6/1.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ALGORITMS/Lesson_6/1.py diff --git a/ALGORITMS/Lesson_6/1.py b/ALGORITMS/Lesson_6/1.py new file mode 100644 index 0000000..4bd0117 --- /dev/null +++ b/ALGORITMS/Lesson_6/1.py @@ -0,0 +1,30 @@ +''' +1. Подсчитать, сколько было выделено памяти под переменные в ранее разработанных программах в рамках первых трех уроков. +Проанализировать результат и определить программы с наиболее эффективным использованием памяти. +Примечание: Для анализа возьмите любые 1-3 ваших программы или несколько вариантов кода для одной и той же задачи. +Результаты анализа вставьте в виде комментариев к коду. Также укажите в комментариях версию Python и разрядность вашей ОС. +''' + +import sys + +res = {} +for i in range(2, 10): + res[i] = [] + for j in range(2, 100): + if j % i == 0: + res[i].append(j) + print(f'Числу {i} кратны {len(res[i])} чисел: {res[i]}') + + +sum_size = 0 +sum_size1 = 0 +sum_size2 = 0 +sum_size += sys.getsizeof(i) +sum_size1 += sys.getsizeof(print) +sum_size2 += sys.getsizeof(res) + +print('\nПеременные занимают:', sum_size, sum_size1, sum_size2) + +''' +Переменные занимают: 28 72 360 +''' \ No newline at end of file From 94f21b6e7e8a05577c797bef5989eaccc3561405 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Mon, 2 Aug 2021 03:58:08 +0500 Subject: [PATCH 13/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ALGORITMS/Lesson_6/1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ALGORITMS/Lesson_6/1.py b/ALGORITMS/Lesson_6/1.py index 4bd0117..5ee66a8 100644 --- a/ALGORITMS/Lesson_6/1.py +++ b/ALGORITMS/Lesson_6/1.py @@ -27,4 +27,4 @@ ''' Переменные занимают: 28 72 360 -''' \ No newline at end of file +''' From 1cf0ed034f6c6308eb2a4679bb8057cec66bc69f Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Mon, 2 Aug 2021 04:06:52 +0500 Subject: [PATCH 14/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._before_Update_at_02_08_2021_4_04__Default_Changelist_.xml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ALGORITMS/.idea/shelf/Uncommitted_changes_before_Update_at_02_08_2021_4_04__Default_Changelist_.xml diff --git a/ALGORITMS/.idea/shelf/Uncommitted_changes_before_Update_at_02_08_2021_4_04__Default_Changelist_.xml b/ALGORITMS/.idea/shelf/Uncommitted_changes_before_Update_at_02_08_2021_4_04__Default_Changelist_.xml new file mode 100644 index 0000000..5089337 --- /dev/null +++ b/ALGORITMS/.idea/shelf/Uncommitted_changes_before_Update_at_02_08_2021_4_04__Default_Changelist_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file From 7a2737da40b8ca3f7f416b5e8684fc7fdcba27a9 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Tue, 3 Aug 2021 01:54:05 +0500 Subject: [PATCH 15/62] Delete PARSING directory --- PARSING/Lesson_1/2.py | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 PARSING/Lesson_1/2.py diff --git a/PARSING/Lesson_1/2.py b/PARSING/Lesson_1/2.py deleted file mode 100644 index 760df2b..0000000 --- a/PARSING/Lesson_1/2.py +++ /dev/null @@ -1,26 +0,0 @@ -import requests -import json -import csv - - -url = 'https://cloud-api.yandex.net/v1/' -token = 'MDEwOlJlcG9zaXRvcnkzMzk4MzM0OTA=' - -headers = { - 'Content-Type': 'application/json', - 'Authorization': token -} - -disk_info = 'disk' -folder_info = 'disk/resources' - -res = requests.get(f'{url}{disk_info}') - -print(res.json()) - -with open('data2.json', 'w') as f: - writer = csv.writer(f) - writer.writerow((res.json(),)) - - - From ced96005dcf138fce6a9b552648e96ca5dae41df Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Tue, 10 Aug 2021 03:06:26 +0500 Subject: [PATCH 16/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_1/1.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 PARSING/Lesson_1/1.py diff --git a/PARSING/Lesson_1/1.py b/PARSING/Lesson_1/1.py new file mode 100644 index 0000000..4188b66 --- /dev/null +++ b/PARSING/Lesson_1/1.py @@ -0,0 +1,15 @@ +import requests +import json + + +url = 'https://api.github.com' +user = 'softicer-67' + + +request = requests.get(f'{url}/users/{user}/repos') + +js = request.json() +for i in range(0, len(js)): + res = f'Project Number: {i + 1}\nProject Name: {js[i]["name"]}\nProject URL: {js[i]["svn_url"]}' + print(res) + From 890911ff11888021ecf557547250d78cda2797ed Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Tue, 10 Aug 2021 03:09:34 +0500 Subject: [PATCH 17/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_3/1.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 PARSING/Lesson_3/1.py diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py new file mode 100644 index 0000000..ede4ffa --- /dev/null +++ b/PARSING/Lesson_3/1.py @@ -0,0 +1,5 @@ +''' +1. Развернуть у себя на компьютере/виртуальной машине/хостинге MongoDB и реализовать функцию, +записывающую собранные вакансии в созданную БД. +''' + From 222f37d89b3e17b170defd8e7c0fb2535e804ae1 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Tue, 10 Aug 2021 03:14:40 +0500 Subject: [PATCH 18/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_3/2.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 PARSING/Lesson_3/2.py diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py new file mode 100644 index 0000000..0be32fd --- /dev/null +++ b/PARSING/Lesson_3/2.py @@ -0,0 +1,5 @@ +''' +2. Написать функцию, которая производит поиск и выводит на экран вакансии +с заработной платой больше введённой суммы. +''' + From 5f10a29cd5971fdd65178474dd743849d90851d8 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Tue, 10 Aug 2021 03:57:33 +0500 Subject: [PATCH 19/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_3/3.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 PARSING/Lesson_3/3.py diff --git a/PARSING/Lesson_3/3.py b/PARSING/Lesson_3/3.py new file mode 100644 index 0000000..3d347cf --- /dev/null +++ b/PARSING/Lesson_3/3.py @@ -0,0 +1,4 @@ +''' +3. Написать функцию, которая будет добавлять в вашу базу данных только новые вакансии с сайта. +''' + From 842c6fb109b19effba6a8a8e72964ce91cfe7d36 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 14:35:22 +0500 Subject: [PATCH 20/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 PARSING/Lesson_4/1.py diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py new file mode 100644 index 0000000..d13a119 --- /dev/null +++ b/PARSING/Lesson_4/1.py @@ -0,0 +1,31 @@ +''' +Написать приложение, которое собирает основные новости с сайтов mail.ru, lenta.ru, yandex-новости. +Для парсинга использовать XPath. Структура данных должна содержать: +название источника; +наименование новости; +ссылку на новость; +дата публикации. +''' + +from lxml import html +import requests + + +header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} + + +def request_to_mail(_str): + try: + response = requests.get('https://news.mail.ru/', params={'text': _str}, headers=header) + root = html.fromstring(response.text) + for i in range(1, 5): + result = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/span') + link = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/@href') + ist = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[2]/text()') + tim = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[1]') + print([ist[0]], result[0].text, ' ', link[0], tim[0].text) + except: + print('Ошибка запроса') + + +request_to_mail('') From bfb3396d2561f2f3e7997acb87c2a0f13828443b Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 14:42:11 +0500 Subject: [PATCH 21/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index d13a119..eca8d52 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -19,11 +19,11 @@ def request_to_mail(_str): response = requests.get('https://news.mail.ru/', params={'text': _str}, headers=header) root = html.fromstring(response.text) for i in range(1, 5): - result = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/span') + news = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/span') link = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/@href') ist = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[2]/text()') tim = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[1]') - print([ist[0]], result[0].text, ' ', link[0], tim[0].text) + print([ist[0]], news[0].text, ' ', link[0], tim[0].text) except: print('Ошибка запроса') From a6809cd18710b8dff82898041c6cdc7febd88493 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 14:50:32 +0500 Subject: [PATCH 22/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index eca8d52..aab1924 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -14,9 +14,9 @@ header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} -def request_to_mail(_str): +def request_to_mail(): try: - response = requests.get('https://news.mail.ru/', params={'text': _str}, headers=header) + response = requests.get('https://news.mail.ru/', headers=header) root = html.fromstring(response.text) for i in range(1, 5): news = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/span') @@ -28,4 +28,4 @@ def request_to_mail(_str): print('Ошибка запроса') -request_to_mail('') +request_to_mail() From 28df0bff1e0fafee5fa8aca2cb3ac3288b92fbc7 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 17:01:30 +0500 Subject: [PATCH 23/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index aab1924..ec661e4 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -6,6 +6,7 @@ ссылку на новость; дата публикации. ''' +import time from lxml import html import requests @@ -23,9 +24,43 @@ def request_to_mail(): link = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/@href') ist = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[2]/text()') tim = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[1]') - print([ist[0]], news[0].text, ' ', link[0], tim[0].text) + print([ist[0]], news[0].text, link[0], tim[0].text) except: print('Ошибка запроса') +def request_to_lenta(): + url = 'https://lenta.ru/' + response = requests.get('https://lenta.ru/', headers=header) + root = html.fromstring(response.text) + for i in range(5, 10): + try: + link = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/@href') + news = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/text()') + print(news[0], url + link[0]) + except: + print('Ошибка запроса') + + +def request_to_yandex(): + try: + response = requests.get('https://yandex.ru/news/', headers=header) + root = html.fromstring(response.text) + for i in range(2, 6): + ist = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[3]/div[1]/div/span[1]/a') + link = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[3]/div[1]/div/span[1]/a/@href') + news = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[1]/div/a/h2') + tim = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[3]/div[1]/div/span[2]') + print([ist[0].text], news[0].text, link[0], tim[0].text) + except: + print('Ошибка запроса') + + +print('\tnews.mail.ru'.upper()) request_to_mail() +print('=' * 145) +print('\tlenta.ru'.upper()) +request_to_lenta() +print('=' * 145) +print('\tyandex.ru/news'.upper()) +request_to_yandex() From 343296312387111e96368c4ae02a8ea2ab924fac Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 17:10:17 +0500 Subject: [PATCH 24/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index ec661e4..047b29f 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -6,7 +6,6 @@ ссылку на новость; дата публикации. ''' -import time from lxml import html import requests @@ -30,16 +29,16 @@ def request_to_mail(): def request_to_lenta(): - url = 'https://lenta.ru/' - response = requests.get('https://lenta.ru/', headers=header) - root = html.fromstring(response.text) - for i in range(5, 10): - try: + try: + url = 'https://lenta.ru/' + response = requests.get('https://lenta.ru/', headers=header) + root = html.fromstring(response.text) + for i in range(5, 10): link = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/@href') news = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/text()') print(news[0], url + link[0]) - except: - print('Ошибка запроса') + except: + print('Ошибка запроса') def request_to_yandex(): From 18d7052b1e1bd53b826f462fa2e7ed9108e8df5f Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 21:29:00 +0500 Subject: [PATCH 25/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index 047b29f..fe9e882 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -9,9 +9,11 @@ from lxml import html import requests - +import datetime header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} +now = datetime.datetime.now() +now = f"{'%d' % now.year}.{'%d' % now.month}.{'%d' % now.day}." def request_to_mail(): @@ -23,7 +25,7 @@ def request_to_mail(): link = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/span[2]/a/@href') ist = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[2]/text()') tim = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[1]') - print([ist[0]], news[0].text, link[0], tim[0].text) + print([ist[0]], news[0].text, link[0], now, tim[0].text) except: print('Ошибка запроса') @@ -50,7 +52,7 @@ def request_to_yandex(): link = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[3]/div[1]/div/span[1]/a/@href') news = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[1]/div/a/h2') tim = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[3]/div[1]/div/span[2]') - print([ist[0].text], news[0].text, link[0], tim[0].text) + print([ist[0].text], news[0].text, link[0], now, tim[0].text) except: print('Ошибка запроса') @@ -63,3 +65,4 @@ def request_to_yandex(): print('=' * 145) print('\tyandex.ru/news'.upper()) request_to_yandex() + From d3aa633b086a1205372f520357c1f20d27f78d25 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 21:35:24 +0500 Subject: [PATCH 26/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index fe9e882..a61b6e0 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -38,7 +38,7 @@ def request_to_lenta(): for i in range(5, 10): link = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/@href') news = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/text()') - print(news[0], url + link[0]) + print(news[0], url + link[0], now) except: print('Ошибка запроса') From 977dea5d98a26c61775876a10836105b7bf10b8c Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Wed, 11 Aug 2021 22:00:50 +0500 Subject: [PATCH 27/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_4/1.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PARSING/Lesson_4/1.py b/PARSING/Lesson_4/1.py index a61b6e0..af5228a 100644 --- a/PARSING/Lesson_4/1.py +++ b/PARSING/Lesson_4/1.py @@ -14,6 +14,7 @@ header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} now = datetime.datetime.now() now = f"{'%d' % now.year}.{'%d' % now.month}.{'%d' % now.day}." +err = 'Ошибка запроса' def request_to_mail(): @@ -27,7 +28,7 @@ def request_to_mail(): tim = root.xpath(f'//*[@id="index_page"]/div[7]/div[2]/div[3]/div/div/div/div[{i}]/div/div[2]/div/span[1]') print([ist[0]], news[0].text, link[0], now, tim[0].text) except: - print('Ошибка запроса') + print(err) def request_to_lenta(): @@ -40,7 +41,7 @@ def request_to_lenta(): news = root.xpath(f'//*[@id="root"]/section[2]/div/div/div[2]/div[1]/section/div/div[{i}]/a/text()') print(news[0], url + link[0], now) except: - print('Ошибка запроса') + print(err) def request_to_yandex(): @@ -54,7 +55,7 @@ def request_to_yandex(): tim = root.xpath(f'/html/body/div[3]/div/div[2]/div/div[1]/div[1]/div[{i}]/article/div[3]/div[1]/div/span[2]') print([ist[0].text], news[0].text, link[0], now, tim[0].text) except: - print('Ошибка запроса') + print(err) print('\tnews.mail.ru'.upper()) @@ -65,4 +66,3 @@ def request_to_yandex(): print('=' * 145) print('\tyandex.ru/news'.upper()) request_to_yandex() - From b365d97d5494a3b1d91c5971e60097266279f2d0 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Thu, 12 Aug 2021 21:00:10 +0500 Subject: [PATCH 28/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_3/2.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py index 0be32fd..60bf46e 100644 --- a/PARSING/Lesson_3/2.py +++ b/PARSING/Lesson_3/2.py @@ -3,3 +3,34 @@ с заработной платой больше введённой суммы. ''' +import requests +from pprint import pprint +from lxml import html +from bs4 import BeautifulSoup as bs +import requests as req + +http = 'https://www.superjob.ru' +s = input('Желаемая зарплата от: ') +url = f'{http}/vacancy/search/?payment_value={s}' + + +respond = req.get(url) +soup = bs(respond.text, 'lxml') +vac = [i.text.strip() for i in soup.find_all(class_="_1h3Zg _2rfUm _2hCDz _21a7u")] +price = [str(i.text).replace('\xa0', ' ') for i in soup.find_all(class_="_1h3Zg _2Wp8I _2rfUm _2hCDz _2ZsgW")] + +vacans = [] +link = [] + +for i in vac: + vacans.append(i) + +result = [] +for i in range(20): + result.append({ + 'Вакансия': vacans[i], + 'Зарплата': price[i] + }) + +for i in result: + print(i) From 907b497c1aab7d21f5d0ccb19d00979b18124dfb Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Fri, 13 Aug 2021 01:30:02 +0500 Subject: [PATCH 29/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_3/2.py | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py index 60bf46e..c44e970 100644 --- a/PARSING/Lesson_3/2.py +++ b/PARSING/Lesson_3/2.py @@ -4,33 +4,29 @@ ''' import requests -from pprint import pprint -from lxml import html from bs4 import BeautifulSoup as bs -import requests as req -http = 'https://www.superjob.ru' -s = input('Желаемая зарплата от: ') -url = f'{http}/vacancy/search/?payment_value={s}' +header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} -respond = req.get(url) -soup = bs(respond.text, 'lxml') -vac = [i.text.strip() for i in soup.find_all(class_="_1h3Zg _2rfUm _2hCDz _21a7u")] -price = [str(i.text).replace('\xa0', ' ') for i in soup.find_all(class_="_1h3Zg _2Wp8I _2rfUm _2hCDz _2ZsgW")] +def get_data(zp): + resp = requests.get(f'https://www.rabota.ru/?sort=relevance&min_salary={zp}', headers=header) + soup = bs(resp.text, 'lxml') + work = [] + price = [] + result = [] + for i in range(20): + w = soup.find_all(class_="vacancy-preview-card__title") + work.append(w[i].text.strip()) + p = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") + price.append(p[i].text.strip().replace('\xa0', ' ')) -vacans = [] -link = [] + result.append({ + 'Вакансия': work[i], + 'Зарплата': price[i] + }) -for i in vac: - vacans.append(i) + print(result[i]) -result = [] -for i in range(20): - result.append({ - 'Вакансия': vacans[i], - 'Зарплата': price[i] - }) -for i in result: - print(i) +get_data(80000) From 6be1bffa7d98cfa5c09591d9c556c99291fa52bd Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Fri, 13 Aug 2021 11:17:18 +0500 Subject: [PATCH 30/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARSING/Lesson_3/1.py | 237 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py index ede4ffa..0d63f36 100644 --- a/PARSING/Lesson_3/1.py +++ b/PARSING/Lesson_3/1.py @@ -3,3 +3,240 @@ записывающую собранные вакансии в созданную БД. ''' + +from bs4 import BeautifulSoup as bs +from pprint import pprint +from pymongo import MongoClient +import json +import re +import requests + + +class ScrapingJob: + + def __init__(self, mongodb_uri, db_name, collection_name): + self.headers = { + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0' + } + self.link_hh = 'https://hh.ru/search/vacancy' + self.link_seperjob = 'https://www.superjob.ru/vacancy/search/' + self.mongodb = MongoClient(mongodb_uri) + self.db = self.mongodb[db_name] + self.collection = self.db[collection_name] + + def print_salary(self, salary): + objects = self.collection.find({'salary_max': {'$gt': salary}}) + for obj in objects: + pprint(obj) + + def search_job(self, vacancy): + self._parser_hh(vacancy) + self._parser_superjob(vacancy) + + def _parser_hh(self, vacancy): + params = { + 'text': vacancy, + 'search_field': 'name', + 'items_on_page': '100', + 'page': '' + } + + html = self._get_html(self.link_hh, params) + last_page = self._get_last_page_hh(html) + for page in range(0, last_page): + params['page'] = page + html = self._get_html(self.link_hh, params) + if html.ok: + parsed_html = self._get_parsed_html(html) + vacancy_items = parsed_html.find('div', {'data-qa': 'vacancy-serp__results'}).find_all('div', {'class': 'vacancy-serp-item'}) + for item in vacancy_items: + vacancy = self._parser_item_hh(item) + if self._is_exists('vacancy_link', vacancy['vacancy_link']): + self.collection.update_one({'vacancy_link': vacancy['vacancy_link']}, {'$set': vacancy}) + else: + self.collection.insert_one(vacancy) + + def _parser_superjob(self, vacancy): + params = { + 'keywords': vacancy, + 'profession_only': '1', + 'geo[c][0]': '15', + 'geo[c][1]': '1', + 'geo[c][2]': '9', + 'page': '' + } + + html = self._get_html(self.link_seperjob, params) + last_page = self._get_last_page_superjob(html) + for page in range(0, last_page + 1): + params['page'] = page + html = self._get_html(self.link_seperjob, params) + + if html.ok: + parsed_html = self._get_parsed_html(html) + vacancy_items = parsed_html.find_all('div', {'class': 'f-test-vacancy-item'}) + + for item in vacancy_items: + vacancy = self._parser_item_superjob(item) + if self._is_exists('vacancy_link', vacancy['vacancy_link']): + self.collection.update_one({'vacancy_link': vacancy['vacancy_link']}, {'$set': vacancy}) + else: + self.collection.insert_one(vacancy) + + def _parser_item_hh(self, item): + vacancy_data = {} + # vacancy_name + vacancy_name = item.find('div', {'class': 'resume-search-item__name'}).getText().replace(u'\xa0', u' ') + vacancy_data['vacancy_name'] = vacancy_name + + # company_name + company_name = item.find('div', {'class': 'vacancy-serp-item__meta-info'}).getText().replace(u'\xa0', u' ') + vacancy_data['company_name'] = company_name + + # city + city = item.find('span', {'class': 'vacancy-serp-item__meta-info'}).getText().split(', ')[0] + + vacancy_data['city'] = city + + # metro station + metro_station = item.find('span', {'class': 'vacancy-serp-item__meta-info'}).findChild() + + if not metro_station: + metro_station = None + else: + metro_station = metro_station.getText() + vacancy_data['metro_station'] = metro_station + + # salary + salary = item.find('div', {'class': 'vacancy-serp-item__compensation'}) + salary_min = None + salary_max = None + salary_currency = None + + if salary: + salary = salary.getText().replace(u'\xa0', u'') + salary = re.split(r'\s|-', salary) + if salary[0] == 'до': + salary_max = int(salary[1]) + elif salary[0] == 'от': + salary_min = int(salary[1]) + else: + salary_min = int(salary[0]) + salary_max = int(salary[1]) + salary_currency = salary[-1] + salary_currency = self._get_name_currency(salary_currency) + vacancy_data['salary_min'] = salary_min + vacancy_data['salary_max'] = salary_max + vacancy_data['salary_currency'] = salary_currency + # vacancyId + vacancy_json = json.loads(item.find('script', {'data-name': 'HH/VacancyResponsePopup/VacancyResponsePopup'})['data-params']) + vacancy_id = vacancy_json['vacancyId'] + # link + vacancy_data['vacancy_link'] = f'https://hh.ru/vacancy/{vacancy_id}' + # site + vacancy_data['site'] = 'hh.ru' + return vacancy_data + + def _parser_item_superjob(self, item): + vacancy_data = {} + # vacancy_name + vacancy_name = item.find_all('a') + if len(vacancy_name) > 1: + vacancy_name = vacancy_name[-2].getText() + else: + vacancy_name = vacancy_name[0].getText() + vacancy_data['vacancy_name'] = vacancy_name + # company_name + company_name = item.find('span', {'class': 'f-test-text-vacancy-item-company-name'}) + if not company_name: + company_name = item.findParent().find('span', {'class': 'f-test-text-vacancy-item-company-name'}).getText() + else: + company_name = company_name.getText() + vacancy_data['company_name'] = company_name + # city + company_location = item.find('span', {'class': 'f-test-text-company-item-location'}).findChildren()[1].getText().split(',') + vacancy_data['city'] = company_location[0] + # metro station + if len(company_location) > 1: + metro_station = company_location[1] + else: + metro_station = None + vacancy_data['metro_station'] = metro_station + # salary + salary = item.find('span', {'class': 'f-test-text-company-item-salary'}).findChildren() + salary_min = None + salary_max = None + salary_currency = None + if salary: + salary_currency = salary[-1].getText() + salary_currency = self._get_name_currency(salary_currency) + is_check_sarary = item.find('span', {'class': 'f-test-text-company-item-salary'}).getText().replace(u'\xa0', u' ').split(' ', 1)[0] + if is_check_sarary == 'до' or len(salary) == 2: + salary_max = int(salary[0].getText().replace(u'\xa0', u'')) + elif is_check_sarary == 'от': + salary_min = int(salary[0].getText().replace(u'\xa0', u'')) + else: + salary_min = int(salary[0].getText().replace(u'\xa0', u'')) + salary_max = int(salary[2].getText().replace(u'\xa0', u'')) + vacancy_data['salary_min'] = salary_min + vacancy_data['salary_max'] = salary_max + vacancy_data['salary_currency'] = salary_currency + # link + vacancy_link = item.find_all('a') + if len(vacancy_link) > 1: + vacancy_link = vacancy_link[-2]['href'] + else: + vacancy_link = vacancy_link[0]['href'] + vacancy_data['vacancy_link'] = f'https://www.superjob.ru{vacancy_link }' + # site + vacancy_data['site'] = 'www.superjob.ru' + return vacancy_data + + def _get_last_page_hh(self, html): + parsed_html = self._get_parsed_html(html) + if parsed_html: + page_block = parsed_html.find('div', {'data-qa': 'pager-block'}) + if not page_block: + last_page = 1 + else: + last_page = int( + page_block.find_all('a', {'class': 'HH-Pager-Control'})[-2].getText()) + return last_page + + def _get_last_page_superjob(self, html): + parsed_html = self._get_parsed_html(html) + if parsed_html: + page_block = parsed_html.find('a', {'class': 'f-test-button-1'}) + if not page_block: + last_page = 1 + else: + page_block = page_block.findParent() + last_page = int(page_block.find_all('a')[-2].getText()) + return last_page + + def _get_parsed_html(self, html): + if html.ok: + parsed_html = bs(html.text, 'html.parser') + return parsed_html + + def _get_html(self, link, params=None): + html = requests.get(link, params=params, headers=self.headers) + return html + + def _is_exists(self, name_tags, field): + return bool(self.collection.find_one({name_tags: {"$in": [field]}})) + + def _get_name_currency(self, currency_name): + currency_dict = { + 'EUR': {' €'}, + 'KZT': {' ₸'}, + 'RUB': {' ₽', 'руб.'}, + 'UAH': {' ₴', 'грн.'}, + 'USD': {' $'} + } + + name = currency_name + for item_name, items_list in currency_dict.items(): + if currency_name in items_list: + name = item_name + return name From d3181233c12df257786bc0947642cbab593e22d1 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 14 Aug 2021 13:19:32 +0500 Subject: [PATCH 31/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JS/Lesson_1/1.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 JS/Lesson_1/1.html diff --git a/JS/Lesson_1/1.html b/JS/Lesson_1/1.html new file mode 100644 index 0000000..0d03025 --- /dev/null +++ b/JS/Lesson_1/1.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file From e678ab19da5968430cea3a91b7b618ca77da6d89 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 13:22:05 +0500 Subject: [PATCH 32/62] Add files via upload --- JS/Lesson_1/example.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 JS/Lesson_1/example.js diff --git a/JS/Lesson_1/example.js b/JS/Lesson_1/example.js new file mode 100644 index 0000000..d2b324f --- /dev/null +++ b/JS/Lesson_1/example.js @@ -0,0 +1,4 @@ +let с = prompt('Задайте температуру в градусах по Цельсию: ') +let f = (9 / 5) * с + 32 +alert('Температура в фаренгейтах =' + f) + From 67b6a9ec4ea095eeb7b7a5013a8d1380e49850cd Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:21:17 +0500 Subject: [PATCH 33/62] Delete 1.html --- JS/Lesson_1/1.html | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 JS/Lesson_1/1.html diff --git a/JS/Lesson_1/1.html b/JS/Lesson_1/1.html deleted file mode 100644 index 0d03025..0000000 --- a/JS/Lesson_1/1.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Title - - - - - \ No newline at end of file From b0c600c00072bc2f7c5a9d852f13b6cf015a5f37 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:21:37 +0500 Subject: [PATCH 34/62] Rename example.js to example_1.js --- JS/Lesson_1/{example.js => example_1.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename JS/Lesson_1/{example.js => example_1.js} (100%) diff --git a/JS/Lesson_1/example.js b/JS/Lesson_1/example_1.js similarity index 100% rename from JS/Lesson_1/example.js rename to JS/Lesson_1/example_1.js From afea00517d95af1202cc3719bce9b2293c5e3d49 Mon Sep 17 00:00:00 2001 From: Yuri_1967 <9022368@mail.ru> Date: Sat, 14 Aug 2021 15:25:24 +0500 Subject: [PATCH 35/62] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JS/Lesson_1/2.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 JS/Lesson_1/2.html diff --git a/JS/Lesson_1/2.html b/JS/Lesson_1/2.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/JS/Lesson_1/2.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file From ef76a807df92dd485b5a96ea01bce7cb4f2a7071 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:26:04 +0500 Subject: [PATCH 36/62] Add files via upload --- JS/Lesson_1/example_2.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 JS/Lesson_1/example_2.js diff --git a/JS/Lesson_1/example_2.js b/JS/Lesson_1/example_2.js new file mode 100644 index 0000000..924d38c --- /dev/null +++ b/JS/Lesson_1/example_2.js @@ -0,0 +1,3 @@ +let name = 'Василий' +let admin = name +console.log(admin) From 5e5b943f95ecf099b4b334b79832db4f98f6ff70 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:26:33 +0500 Subject: [PATCH 37/62] Delete 2.html --- JS/Lesson_1/2.html | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 JS/Lesson_1/2.html diff --git a/JS/Lesson_1/2.html b/JS/Lesson_1/2.html deleted file mode 100644 index 566549b..0000000 --- a/JS/Lesson_1/2.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Title - - - - - \ No newline at end of file From c377ba536ad1ada305391b4d24e0c204c5ea7bca Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:38:06 +0500 Subject: [PATCH 38/62] Add files via upload --- JS/Lesson_1/3_4_.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 JS/Lesson_1/3_4_.txt diff --git a/JS/Lesson_1/3_4_.txt b/JS/Lesson_1/3_4_.txt new file mode 100644 index 0000000..9292e9c --- /dev/null +++ b/JS/Lesson_1/3_4_.txt @@ -0,0 +1,10 @@ +3. Чему будет равно JS-выражение 1000 + "108" + Так как 1000 - число, + а '108' - строка, то выражение будет равно '1000108' + +4. Самостоятельно разобраться с атрибутами тега script (async и defer) + async подключает скрипты асинхронно, + defer тоже подключает их асинхронно, + но в более строгой последовательности. + Они как бы не блокируют html страничку во время загрузки, а параллельно грузятся + From 36806adcda9f1563a1c005d61c4c261b596e8c57 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 15:52:07 +0500 Subject: [PATCH 39/62] Update example_1.js --- JS/Lesson_1/example_1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JS/Lesson_1/example_1.js b/JS/Lesson_1/example_1.js index d2b324f..1700427 100644 --- a/JS/Lesson_1/example_1.js +++ b/JS/Lesson_1/example_1.js @@ -1,4 +1,4 @@ let с = prompt('Задайте температуру в градусах по Цельсию: ') let f = (9 / 5) * с + 32 -alert('Температура в фаренгейтах =' + f) +alert(`Температура в фаренгейтах: ${f}`) From 0fb4a77552004afb88dcfe54cd7eccdfade622b6 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 16:47:21 +0500 Subject: [PATCH 40/62] Add files via upload --- PARSING/Lesson_3/base.png | Bin 0 -> 138511 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 PARSING/Lesson_3/base.png diff --git a/PARSING/Lesson_3/base.png b/PARSING/Lesson_3/base.png new file mode 100644 index 0000000000000000000000000000000000000000..11734bfd3933a763bb19871045f0370790d0c1b8 GIT binary patch literal 138511 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 literal 0 HcmV?d00001 From 57f8e66bb645b944219f8f78e67aa300645ea784 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 16:49:47 +0500 Subject: [PATCH 41/62] Update 1.py --- PARSING/Lesson_3/1.py | 251 ++++-------------------------------------- 1 file changed, 21 insertions(+), 230 deletions(-) diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py index 0d63f36..c4bb6bd 100644 --- a/PARSING/Lesson_3/1.py +++ b/PARSING/Lesson_3/1.py @@ -3,240 +3,31 @@ записывающую собранные вакансии в созданную БД. ''' - -from bs4 import BeautifulSoup as bs -from pprint import pprint -from pymongo import MongoClient -import json -import re import requests +from bs4 import BeautifulSoup as bs +import pandas as pd +header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} -class ScrapingJob: - - def __init__(self, mongodb_uri, db_name, collection_name): - self.headers = { - 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0' - } - self.link_hh = 'https://hh.ru/search/vacancy' - self.link_seperjob = 'https://www.superjob.ru/vacancy/search/' - self.mongodb = MongoClient(mongodb_uri) - self.db = self.mongodb[db_name] - self.collection = self.db[collection_name] - - def print_salary(self, salary): - objects = self.collection.find({'salary_max': {'$gt': salary}}) - for obj in objects: - pprint(obj) - - def search_job(self, vacancy): - self._parser_hh(vacancy) - self._parser_superjob(vacancy) - - def _parser_hh(self, vacancy): - params = { - 'text': vacancy, - 'search_field': 'name', - 'items_on_page': '100', - 'page': '' - } - - html = self._get_html(self.link_hh, params) - last_page = self._get_last_page_hh(html) - for page in range(0, last_page): - params['page'] = page - html = self._get_html(self.link_hh, params) - if html.ok: - parsed_html = self._get_parsed_html(html) - vacancy_items = parsed_html.find('div', {'data-qa': 'vacancy-serp__results'}).find_all('div', {'class': 'vacancy-serp-item'}) - for item in vacancy_items: - vacancy = self._parser_item_hh(item) - if self._is_exists('vacancy_link', vacancy['vacancy_link']): - self.collection.update_one({'vacancy_link': vacancy['vacancy_link']}, {'$set': vacancy}) - else: - self.collection.insert_one(vacancy) - - def _parser_superjob(self, vacancy): - params = { - 'keywords': vacancy, - 'profession_only': '1', - 'geo[c][0]': '15', - 'geo[c][1]': '1', - 'geo[c][2]': '9', - 'page': '' - } - - html = self._get_html(self.link_seperjob, params) - last_page = self._get_last_page_superjob(html) - for page in range(0, last_page + 1): - params['page'] = page - html = self._get_html(self.link_seperjob, params) - - if html.ok: - parsed_html = self._get_parsed_html(html) - vacancy_items = parsed_html.find_all('div', {'class': 'f-test-vacancy-item'}) - - for item in vacancy_items: - vacancy = self._parser_item_superjob(item) - if self._is_exists('vacancy_link', vacancy['vacancy_link']): - self.collection.update_one({'vacancy_link': vacancy['vacancy_link']}, {'$set': vacancy}) - else: - self.collection.insert_one(vacancy) - - def _parser_item_hh(self, item): - vacancy_data = {} - # vacancy_name - vacancy_name = item.find('div', {'class': 'resume-search-item__name'}).getText().replace(u'\xa0', u' ') - vacancy_data['vacancy_name'] = vacancy_name - - # company_name - company_name = item.find('div', {'class': 'vacancy-serp-item__meta-info'}).getText().replace(u'\xa0', u' ') - vacancy_data['company_name'] = company_name - - # city - city = item.find('span', {'class': 'vacancy-serp-item__meta-info'}).getText().split(', ')[0] - - vacancy_data['city'] = city - - # metro station - metro_station = item.find('span', {'class': 'vacancy-serp-item__meta-info'}).findChild() - - if not metro_station: - metro_station = None - else: - metro_station = metro_station.getText() - vacancy_data['metro_station'] = metro_station - - # salary - salary = item.find('div', {'class': 'vacancy-serp-item__compensation'}) - salary_min = None - salary_max = None - salary_currency = None - - if salary: - salary = salary.getText().replace(u'\xa0', u'') - salary = re.split(r'\s|-', salary) - if salary[0] == 'до': - salary_max = int(salary[1]) - elif salary[0] == 'от': - salary_min = int(salary[1]) - else: - salary_min = int(salary[0]) - salary_max = int(salary[1]) - salary_currency = salary[-1] - salary_currency = self._get_name_currency(salary_currency) - vacancy_data['salary_min'] = salary_min - vacancy_data['salary_max'] = salary_max - vacancy_data['salary_currency'] = salary_currency - # vacancyId - vacancy_json = json.loads(item.find('script', {'data-name': 'HH/VacancyResponsePopup/VacancyResponsePopup'})['data-params']) - vacancy_id = vacancy_json['vacancyId'] - # link - vacancy_data['vacancy_link'] = f'https://hh.ru/vacancy/{vacancy_id}' - # site - vacancy_data['site'] = 'hh.ru' - return vacancy_data - - def _parser_item_superjob(self, item): - vacancy_data = {} - # vacancy_name - vacancy_name = item.find_all('a') - if len(vacancy_name) > 1: - vacancy_name = vacancy_name[-2].getText() - else: - vacancy_name = vacancy_name[0].getText() - vacancy_data['vacancy_name'] = vacancy_name - # company_name - company_name = item.find('span', {'class': 'f-test-text-vacancy-item-company-name'}) - if not company_name: - company_name = item.findParent().find('span', {'class': 'f-test-text-vacancy-item-company-name'}).getText() - else: - company_name = company_name.getText() - vacancy_data['company_name'] = company_name - # city - company_location = item.find('span', {'class': 'f-test-text-company-item-location'}).findChildren()[1].getText().split(',') - vacancy_data['city'] = company_location[0] - # metro station - if len(company_location) > 1: - metro_station = company_location[1] - else: - metro_station = None - vacancy_data['metro_station'] = metro_station - # salary - salary = item.find('span', {'class': 'f-test-text-company-item-salary'}).findChildren() - salary_min = None - salary_max = None - salary_currency = None - if salary: - salary_currency = salary[-1].getText() - salary_currency = self._get_name_currency(salary_currency) - is_check_sarary = item.find('span', {'class': 'f-test-text-company-item-salary'}).getText().replace(u'\xa0', u' ').split(' ', 1)[0] - if is_check_sarary == 'до' or len(salary) == 2: - salary_max = int(salary[0].getText().replace(u'\xa0', u'')) - elif is_check_sarary == 'от': - salary_min = int(salary[0].getText().replace(u'\xa0', u'')) - else: - salary_min = int(salary[0].getText().replace(u'\xa0', u'')) - salary_max = int(salary[2].getText().replace(u'\xa0', u'')) - vacancy_data['salary_min'] = salary_min - vacancy_data['salary_max'] = salary_max - vacancy_data['salary_currency'] = salary_currency - # link - vacancy_link = item.find_all('a') - if len(vacancy_link) > 1: - vacancy_link = vacancy_link[-2]['href'] - else: - vacancy_link = vacancy_link[0]['href'] - vacancy_data['vacancy_link'] = f'https://www.superjob.ru{vacancy_link }' - # site - vacancy_data['site'] = 'www.superjob.ru' - return vacancy_data - - def _get_last_page_hh(self, html): - parsed_html = self._get_parsed_html(html) - if parsed_html: - page_block = parsed_html.find('div', {'data-qa': 'pager-block'}) - if not page_block: - last_page = 1 - else: - last_page = int( - page_block.find_all('a', {'class': 'HH-Pager-Control'})[-2].getText()) - return last_page - - def _get_last_page_superjob(self, html): - parsed_html = self._get_parsed_html(html) - if parsed_html: - page_block = parsed_html.find('a', {'class': 'f-test-button-1'}) - if not page_block: - last_page = 1 - else: - page_block = page_block.findParent() - last_page = int(page_block.find_all('a')[-2].getText()) - return last_page - - def _get_parsed_html(self, html): - if html.ok: - parsed_html = bs(html.text, 'html.parser') - return parsed_html - def _get_html(self, link, params=None): - html = requests.get(link, params=params, headers=self.headers) - return html +def get_data(zp): + resp = requests.get(f'https://www.rabota.ru/?sort=relevance&min_salary={zp}', headers=header) + soup = bs(resp.text, 'lxml') + work = [] + price = [] + result = [] + for i in range(20): + w = soup.find_all(class_="vacancy-preview-card__title") + work.append(w[i].text.strip()) + p = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") + price.append(p[i].text.strip().replace('\xa0', ' ')) - def _is_exists(self, name_tags, field): - return bool(self.collection.find_one({name_tags: {"$in": [field]}})) + result.append({ + 'Вакансия': work[i], + 'Зарплата': price[i] + }) + print(result[i]) + pd.DataFrame(result).to_csv('dump.csv') - def _get_name_currency(self, currency_name): - currency_dict = { - 'EUR': {' €'}, - 'KZT': {' ₸'}, - 'RUB': {' ₽', 'руб.'}, - 'UAH': {' ₴', 'грн.'}, - 'USD': {' $'} - } - name = currency_name - for item_name, items_list in currency_dict.items(): - if currency_name in items_list: - name = item_name - return name +get_data(80000) From 50e7a7397c24e9aa9d42f392a2e11ab7fc7b1e57 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 16:50:26 +0500 Subject: [PATCH 42/62] Add files via upload --- PARSING/Lesson_3/dump.csv | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 PARSING/Lesson_3/dump.csv diff --git a/PARSING/Lesson_3/dump.csv b/PARSING/Lesson_3/dump.csv new file mode 100644 index 0000000..a0d9f32 --- /dev/null +++ b/PARSING/Lesson_3/dump.csv @@ -0,0 +1,21 @@ +,Вакансия,Зарплата +0,Инженер ПТО (вахта),от 114 000 руб. +1,Сварщик НАКС (вахта),114 000 — 120 000 руб. +2,Геодезист,135 000 — 150 000 руб. +3,Арматурщик,100 000 — 120 000 руб. +4,Менеджер по работе с клиентами,50 000 — 150 000 руб. +5,Кладовщик-комплектовщик,69 000 — 117 000 руб. +6,Слесарь-сборщик,85 000 — 90 000 руб. +7,Слесарь механосборочных работ,70 000 — 80 000 руб. +8,Автоэлектрик,до 105 000 руб. +9,Врач-неонатолог,от 140 000 руб. +10,Машинист автогрейдера,80 000 — 100 000 руб. +11,Электросварщик РД НАКС,132 000 — 158 000 руб. +12,Стикеровщик на склад алкоголя,45 000 — 80 000 руб. +13,Инженер ПТО,от 95 000 руб. +14,Комплектовщик,90 000 — 120 000 руб. +15,Комплектовщик,90 000 — 100 000 руб. +16,Слесарь-сборщик двигателей,90 000 — 95 000 руб. +17,Сварщик арматурных каркасов,100 000 — 110 000 руб. +18,Филетировщик/ца на филе рыбы (вахта),118 000 — 129 000 руб. +19,Машинист автокрана,от 131 000 руб. From 60bf376711482afae9435074cfd7ca7079f16f2f Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 19:34:45 +0500 Subject: [PATCH 43/62] Update 1.py --- PARSING/Lesson_3/1.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py index c4bb6bd..cbaa6f8 100644 --- a/PARSING/Lesson_3/1.py +++ b/PARSING/Lesson_3/1.py @@ -6,6 +6,11 @@ import requests from bs4 import BeautifulSoup as bs import pandas as pd +import pymongo +import json +import codecs +import csv +from pymongo import MongoClient header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} @@ -30,4 +35,15 @@ def get_data(zp): pd.DataFrame(result).to_csv('dump.csv') -get_data(80000) +def to_mongo(): + client = MongoClient('localhost') + db = client["test01"] + col = db["work"] + with open('dump.csv', 'r', encoding='utf-8') as read_obj: + csv_reader = csv.DictReader(read_obj) + mylist = csv_reader + col.insert_many(mylist) + + +get_data(80000) # Требуемая зарплата +to_mongo() From 10a1e39d0d1d650321099168a231e6d5c67e37b6 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 19:38:01 +0500 Subject: [PATCH 44/62] Update 2.py --- PARSING/Lesson_3/2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py index c44e970..23d4197 100644 --- a/PARSING/Lesson_3/2.py +++ b/PARSING/Lesson_3/2.py @@ -29,4 +29,4 @@ def get_data(zp): print(result[i]) -get_data(80000) +get_data(80000) # Требуемая зарплата From bab37fe6a132864d9728f6b06f5f4e7321ac6a34 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 20:08:24 +0500 Subject: [PATCH 45/62] Update 1.py --- PARSING/Lesson_3/1.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py index cbaa6f8..d4beabe 100644 --- a/PARSING/Lesson_3/1.py +++ b/PARSING/Lesson_3/1.py @@ -6,9 +6,6 @@ import requests from bs4 import BeautifulSoup as bs import pandas as pd -import pymongo -import json -import codecs import csv from pymongo import MongoClient @@ -18,18 +15,13 @@ def get_data(zp): resp = requests.get(f'https://www.rabota.ru/?sort=relevance&min_salary={zp}', headers=header) soup = bs(resp.text, 'lxml') - work = [] - price = [] result = [] + w = soup.find_all(class_="vacancy-preview-card__title") + p = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") for i in range(20): - w = soup.find_all(class_="vacancy-preview-card__title") - work.append(w[i].text.strip()) - p = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") - price.append(p[i].text.strip().replace('\xa0', ' ')) - result.append({ - 'Вакансия': work[i], - 'Зарплата': price[i] + 'Вакансия': w[i].text.strip(), + 'Зарплата': p[i].text.strip().replace('\xa0', ' ') }) print(result[i]) pd.DataFrame(result).to_csv('dump.csv') From 87471edd9ebfa553be7ebbabca403d9924a1e82b Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 20:11:33 +0500 Subject: [PATCH 46/62] Update 1.py --- PARSING/Lesson_3/1.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py index d4beabe..952caf2 100644 --- a/PARSING/Lesson_3/1.py +++ b/PARSING/Lesson_3/1.py @@ -16,12 +16,12 @@ def get_data(zp): resp = requests.get(f'https://www.rabota.ru/?sort=relevance&min_salary={zp}', headers=header) soup = bs(resp.text, 'lxml') result = [] - w = soup.find_all(class_="vacancy-preview-card__title") - p = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") + work = soup.find_all(class_="vacancy-preview-card__title") + price = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") for i in range(20): result.append({ - 'Вакансия': w[i].text.strip(), - 'Зарплата': p[i].text.strip().replace('\xa0', ' ') + 'Вакансия': work[i].text.strip(), + 'Зарплата': price[i].text.strip().replace('\xa0', ' ') }) print(result[i]) pd.DataFrame(result).to_csv('dump.csv') From 9167822c10c0c24b4f93a8f050a3aa4732984d26 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 20:17:26 +0500 Subject: [PATCH 47/62] Update 1.py --- PARSING/Lesson_3/1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PARSING/Lesson_3/1.py b/PARSING/Lesson_3/1.py index 952caf2..2817cf3 100644 --- a/PARSING/Lesson_3/1.py +++ b/PARSING/Lesson_3/1.py @@ -24,7 +24,7 @@ def get_data(zp): 'Зарплата': price[i].text.strip().replace('\xa0', ' ') }) print(result[i]) - pd.DataFrame(result).to_csv('dump.csv') + pd.DataFrame(result).to_csv('dump.csv') def to_mongo(): From 30bd9284da0d3ac4932e414b9f58448eff8a36bf Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 20:21:11 +0500 Subject: [PATCH 48/62] Update 2.py --- PARSING/Lesson_3/2.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py index 23d4197..67692c5 100644 --- a/PARSING/Lesson_3/2.py +++ b/PARSING/Lesson_3/2.py @@ -6,26 +6,21 @@ import requests from bs4 import BeautifulSoup as bs + header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} def get_data(zp): resp = requests.get(f'https://www.rabota.ru/?sort=relevance&min_salary={zp}', headers=header) soup = bs(resp.text, 'lxml') - work = [] - price = [] result = [] + work = soup.find_all(class_="vacancy-preview-card__title") + price = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") for i in range(20): - w = soup.find_all(class_="vacancy-preview-card__title") - work.append(w[i].text.strip()) - p = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") - price.append(p[i].text.strip().replace('\xa0', ' ')) - result.append({ - 'Вакансия': work[i], - 'Зарплата': price[i] + 'Вакансия': work[i].text.strip(), + 'Зарплата': price[i].text.strip().replace('\xa0', ' ') }) - print(result[i]) From c4d72f592c11ef865709b51aa01432549244e3b8 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 23:11:07 +0500 Subject: [PATCH 49/62] Update 2.py --- PARSING/Lesson_3/2.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py index 67692c5..36753ca 100644 --- a/PARSING/Lesson_3/2.py +++ b/PARSING/Lesson_3/2.py @@ -5,9 +5,11 @@ import requests from bs4 import BeautifulSoup as bs +from pprint import pprint header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} +url = 'https://www.rabota.ru' def get_data(zp): @@ -15,13 +17,16 @@ def get_data(zp): soup = bs(resp.text, 'lxml') result = [] work = soup.find_all(class_="vacancy-preview-card__title") + link = soup.find_all('h3', class_='vacancy-preview-card__title') price = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") for i in range(20): result.append({ 'Вакансия': work[i].text.strip(), - 'Зарплата': price[i].text.strip().replace('\xa0', ' ') + 'Зарплата': price[i].text.strip().replace('\xa0', ' '), + 'Ссылка': url + link[i].find('a').get('href') }) - print(result[i]) + pprint(result[i]) + print('-' * 90) get_data(80000) # Требуемая зарплата From 07eff156aa47e7f0758512d089957a4d6a7026ba Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 14 Aug 2021 23:20:44 +0500 Subject: [PATCH 50/62] Update 2.py --- PARSING/Lesson_3/2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PARSING/Lesson_3/2.py b/PARSING/Lesson_3/2.py index 36753ca..fd27286 100644 --- a/PARSING/Lesson_3/2.py +++ b/PARSING/Lesson_3/2.py @@ -17,7 +17,7 @@ def get_data(zp): soup = bs(resp.text, 'lxml') result = [] work = soup.find_all(class_="vacancy-preview-card__title") - link = soup.find_all('h3', class_='vacancy-preview-card__title') + link = soup.find_all(class_='vacancy-preview-card__title') price = soup.find_all(class_="vacancy-preview-card__salary vacancy-preview-card__salary-blue") for i in range(20): result.append({ From b9c38125ccf8ab0539549fcac84ea6f7cf8df1ed Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 21 Aug 2021 21:50:29 +0500 Subject: [PATCH 51/62] Add files via upload --- JS/Lesson_2/1.txt | 15 +++++++ JS/Lesson_2/2.txt | 9 ++++ JS/Lesson_2/3.txt | 109 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 JS/Lesson_2/1.txt create mode 100644 JS/Lesson_2/2.txt create mode 100644 JS/Lesson_2/3.txt diff --git a/JS/Lesson_2/1.txt b/JS/Lesson_2/1.txt new file mode 100644 index 0000000..5f0a9fa --- /dev/null +++ b/JS/Lesson_2/1.txt @@ -0,0 +1,15 @@ +1. Дан код: + +var a = 1, b = 1, c, d; +c = ++a; alert(c); // 2; 1 + 1 (c = 2), (a = 2) +d = b++; alert(d); // 1; (b = 1) + (d = undefined), (d = 1), (b = 2) +c = (2+ ++a); alert(c); // 5; 2 + (2 + 1) (c = 5), (a = 3) +d = (2+ b++); alert(d); // 4; 1 + 2 + 1 (d = 4), (b = 3) +alert(a); // 3; a = 3 +alert(b); // 3; b = 3 + +++a +инкремент сначала срабатывает, а потом возвращает число + +a++ +сначала возвращается число, а потом срабатывает инкремент \ No newline at end of file diff --git a/JS/Lesson_2/2.txt b/JS/Lesson_2/2.txt new file mode 100644 index 0000000..2ead0e3 --- /dev/null +++ b/JS/Lesson_2/2.txt @@ -0,0 +1,9 @@ +2. Чему будет равен x в примере ниже? + +var a = 2; +var x = 1 + (a *= 2); + +a = 2 +1 + (2 * 2) = 5 + +Ответ: x равен 5 \ No newline at end of file diff --git a/JS/Lesson_2/3.txt b/JS/Lesson_2/3.txt new file mode 100644 index 0000000..6b847c5 --- /dev/null +++ b/JS/Lesson_2/3.txt @@ -0,0 +1,109 @@ + 3. Объявить две целочисленные переменные a и b и задать им произвольные начальные значения. + Затем написать скрипт, который работает по следующему принципу: + если a и b положительные, вывести их разность; + если а и b отрицательные, вывести их произведение; + если а и b разных знаков, вывести их сумму; ноль можно считать положительным числом. + + +const a = Math.floor(Math.random() * (10 - -10) + -10) +const b = Math.floor(Math.random() * (10 - -10) + -10) +if (a > 0 && b > 0) console.log(a - b) +if (a < 0 && b < 0) console.log(a * b) +if ((a >= 0 && b < 0) || (a < 0 && b >= 0)) console.log(a + b) + + + 4. Присвоить переменной а значение в промежутке [0..15]. + С помощью оператора switch организовать вывод чисел от a до 15. + +const a = Math.floor(Math.random() * (15 - 0) + 0) + +switch (a) { + case 0: + console.log(0); + case 1: + console.log(1); + case 2: + console.log(2); + case 3: + console.log(3); + case 4: + console.log(4); + case 5: + console.log(5); + case 6: + console.log(6); + case 7: + console.log(7); + case 8: + console.log(8); + case 9: + console.log(9); + case 10: + console.log(10); + case 11: + console.log(11); + case 12: + console.log(12); + case 13: + console.log(13); + case 14: + console.log(14); + case 15: + console.log(15); +} + + + 5. Реализовать основные 4 арифметические операции в виде функций с двумя параметрами. + Обязательно использовать оператор return. + +let a = 10 +let b = 5 + +function plus(a, b){ + return a + b; +} + +function minus(a, b){ + return a - b; +} + +function div (a, b){ + return a / b; +} + +function mult (a, b){ +return a * b; +} + +console.log(plus(a, b)) +console.log(minus(a, b)) +console.log(div(a, b)) +console.log(mult(a, b)) + + + 6. Реализовать функцию с тремя параметрами: function mathOperation(arg1, arg2, operation), + где arg1, arg2 – значения аргументов, operation – строка с названием операции. + В зависимости от переданного значения операции выполнить одну из арифметических операций (использовать функции из пункта 3) + и вернуть полученное значение (использовать switch). + +function mathOperation(arg1, arg2, operation){ + switch(operation){ + case 'сложение': + return arg1 + arg2; + break; + case 'вычитание': + return arg1 - arg2; + break; + case 'деление': + return arg1 / arg2; + break; + case 'умножение': + return arg1 * arg2; + break; + } +} + + 7. *Сравнить null и 0. Попробуйте объяснить результат. + + 8. *С помощью рекурсии организовать функцию возведения числа в степень. + Формат: function power(val, pow), где val – заданное число, pow – степень. \ No newline at end of file From fea1f2ba7307bb5ba1edd128e1b0b24124f38559 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 21 Aug 2021 22:02:05 +0500 Subject: [PATCH 52/62] Add files via upload --- JS/Lesson_2/3.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/JS/Lesson_2/3.txt b/JS/Lesson_2/3.txt index 6b847c5..fb9d9cf 100644 --- a/JS/Lesson_2/3.txt +++ b/JS/Lesson_2/3.txt @@ -90,16 +90,12 @@ function mathOperation(arg1, arg2, operation){ switch(operation){ case 'сложение': return arg1 + arg2; - break; case 'вычитание': return arg1 - arg2; - break; case 'деление': return arg1 / arg2; - break; case 'умножение': return arg1 * arg2; - break; } } From ab0797f9b51a899eb03097e57e2cd4b5f0de6d16 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sat, 21 Aug 2021 23:09:44 +0500 Subject: [PATCH 53/62] Update 3.txt --- JS/Lesson_2/3.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/JS/Lesson_2/3.txt b/JS/Lesson_2/3.txt index fb9d9cf..d15b446 100644 --- a/JS/Lesson_2/3.txt +++ b/JS/Lesson_2/3.txt @@ -101,5 +101,13 @@ function mathOperation(arg1, arg2, operation){ 7. *Сравнить null и 0. Попробуйте объяснить результат. + null это что-то несуществующее, поэтому он не равен ничему, он и не true, и не false + 8. *С помощью рекурсии организовать функцию возведения числа в степень. - Формат: function power(val, pow), где val – заданное число, pow – степень. \ No newline at end of file + Формат: function power(val, pow), где val – заданное число, pow – степень. + +function power(val, pow){ + if (pow <=0) return + if (pow === 1) return val + return val * power(val, pow - 1) +} From 13577a14b4c518e1e8bd0f7730def45b5ea833a7 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Mon, 23 Aug 2021 15:18:03 +0500 Subject: [PATCH 54/62] Add files via upload --- JS/Lesson_3/1.txt | 6 ++++++ JS/Lesson_3/2.txt | 2 ++ JS/Lesson_3/3.txt | 24 ++++++++++++++++++++++++ JS/Lesson_3/4.txt | 5 +++++ JS/Lesson_3/5.txt | 20 ++++++++++++++++++++ 5 files changed, 57 insertions(+) create mode 100644 JS/Lesson_3/1.txt create mode 100644 JS/Lesson_3/2.txt create mode 100644 JS/Lesson_3/3.txt create mode 100644 JS/Lesson_3/4.txt create mode 100644 JS/Lesson_3/5.txt diff --git a/JS/Lesson_3/1.txt b/JS/Lesson_3/1.txt new file mode 100644 index 0000000..f34a535 --- /dev/null +++ b/JS/Lesson_3/1.txt @@ -0,0 +1,6 @@ +1. С помощью цикла while вывести все простые числа в промежутке от 0 до 100 + +let i = 0 +while(i <= 100){ + console.log(i++); +} diff --git a/JS/Lesson_3/2.txt b/JS/Lesson_3/2.txt new file mode 100644 index 0000000..c209459 --- /dev/null +++ b/JS/Lesson_3/2.txt @@ -0,0 +1,2 @@ +2. С этого урока начинаем работать с функционалом интернет-магазина. Предположим, есть сущность корзины. +Нужно реализовать функционал подсчета стоимости корзины в зависимости от находящихся в ней товаров. \ No newline at end of file diff --git a/JS/Lesson_3/3.txt b/JS/Lesson_3/3.txt new file mode 100644 index 0000000..f4ca046 --- /dev/null +++ b/JS/Lesson_3/3.txt @@ -0,0 +1,24 @@ +3. Товары в корзине хранятся в массиве. Задачи: +a) Организовать такой массив для хранения товаров в корзине; +b) Организовать функцию countBasketPrice, которая будет считать стоимость корзины. + + +let basket = [] + +function countBasketPrice(basket) { + let basketPrice = 0 + for (let prod of basket){ + basketPrice += prod.price + } + return basketPrice +} + +console.log("Стоимость корзины: " + countBasketPrice(basket) + " руб.") + + + +let basket = [] +let basketPrice = 0 +basket.forEach(el => basketPrice += el.price) +console.log("Стоимость корзины: " + basketPrice + " руб.") +return basketPrice diff --git a/JS/Lesson_3/4.txt b/JS/Lesson_3/4.txt new file mode 100644 index 0000000..81cfa76 --- /dev/null +++ b/JS/Lesson_3/4.txt @@ -0,0 +1,5 @@ +4.*Вывести с помощью цикла for числа от 0 до 9, не используя тело цикла. Выглядеть это должно так: +for(…){// здесь пусто} + + +for (i = 0; i <= 9; console.log(i++)) {} \ No newline at end of file diff --git a/JS/Lesson_3/5.txt b/JS/Lesson_3/5.txt new file mode 100644 index 0000000..760e63c --- /dev/null +++ b/JS/Lesson_3/5.txt @@ -0,0 +1,20 @@ +5. *Нарисовать пирамиду с помощью console.log, как показано на рисунке, только у вашей пирамиды должно быть 20 рядов, а не 5: +x +xx +xxx +xxxx +xxxxx + + + +let row = 'x'; +for (let i = 0; i < 20; i++) { + console.log(row); + row += 'x'; +} + + +for (let i = 0; i < 20; i++) { + let res = new Array(i).fill('x') + console.log(res.join('')) +} \ No newline at end of file From 69c19bef913b6948d375f4c882bb5297e6233e01 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Mon, 23 Aug 2021 15:28:28 +0500 Subject: [PATCH 55/62] Update 3.txt --- JS/Lesson_3/3.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/JS/Lesson_3/3.txt b/JS/Lesson_3/3.txt index f4ca046..31cf4af 100644 --- a/JS/Lesson_3/3.txt +++ b/JS/Lesson_3/3.txt @@ -3,7 +3,10 @@ a) Организовать такой массив для хранения то b) Организовать функцию countBasketPrice, которая будет считать стоимость корзины. -let basket = [] +let basket = [ + { name: 'Стол', price: 5500 }, + { name: 'Ноутбук', price: 72000 } +] function countBasketPrice(basket) { let basketPrice = 0 @@ -17,7 +20,6 @@ console.log("Стоимость корзины: " + countBasketPrice(basket) + " -let basket = [] let basketPrice = 0 basket.forEach(el => basketPrice += el.price) console.log("Стоимость корзины: " + basketPrice + " руб.") From d1f71791da082b25a480f3ed728ac6c408736f61 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Wed, 25 Aug 2021 03:23:12 +0500 Subject: [PATCH 56/62] Update 1.txt --- JS/Lesson_3/1.txt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/JS/Lesson_3/1.txt b/JS/Lesson_3/1.txt index f34a535..9890626 100644 --- a/JS/Lesson_3/1.txt +++ b/JS/Lesson_3/1.txt @@ -1,6 +1,15 @@ 1. С помощью цикла while вывести все простые числа в промежутке от 0 до 100 -let i = 0 -while(i <= 100){ - console.log(i++); +for (let i = 2; i <= 100; i++) { + let prime_number = true; + for (let j = 2; j < i; j++) { + if ((i % j) === 0) { + prime_number = false; + break + } + } + + if (prime_number) { + console.log(i) + } } From b64863d66dda9d21e8a57727a0a0120e755f6fea Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Wed, 25 Aug 2021 14:52:33 +0500 Subject: [PATCH 57/62] Update 1.txt --- JS/Lesson_3/1.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/JS/Lesson_3/1.txt b/JS/Lesson_3/1.txt index 9890626..76d1134 100644 --- a/JS/Lesson_3/1.txt +++ b/JS/Lesson_3/1.txt @@ -13,3 +13,23 @@ for (let i = 2; i <= 100; i++) { console.log(i) } } + +//================================================= + +let i = 2 +while (i < 100) { + let prime_number = true + let j = 2 + + while (j < i) { + if (i % j === 0) { + prime_number = false + break + } + j++ + } + if (prime_number) { + console.log(i) + } + i++ +} From d1c95ae44d8822d527a22296c9c30b5f6b13e4fe Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Wed, 25 Aug 2021 18:45:44 +0500 Subject: [PATCH 58/62] Add files via upload --- JS/Lesson_4/1.txt | 31 +++++++++++++++++++++++++++++++ JS/Lesson_4/2.txt | 1 + 2 files changed, 32 insertions(+) create mode 100644 JS/Lesson_4/1.txt create mode 100644 JS/Lesson_4/2.txt diff --git a/JS/Lesson_4/1.txt b/JS/Lesson_4/1.txt new file mode 100644 index 0000000..b089363 --- /dev/null +++ b/JS/Lesson_4/1.txt @@ -0,0 +1,31 @@ +1. Написать функцию, преобразующую число в объект. Передавая на вход число от 0 до 999, + надо получить на выходе объект, в котором в соответствующих свойствах описаны + единицы, десятки и сотни. Например, для числа 245 надо получить следующий объект: + {‘единицы’: 5, ‘десятки’: 4, ‘сотни’: 2}. Если число превышает 999, необходимо + выдать соответствующее сообщение с помощью console.log и вернуть пустой объект. + + +function f(n) { + if (n > 999) { + console.log('число больше 999'); + return {} + } + if (n < 0) { + console.log('число меньше 0'); + return {} + } + + const arr = String(n).split('') + const len = arr.length + + return { + сотни: len === 3 ? +arr[0] : 0, + десятки: len === 1 ? 0 : +arr[len - 2], + единицы: +arr[len - 1] + } +} + +console.log(f(28)) +console.log(f(574)) +console.log(f(1000)) +console.log(f(-5)) \ No newline at end of file diff --git a/JS/Lesson_4/2.txt b/JS/Lesson_4/2.txt new file mode 100644 index 0000000..e847827 --- /dev/null +++ b/JS/Lesson_4/2.txt @@ -0,0 +1 @@ +В прошлом уроке уже добавил \ No newline at end of file From 8bad893a1f6d4517708f6e05b5d07c256c2a075f Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Wed, 25 Aug 2021 19:26:30 +0500 Subject: [PATCH 59/62] Update 2.txt --- JS/Lesson_4/2.txt | 57 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/JS/Lesson_4/2.txt b/JS/Lesson_4/2.txt index e847827..20893b9 100644 --- a/JS/Lesson_4/2.txt +++ b/JS/Lesson_4/2.txt @@ -1 +1,56 @@ -В прошлом уроке уже добавил \ No newline at end of file +2. Продолжить работу с интернет-магазином: +В прошлом домашнем задании вы реализовали корзину на базе массивов. Какими объектами можно заменить их элементы? +Реализуйте такие объекты. +Перенести функционал подсчета корзины на объектно-ориентированную базу. + + +class Cart { + constructor(personName, cart) { + this.personName = personName + this.cart = [] + } + + addToCart({id, name, description, price}) { + this.cart.push({id, name, description, price}) + } + + itemCount() { + return this.cart.length + } + + cartPrice() { + let res = 0 + this.cart.forEach(el => res += el.price) + return res + } +} + +const Person = new Cart('Ivan Ivanov', []) + +const item1 = { + id: 1, + name: 'First item', + description: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + price: 500 +} +const item2 = { + id: 2, + name: 'Second item', + description: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + price: 750 +} +const item3 = { + id: 3, + name: 'Third item', + description: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + price: 300 +} + +Person.addToCart(item1) +Person.addToCart(item2) +Person.addToCart(item3) + + +console.log(Person) +console.log(Person.cartPrice()) +console.log(Person.itemCount()) From 15ff75417fea635ecfdd93dc918be6dab968514d Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sun, 29 Aug 2021 20:25:54 +0500 Subject: [PATCH 60/62] Add files via upload --- ...20\260\320\264\320\260\321\207\320\260_1.txt" | 3 +++ JS/Lesson_5/2/index.html | 3 +++ JS/Lesson_5/2/main.js | 16 ++++++++++++++++ ...20\260\320\264\320\260\321\207\320\260_2.txt" | 4 ++++ 4 files changed, 26 insertions(+) create mode 100644 "JS/Lesson_5/1/\320\227\320\260\320\264\320\260\321\207\320\260_1.txt" create mode 100644 JS/Lesson_5/2/index.html create mode 100644 JS/Lesson_5/2/main.js create mode 100644 "JS/Lesson_5/2/\320\227\320\260\320\264\320\260\321\207\320\260_2.txt" diff --git "a/JS/Lesson_5/1/\320\227\320\260\320\264\320\260\321\207\320\260_1.txt" "b/JS/Lesson_5/1/\320\227\320\260\320\264\320\260\321\207\320\260_1.txt" new file mode 100644 index 0000000..bd97b95 --- /dev/null +++ "b/JS/Lesson_5/1/\320\227\320\260\320\264\320\260\321\207\320\260_1.txt" @@ -0,0 +1,3 @@ +Создать функцию, генерирующую шахматную доску. Можно использовать любые html-теги. +Доска должна быть верно разлинована на черные и белые ячейки. Строки должны нумероваться числами от 1 до 8, +столбцы — латинскими буквами A, B, C, D, E, F, G, H. diff --git a/JS/Lesson_5/2/index.html b/JS/Lesson_5/2/index.html new file mode 100644 index 0000000..c905043 --- /dev/null +++ b/JS/Lesson_5/2/index.html @@ -0,0 +1,3 @@ + +
+ \ No newline at end of file diff --git a/JS/Lesson_5/2/main.js b/JS/Lesson_5/2/main.js new file mode 100644 index 0000000..7329bfe --- /dev/null +++ b/JS/Lesson_5/2/main.js @@ -0,0 +1,16 @@ +const root = document.getElementById('root') + +const cart = [ + {name: 'product_1', price: 5}, + {name: 'product_2', price: 15}, + {name: 'product_3', price: 34} +] + +let sum = 0 + +if (cart.length === 0) { + root.textContent = 'Корзина пуста' +} else { + cart.forEach(el => sum += el.price) + root.textContent = `В корзине: ${cart.length} товаров на сумму ${sum}` +} \ No newline at end of file diff --git "a/JS/Lesson_5/2/\320\227\320\260\320\264\320\260\321\207\320\260_2.txt" "b/JS/Lesson_5/2/\320\227\320\260\320\264\320\260\321\207\320\260_2.txt" new file mode 100644 index 0000000..dd94a97 --- /dev/null +++ "b/JS/Lesson_5/2/\320\227\320\260\320\264\320\260\321\207\320\260_2.txt" @@ -0,0 +1,4 @@ +Сделать генерацию корзины динамической: верстка корзины не должна находиться в HTML-структуре. +Там должен быть только div, в который будет вставляться корзина, сгенерированная на базе JS: +Пустая корзина должна выводить строку «Корзина пуста»; +Наполненная должна выводить «В корзине: n товаров на сумму m рублей». From ee26af4d3435dcb2fa4851eb8b02199635ad4288 Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sun, 29 Aug 2021 22:00:27 +0500 Subject: [PATCH 61/62] Add files via upload --- JS/Lesson_5/1/index.html | 15 ++++++++ JS/Lesson_5/1/main.js | 25 +++++++++++++ JS/Lesson_5/3/index.html | 3 ++ JS/Lesson_5/3/main.js | 35 +++++++++++++++++++ ...260\320\264\320\260\321\207\320\260_3.txt" | 5 +++ 5 files changed, 83 insertions(+) create mode 100644 JS/Lesson_5/1/index.html create mode 100644 JS/Lesson_5/1/main.js create mode 100644 JS/Lesson_5/3/index.html create mode 100644 JS/Lesson_5/3/main.js create mode 100644 "JS/Lesson_5/3/\320\227\320\260\320\264\320\260\321\207\320\260_3.txt" diff --git a/JS/Lesson_5/1/index.html b/JS/Lesson_5/1/index.html new file mode 100644 index 0000000..bb77be8 --- /dev/null +++ b/JS/Lesson_5/1/index.html @@ -0,0 +1,15 @@ + + + + + + + + Document + + + + + + + \ No newline at end of file diff --git a/JS/Lesson_5/1/main.js b/JS/Lesson_5/1/main.js new file mode 100644 index 0000000..d8a6d96 --- /dev/null +++ b/JS/Lesson_5/1/main.js @@ -0,0 +1,25 @@ +let field = document.createElement('DIV'); +document.body.appendChild(field); + +for (let y = 0; y < 10; y++) { + for (let x = 0; x < 10; x++) { + let css = x ? {} : { clear: 'left' }; + let content = ''; + if (y == 0 || y == 9) + content = x > 0 && x < 9 ? 'ABCDEFGH'.charAt(x - 1) : null; + else if (x == 0 || x == 9) + content = 9 - y; + else css.background = (x + y) % 2 ? '#000' : '#fff'; + + let node = document.createElement('DIV'); + css.width = '50px'; + css.height = css.width; + css.textAlign = 'center'; + css.lineHeight = '50px' + css.float = 'left'; + for (let i in css) node.style[i] = css[i]; + if (content) + node.innerHTML = content; + field.appendChild(node); + } +} \ No newline at end of file diff --git a/JS/Lesson_5/3/index.html b/JS/Lesson_5/3/index.html new file mode 100644 index 0000000..c905043 --- /dev/null +++ b/JS/Lesson_5/3/index.html @@ -0,0 +1,3 @@ + +
+ \ No newline at end of file diff --git a/JS/Lesson_5/3/main.js b/JS/Lesson_5/3/main.js new file mode 100644 index 0000000..8d27474 --- /dev/null +++ b/JS/Lesson_5/3/main.js @@ -0,0 +1,35 @@ +const root = document.getElementById('root') + +let list = [] + +class Product { + constructor(name, price, description) { + this.name = name + this.price = price + this.description = description + } + + add() { + list.push(this) + } + + toHTML() { + return ` +
+

${this.name}

+

${this.price}

+

${this.description}

+
+ ` + } +} + +const car = new Product('BMW', 25000, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.') +const mac = new Product('Apple', 2700, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.') +const phone = new Product('iPhone', 900, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.') + +car.add() +mac.add() +phone.add() + +root.innerHTML = list.map(el => el.toHTML()).join('') \ No newline at end of file diff --git "a/JS/Lesson_5/3/\320\227\320\260\320\264\320\260\321\207\320\260_3.txt" "b/JS/Lesson_5/3/\320\227\320\260\320\264\320\260\321\207\320\260_3.txt" new file mode 100644 index 0000000..52b4be9 --- /dev/null +++ "b/JS/Lesson_5/3/\320\227\320\260\320\264\320\260\321\207\320\260_3.txt" @@ -0,0 +1,5 @@ +* Сделать так, чтобы товары в каталоге выводились при помощи JS: +Создать массив товаров (сущность Product); +При загрузке страницы на базе данного массива генерировать вывод из него. +HTML-код должен содержать только div id=”catalog” без вложенного кода. +Весь вид каталога генерируется JS. From 6765a5809080958f2552d9a4fede8274f27b27ae Mon Sep 17 00:00:00 2001 From: Yuri <57116431+softicer-67@users.noreply.github.com> Date: Sun, 29 Aug 2021 22:00:59 +0500 Subject: [PATCH 62/62] Update main.js --- JS/Lesson_5/1/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/JS/Lesson_5/1/main.js b/JS/Lesson_5/1/main.js index d8a6d96..da374dd 100644 --- a/JS/Lesson_5/1/main.js +++ b/JS/Lesson_5/1/main.js @@ -15,11 +15,11 @@ for (let y = 0; y < 10; y++) { css.width = '50px'; css.height = css.width; css.textAlign = 'center'; - css.lineHeight = '50px' + css.lineHeight = '50px' css.float = 'left'; for (let i in css) node.style[i] = css[i]; if (content) node.innerHTML = content; field.appendChild(node); } -} \ No newline at end of file +}