Advertisement
muriela

Untitled

May 14th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.00 KB | None | 0 0
  1. # encoding: utf-8
  2.  
  3. import argparse
  4.  
  5. import requests
  6. from bs4 import BeautifulSoup
  7.  
  8. media_projects_names = ['news', 'woman', 'afisha', 'sport', 'auto', 'weekend']
  9.  
  10. parser = argparse.ArgumentParser()
  11. parser.add_argument('--stage', '-s', type=str, required=False, default=False,
  12. help='example, --stage=stage05')
  13. args = parser.parse_args()
  14. stage = args.stage
  15.  
  16. if stage:
  17. scheme = 'http'
  18. stage_host = '.' + stage + '.rchannel'
  19. pstage = stage
  20. else:
  21. scheme = 'https'
  22. stage_host = ''
  23. pstage = 'prod'
  24.  
  25. projects_urls_d = {
  26. 'Все новости': scheme + '://news' + stage_host + '.rambler.ru/?utm_source=',
  27. 'Финансы': 'https://finance.rambler.ru/?utm_source=',
  28. 'Женский': scheme + '://woman' + stage_host + '.rambler.ru/?utm_source=',
  29. 'Развлечения': scheme + '://afisha' + stage_host + '.rambler.ru/?utm_source=',
  30. 'Спорт': scheme + '://sport' + stage_host + '.rambler.ru/?utm_source=',
  31. 'Авто': scheme + '://auto' + stage_host + '.rambler.ru/?utm_source=',
  32. 'Здоровье': 'https://doctor.rambler.ru/?utm_source=',
  33. 'Субботний': scheme + '://weekend' + stage_host + '.rambler.ru/?utm_source=',
  34. 'Игры': 'https://games.rambler.ru/?utm_source='
  35. }
  36.  
  37. projects_urls_m = {
  38. 'Все новости': scheme + '://news' + stage_host + '.rambler.ru/?utm_source=',
  39. 'Финансы': 'https://m.finance.rambler.ru/?utm_source=',
  40. 'Женский': scheme + '://woman' + stage_host + '.rambler.ru/?utm_source=',
  41. 'Развлечения': scheme + '://afisha' + stage_host + '.rambler.ru/?utm_source=',
  42. 'Спорт': scheme + '://sport' + stage_host + '.rambler.ru/?utm_source=',
  43. 'Авто': scheme + '://auto' + stage_host + '.rambler.ru/?utm_source=',
  44. 'Субботний': scheme + '://weekend' + stage_host + '.rambler.ru/?utm_source=',
  45. 'Игры': 'https://games.rambler.ru/?utm_source='
  46.  
  47. }
  48.  
  49.  
  50. def create_dict_with_urls_on_site(mediaprojectname, mobile=False, stage=False):
  51. """ Данная функция парсит html код страницы (например, news.rambler.ru),
  52. затем находит элементы левого меню и создаёт из них словарь,
  53. где ключ = название Вертикали, а значение = url,
  54. например, Женский : 'https://woman.rambler.ru'
  55.  
  56. :param mobile: False для десктопной и True для мобильной версии
  57. :param stage: False для дефолтного значения(прод) либо номер стейджа
  58. :return: словарь пар вида 'Имя вертикали': 'Url',
  59. например, 'Женский': 'https://woman.rambler.ru' """
  60. dict_with_urls = dict()
  61. if stage:
  62. host = '{}.{}.rchannel.rambler.ru'.format(mediaprojectname, stage)
  63. else:
  64. host = '{}.rambler.ru'.format(mediaprojectname)
  65. universal_url = '{}://{}'.format(scheme, host)
  66. if mobile:
  67. cookies = {'rswitch': 'mobile'}
  68. r = requests.get(universal_url, cookies=cookies)
  69. else:
  70. cookies = {'rswitch': 'desktop'}
  71. r = requests.get(universal_url, cookies=cookies)
  72.  
  73. text_page = r.text
  74. soup = BeautifulSoup(text_page, "html.parser")
  75. # Если десктопная версия, то формируем список объектов, содержащих элементы
  76. # левого меню. Их отыскиваем в html коде страницы как теги "a" с атрибутом
  77. # class равным "nav-global__link" Далее наполняем словарь парами
  78. # Имя вертикали : значение атрибута href, то есть ссылка на вертикаль
  79. if not mobile:
  80. strings_list = soup.find_all('a', attrs={'class': 'nav-global__link'})
  81. for link in strings_list:
  82. if str(link.contents[0]).strip('\n') in projects_urls_d.keys():
  83. temp = str(link.get_text())
  84. temp = temp.strip('\n')
  85. dict_with_urls.update({temp: link.get('href')})
  86. else:
  87. strings_list = soup.find_all('a', attrs={'class': 'menu__item'})
  88. for link in strings_list[:9]:
  89. if str(link.contents[3].contents[0]) in projects_urls_m.keys():
  90. temp = str(link.get_text())
  91. temp = temp.strip('\n')
  92. dict_with_urls.update({temp: link.get('href')})
  93. return dict_with_urls
  94.  
  95.  
  96. # Создаём списки в которые будем добавлять по "1" в случае ошибок
  97. wrong_urls_list_count = [] # при ошибках в урле
  98. wrong_project_names_count_list = [] # при ошибках в названии вертикали/проекта
  99.  
  100.  
  101. def main():
  102. for media_project in media_projects_names:
  103. print('\nChecking DESKTOP URLS on {}({})'.
  104. format(media_project.upper(), pstage))
  105. for project_name in projects_urls_d.keys():
  106. if project_name in \
  107. create_dict_with_urls_on_site(media_project,
  108. stage=stage).keys():
  109. if projects_urls_d[project_name] \
  110. in create_dict_with_urls_on_site(
  111. media_project, stage=stage)[project_name]:
  112. print('{} OK |'.format(project_name), end='')
  113. else:
  114. print('{} '
  115. 'is NOT OK. Site:{} Script:{}'
  116. .format(project_name,
  117. create_dict_with_urls_on_site(media_project,
  118. stage=stage)
  119. [project_name][:30],
  120. projects_urls_d[project_name]))
  121. wrong_urls_list_count.append('1')
  122. else:
  123. print('Заданное в скрипте название Вертикали '
  124. '= {} не найдено на сайте'.format(project_name))
  125. wrong_project_names_count_list.append('1')
  126. print('\nChecking MOBILE URLS on {}({})'.
  127. format(media_project.upper(), pstage))
  128. for project_name2 in projects_urls_m.keys():
  129. if project_name2 in \
  130. create_dict_with_urls_on_site(media_project,
  131. stage=stage,
  132. mobile=True).keys():
  133. if projects_urls_m[project_name2] \
  134. in create_dict_with_urls_on_site(media_project,
  135. stage=stage,
  136. mobile=
  137. True)[project_name2]:
  138. print('{} OK |'.format(project_name2), end='')
  139. else:
  140. print('URL on {} '
  141. 'is NOT OK. Site:{} Script:{}'
  142. .format(project_name2,
  143. create_dict_with_urls_on_site(media_project,
  144. stage=stage,
  145. mobile=True)
  146. [project_name2][:45],
  147. projects_urls_m[project_name2]))
  148. else:
  149. print('Заданное в скрипте название Вертикали '
  150. '= {} не найдено на сайте'.format(project_name2))
  151. print('')
  152. print('\nКРАТКО:')
  153. print('Кол-во неверных названий вертикалей =',
  154. len(wrong_project_names_count_list))
  155. print('Кол-во неверных ссылок (URLS) вертикалей =',
  156. len(wrong_urls_list_count))
  157.  
  158.  
  159. if __name__ == '__main__':
  160. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement