a_igin

Untitled

Aug 19th, 2020
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.83 KB | None | 0 0
  1. from bs4 import BeautifulSoup as bs
  2. import requests
  3.  
  4.  
  5. class RtNewsAnimalParser:
  6.     headers = {'Accept': '*/*',
  7.                'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0'}
  8.     base_url = 'https://russian.rt.com'
  9.     session = requests.Session()
  10.  
  11.     def rt_news_animal(self):
  12.         '''
  13.        Эта функция парсит https://russian.rt.com/tag/zhivotnye
  14.        all_list_news = последние 15 новостей
  15.        url_new = ссылка на конкретную новость
  16.        heading= заголовок статьи
  17.        main_text= основной текст находящийся на странице статьи
  18.        url_media= принимает в значение картинки, видео(может быть как mp4 так и с youtube)
  19.        time_post = время публикации статьи
  20.        description_news= краткое описание статьи , которое находится как в статье ,
  21.                            так и в ее кратном описании на общей странице статей
  22.        galery_media = при наличии в статье нескольких фотографий, вместо url_media
  23.                        принимаются все фотографии в galery_media
  24.        :return:
  25.        '''
  26.         tag_zhivotnie = self.base_url + '/tag/zhivotnye'
  27.         session = requests.Session()
  28.         request = session.get(tag_zhivotnie, headers=self.headers)
  29.         soup = bs(request.content, 'html.parser')
  30.         all_list_news = soup.find_all('div', 'card__heading_all-new')
  31.         novosti = []
  32.         for list_news in all_list_news:
  33.             list_news_description = list_news.text.strip()
  34.             url_news = list_news('a', 'link_color')
  35.             for url_new in url_news:
  36.                 news_element = self.parse_new_url(url_new, list_news_description)
  37.                 novosti.append(news_element)
  38.         return novosti
  39.  
  40.     def parse_new_url(self, url_new, list_news_description):
  41.         '''
  42.        Получить информацию об отдельной новости
  43.        :param url_new: Ссылка на новость
  44.        :param url_new: Описание новости
  45.        :return:
  46.        '''
  47.         url_new = self.base_url + url_new['href']
  48.         request_url_new = self.session.get(url_new, headers=self.headers)
  49.         soup_url_new = bs(request_url_new.content, 'html.parser')
  50.         heading = soup_url_new.find('div', 'article__summary').text
  51.         time_post = soup_url_new.find('time', 'date')['datetime']
  52.         # 'description_news': list_news.text.strip() не работает
  53.         set_news = {'url_news': url_new,
  54.                     'description_news': list_news_description,
  55.                     'heading': heading.strip(),
  56.                     'time_post': time_post}
  57.  
  58.         set_news.update(self.add_main_text(soup_url_new))
  59.         set_news.update(self.add_url_media(soup_url_new))
  60.         set_news.update(self.add_gallery_media(soup_url_new))
  61.         return set_news
  62.  
  63.     def add_main_text(self, html):
  64.         main_text = html.find('div', 'article__text')
  65.         if main_text is not None:
  66.             main_text_find_all = main_text.find_all('p')
  67.             full_text = ''
  68.             for main_text_p in main_text_find_all:
  69.                 full_text += main_text_p.text
  70.             return{'main_text': full_text}
  71.  
  72.     def add_url_media(self, html):
  73.         time_post = html.find('time', 'date')['datetime']
  74.  
  75.         optimal_date = time_post.split('-')[0] + '.' + time_post.split('-')[1]
  76.  
  77.         url_media = html.find('img', 'article__cover-image')
  78.         mediaplayer_mp4 = html.find('div', 'mediaplayer')
  79.         mediaplayer_you_tube = html.find_all('div', 'slide')
  80.  
  81.         if url_media is not None:
  82.             return {'url_media': url_media['src']}
  83.         if mediaplayer_mp4 is not None:
  84.             url_media = mediaplayer_mp4.find('div').attrs['id']
  85.             kod_video = url_media.split('-')[-1]
  86.             url_media_new = 'https://cdnv.rt.com/russian/video/' + optimal_date + "/" + kod_video + '.mp4'
  87.             return {'url_media': url_media_new}
  88.         if mediaplayer_you_tube is []:
  89.             url_media = html.find('iframe', 'cover__video')
  90.             if url_media is not None:
  91.                 you_tube_url = 'https:' + url_media['src']
  92.                 return {'url_media': you_tube_url}
  93.  
  94.     def add_gallery_media(self, html):
  95.         galery_media = html.find_all('div', 'slide')
  96.  
  97.         if galery_media is []:
  98.             print(galery_media)
  99.             summ_gallery = []
  100.             for gallery in galery_media:
  101.                 summ_gallery += {str(gallery['data-src'] + ' ')}
  102.             return {'gallery_img': summ_gallery}
  103.  
Add Comment
Please, Sign In to add comment