Advertisement
Guest User

Untitled

a guest
Mar 17th, 2023
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.72 KB | None | 0 0
  1. from bs4 import BeautifulSoup as BS
  2. from openpyxl import Workbook
  3. from selenium.webdriver.common.keys import Keys
  4. from selenium import webdriver
  5. from itertools import *
  6. from time import sleep
  7. import requests
  8. import asyncio
  9. import aiohttp
  10.  
  11. def add_university_data(ws_universities, id_num, name, link, city):
  12.     ws_universities.append([id_num, name, link, city])
  13.  
  14.  
  15. def add_item_data(ws_items ,id_num, name, link):
  16.     ws_items.append([id_num, name, link])
  17.  
  18.  
  19. def add_directions_data(ws_directions, id_num, directions, num):
  20.     ws_directions.append([id_num, directions, num])
  21.  
  22. universities_data = []
  23. items_data = []
  24. direction_data = []
  25.  
  26.  
  27. async def get_page_data(session, page, headers):
  28.     print(f'Страница №{page + 1} / 250')
  29.     url = f'https://www.ucheba.ru/for-abiturients/vuz/rossiya?s={page}0'
  30.  
  31.     async with session.get(url=url, headers=headers) as response:
  32.  
  33.         response_text = await response.text()
  34.  
  35.         # Основная страница
  36.         src = response_text
  37.         soup = BS(src, "lxml")
  38.         all_universiti_hrefs = soup.find_all('a', 'js_webstat')
  39.  
  40.         count_university = 1
  41.  
  42.         for link in all_universiti_hrefs:
  43.  
  44.             count_items = 0
  45.             count_derection = 0
  46.  
  47.             link_text = link.text
  48.             link_href = 'https://www.ucheba.ru' + link.get('href')
  49.            
  50.             response = session.get(url=link_href, headers=headers)
  51.             src = response
  52.  
  53.             soup = BS(src, 'lxml')
  54.             universities_citi = soup.find(
  55.                 'ul', 'params-list').find_all('li')[0].text.strip()
  56.  
  57.             universities_data.append(
  58.                 {
  59.                 count_university: [link_text, link_href, universities_citi]
  60.                 }
  61.             )
  62.  
  63.             response = session.get(url=link_href, headers=headers)
  64.             src = response.text
  65.  
  66.             soup = BS(src, 'lxml')
  67.  
  68.             receipt_group = soup.find('div', class_='ege-groups-list')
  69.  
  70.             try:
  71.                 for ul in receipt_group.find_all('div', class_='ege-groups-list__item'):
  72.                     items = []
  73.  
  74.                     for li in ul.find('ul', class_='ege-groups-list__subjects subjects-list').find_all('li'):
  75.                         items.append(li.text.replace(
  76.                             '\n', '').replace(' ', '-'))
  77.  
  78.                     items_name = '_'.join(items)
  79.  
  80.                     items_href = 'https://www.ucheba.ru' + ul.find('div', class_='ege-groups-list__info').find(
  81.                         'a', class_='ege-groups-list__programs-link').get('href')
  82.  
  83.                     items_data.append(
  84.                         {
  85.                         f'{count_university}_{count_items}': [items_name, items_href]
  86.                         }
  87.                     )
  88.  
  89.                     src = session.get(url=items_href, headers=headers)
  90.                     soup = BS(src.text, 'lxml')
  91.  
  92.                     if not soup.find('div', class_='paginator mt-25'):
  93.  
  94.                         all_derection = [i.text for i in soup.find_all(
  95.                             'a', class_='js_webstat')]
  96.                         all_passing_score = []
  97.                         for i in soup.find_all('div', class_='search-results-options'):
  98.                             if isinstance(i.text.split()[2]) or i.text.split()[2] == '—':
  99.                                 all_passing_score.append(i.text.split()[2])
  100.                             else:
  101.                                 all_passing_score.append(i.text.split()[3])
  102.  
  103.                         for d, p in zip_longest(all_derection, all_passing_score, fillvalue=' '):
  104.                             direction_data.append(
  105.                                 {
  106.                                 f'{count_university}_{count_items}_{count_derection}': [d, p]
  107.                                 }
  108.                             )
  109.                             count_derection += 1
  110.                     else:
  111.  
  112.                         page = soup.find(
  113.                             'div', class_='paginator mt-25').find_all('a')
  114.  
  115.                         for i in page:
  116.  
  117.                             items_href = items_href[:items_href[::-
  118.                                                                 1].page('//'[0])-1] + i.get('href')
  119.                             src = session.get(url=items_href, headers=headers)
  120.                             soup = BS(src.text, 'lxml')
  121.  
  122.                             all_derection = [j.text for j in soup.find_all(
  123.                                 'a', class_='js_webstat')]
  124.                             all_passing_score = []
  125.  
  126.                             for j in soup.find_all('div', class_='search-results-options'):
  127.  
  128.                                 if isinstance(j.text.split()[2]) or j.text.split()[2] == '—':
  129.                                     all_passing_score.append(j.text.split()[2])
  130.                                 else:
  131.                                     all_passing_score.append(j.text.split()[3])
  132.  
  133.                             for d, p in zip_longest(all_derection, all_passing_score, fillvalue=' '):
  134.                                 direction_data.append(
  135.                                     {
  136.                                     f'{count_university}_{count_items}_{count_derection}': [d, p]
  137.                                     }
  138.                                 )
  139.                         count_items += 1
  140.                        
  141.             except:
  142.                 print('Ошибка')
  143.                 continue
  144.  
  145.             count_university += 1
  146.     print(f'Обработана страница {page}')
  147.  
  148. async def gather_data():
  149.     auth_data = {
  150.         "password": "Vi31128282",
  151.         "rememberMe": "true",
  152.         "username": "brykovvita173@gmail.com"
  153.     }
  154.     auth_url = 'https://api.ucheba.ru/v1/auth'
  155.  
  156.     headers = {
  157.         "accept": 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  158.         'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
  159.         'Content-Type': 'application/json',
  160.         'cookie': 'sessionSource=%7B%22ref%22%3A%22https%3A%2F%2Fwww.google.com%2F%22%2C%22req%22%3A%22%2Ffor-abiturients%2Fvuz%2Frossiya%22%2C%22utm%22%3Anull%7D; locationIds=%5B3%5D; advUserId=805f961b-06c9-43bd-9a8d-2eec536fc4cf; _ym_uid=1678554080752447596; _ym_d=1678554080; _ga=GA1.2.2134169335.1678554081; _gid=GA1.2.1188182247.1678554081; tmr_lvid=e168b7d9e791badcff6caa177b5666a2; tmr_lvidTS=1678556330118; advUserId=805f961b-06c9-43bd-9a8d-2eec536fc4cf; _ym_isad=2; noticePermissionVkBlock=block; noticePermissionVkCounter=1; uchru_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2NzkwNzg1ODksImV4cCI6MTcxMDcwMDk4OSwicm9sZXMiOlsiUk9MRV9VU0VSIl0sImlkIjo4MDQyMjN9.oCAsDcDZ57g4G2ZMyuwD_tpFgHwCWXwAyKQK5NxH4oCL8xbLqX9AVZSKCfAJlLwd0UB8gp1XrFwxL6Dw45zHukRK6nYAL-sgJGGUrkTrdLuszPYg4cy9Yil3KyHN-HzfNvocxxmijOqwqxqvpjNrSw_Kig1hMnrQcWp2Zh37dP-IGeLcGvpSau9vzYrV0W9piKAYk7P4mKishorB4DDEPzg4S1P0EfAGxd2iFDJExqbJbp8j7M13EdGpJ7GkhbWKEJvqWbEYYqBjdhlTueLqH0_b0kN9BIbG-jHw7iVYmn2-89AJQP6vm1TYH0MCqPe8YvOELqRfx0L3mi3y7XPaGw; userTags=%7B%22ege_request_messenger%22%3A1678554078%2C%22platform_web_desktop%22%3A1678556149%2C%22ege_interested%22%3A1648917327%2C%22service_main_page%22%3A1678977992%2C%22service_catalog_vuz%22%3A1678963910%7D; _ym_visorc=b; tmr_detect=0%7C1679078599245; bannerSession=start; bannerSessionCount=%5B1038%5D; notices=%5B%22VkPermissionNoticeId%22%2C%22bannerNotice%22%5D; snuch=6fqg228gic0tg1k7g58rn63vpb; _gat=1; bannerSessionCount=%5B1038%2C1379%5D'
  161.     }
  162.  
  163.     async with aiohttp.ClientSession() as session:
  164.         # authorize first
  165.         await session.post(auth_url, json=auth_data, headers=headers)
  166.  
  167.         # get the initial page
  168.         url = 'https://www.ucheba.ru/for-abiturients/vuz/rossiya'
  169.         response = await session.get(url=url, headers=headers)
  170.  
  171.         soup = BS(await response.text(), 'lxml')
  172.         pages_count = soup.find('div', 'paginator mt-25').find('ul').find_all('li')[-1].text
  173.  
  174.         tasks = []
  175.  
  176.         for page in range(0, int(pages_count) + 1):
  177.             task = asyncio.create_task(get_page_data(session, page, headers))
  178.             tasks.append(task)
  179.        
  180.         await asyncio.gather(*tasks)
  181.  
  182. def main():
  183.     asyncio.run(gather_data())
  184.  
  185.     wb = Workbook()
  186.     ws_universities = wb.active
  187.  
  188.     ws_universities.title = 'Universities'
  189.     ws_universities.append(
  190.         ['ID', 'Название вуза', 'Ссылка на страницу вуза', 'Город вуза'])
  191.  
  192.     ws_items = wb.create_sheet('Items')
  193.     ws_items.append(['ID', 'Предметы для поступления',
  194.                     'Ссылка на все направления по предметам'])
  195.  
  196.     ws_directions = wb.create_sheet('Directions')
  197.     ws_directions.append(['ID', 'Направления', 'Минимальный балл'])
  198.  
  199.     wb.save(
  200.             f'/home/kukuruzka-vitya/CODE/za_python/parsing/pars_university_first/university.xlsx')
  201.  
  202.     for data_un in universities_data:
  203.         for university_num, items in data_un.items():
  204.             add_university_data(ws_universities, university_num, items[0], items[1], items[2])
  205.  
  206.     for data_un in items_data:
  207.         for university_num, items in data_un.items():
  208.             add_university_data(ws_items ,university_num.split('_')[0], items[0], items[1])
  209.  
  210.     for data_un in direction_data:
  211.         for university_num, items in data_un.items():
  212.             add_university_data(ws_directions ,university_num.split('_')[0], items[0], items[1])
  213.    
  214.     wb.save(
  215.         f'/home/kukuruzka-vitya/CODE/za_python/parsing/pars_university_first/university.xlsx')
  216.  
  217. if __name__ == '__main__':
  218.     main()
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement