o
    $F5j6                     @   s   d dl Z d dlmZ d dlmZ d dlmZmZmZmZ d dl	Z	d dl
Z
d dlZd dlmZ ejejd eeZG dd dZdS )	    N)BeautifulSoup)datetime)ListDictOptionalTuple)	UserAgent)levelc                   @   s   e Zd Zd"dedefddZd#ded	ed
edeee	e
  ee f fddZdedede	e
 fddZdedee
 fddZde
fddZde	e
 fddZdedefddZdedefddZdededee fddZd d! ZdS )$VKParserNcookies
user_agentc              	   C   sR   t  | _t | _| jj|p| jjdddddd |r$| jj| d| _	d S )Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8z#ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3zgzip, deflate, brz
keep-alive1)z
User-AgentAcceptzAccept-LanguagezAccept-Encoding
ConnectionzUpgrade-Insecure-Requestshttps://m.vk.com)
requestsSessionsessionr   uaheadersupdaterandomr   base_url)selfr   r    r   C/var/www/www-root/data/www/avtoreputaciya.ru/vk_parser/vk_parser.py__init__   s   

	
zVKParser.__init__r   
   group_idoffsetcountreturnc              
   C   s|  z| ds| dr|}n&| s| dr/|dd  r/| ds)d| nd| }nd| }| j d| }d	||d
}td| d| d|  | jj||dd}|  d|jv rnt	d| d W dS | 
|j|}| |j|}	||	fW S  tjjy }
 ztd| d|
  W Y d}
~
dS d}
~
w ty }
 ztd| d|
  W Y d}
~
dS d}
~
ww )u   
        Получить записи со стены группы
        Возвращает: (список постов, next_from для пагинации)
        publicclub-   Nzwall-wall/r   )ownr   r    u   Запрос: z?offset=z&count=   )paramstimeoutuN   Доступ к запрашиваемой странице ограниченu$   ⚠️ Доступ к группе u    ограниченNNu'   ❌ Ошибка запроса для z: u5   ❌ Непредвиденная ошибка для )
startswithisdigitr   loggerinfor   getraise_for_statustextwarning_parse_wall_html_get_next_offsetr   
exceptionsRequestExceptionerror	Exception)r   r   r   r    wall_idurlr*   responsepostsnext_offseter   r   r   get_group_wall!   s:   " 


zVKParser.get_group_wallhtmlc           	      C   s   t |d}g }|jdtdd}|s|dddi}|D ]+}z| ||}|r-|| W q tyH } ztd|  W Y d}~qd}~ww t	d	t
| d
|  |S )u?   Разобрать HTML стены и извлечь постыhtml.parserdivzwall_item|post|feed_rowclass_data-post-idT*   Ошибка парсинга поста: Nu   ✅ Найдено u"    постов для группы )r   find_allrecompile_parse_single_postappendr:   r/   debugr0   len)	r   rB   r   soupr>   post_elements	post_elem	post_datar@   r   r   r   r5   V   s$   

zVKParser._parse_wall_htmlc                 C   s  z| d}|s#|jdtdd}|r | dddd }nW d	S |jd
tdd}|r5|jddnd}|jdtdd}|rI|jddnd}d	}	|ra| dra| ddddd}	|jdtdd}
|
rs|
jddnd}|r|| |nt	 }| 
|}| |}|dsd| d| nd| d| }t|||	||| ||| dd| dd| dd| dd|t|dW S  ty } ztd|  W Y d	}~d	S d	}~ww )u$   Разобрать один постrG   a/wall-?\d+_\d+hrefrW    _NrD   zwall_post_text|post_text|textrE   Tstripzauthor|nameu   Неизвестноr'   idspanz	date|timer$   zhttps://vk.com/wall-zhttps://vk.com/walllikesr   repostsviewscomments)post_idpost_url	author_idauthor_namer3   
text_cleandater_   r`   ra   rb   attachmentsraw_htmlrH   )r1   findrJ   rK   splitget_textreplace_parse_dater   now_parse_stats_parse_attachmentsr-   str_clean_textr:   r/   rN   )r   rR   r   rc   link	text_elemr3   author_elemrf   re   	date_elemdate_strrh   statsri   rd   r@   r   r   r   rL   p   sN   


*



zVKParser._parse_single_postc           
      C   s   ddddd}|  }td|}|rt|d|d< td|}|r-t|d|d< td|}|r>t|d|d	< |jd
tdd}|r_|  }td|}	|	r_t|	d|d< |S )u.   Парсинг статистики постаr   )r_   r`   ra   rb   u   ❤\s*(\d+)r%   r_   u   🔄\s*(\d+)r`   u   👁\s*(\d+)ra   rT   rU   rV   u   (\d+)\s*коммrb   )rm   rJ   searchintgrouprk   rK   )
r   rR   rz   r3   
like_matchrepost_matchviews_matchcomment_elemcomment_textcomment_matchr   r   r   rq      s$   zVKParser._parse_statsc           
   	   C   s   g }|j dtdd}|D ]}|dr%|d|d|ddd q|j d	td
d}|D ]}|d|d|jddd q2|j d	tdd}|D ]}|dd}	|	dsp|	dsp|d|	|jddd qQ|S )uD   Парсинг вложений (фото, видео, ссылки)imgz\.(jpg|png|gif))srcr   photoaltrX   )typer<   r   rT   z/videorV   videorW   Tr[   )r   r<   r3   z
^https?://zhttps://vk.comr   ru   )rI   rJ   rK   r1   rM   rm   r-   )
r   rR   ri   photo_elemsr   video_elemsr   
link_elemsru   rW   r   r   r   rr      s8   




zVKParser._parse_attachmentsry   c                 C   sF  z|  }d| v rt jdddddW S d| v r.t tdd jdddddW S dddd	d
dddddddd}td|}|r_| \}}}|	| d}tt
||t
|W S td|}|r}| \}}	t jt
|t
|	dddW S t W S  ty }
 ztd| d|
  t W  Y d}
~
S d}
~
ww )u)   Парсинг даты из строкиu   сегодняr   )hourminutesecondmicrosecondu
   вчераr%   )days                     	   r         )u   янвu   февu   марu   апрu   маяu   июнu   июлu   авгu   сенu   октu   нояu   декu   (\d+)\s+([а-я]{3})\s+(\d{4})z(\d{1,2}):(\d{2})u(   Ошибка парсинга даты 'z': N)r\   lowerr   rp   rn   	timedeltarJ   matchgroupsr1   r|   r:   r/   rN   )r   ry   monthsr   day
month_nameyearmonthr   r   r@   r   r   r   ro      s0   " 
zVKParser._parse_dater3   c                 C   s$   t dd|}t dd|}| S )uN   Очистка текста от лишних символов и эмодзиzhttps?://\S+rX   z\s+ )rJ   subr\   )r   r3   r   r   r   rt     s   zVKParser._clean_textcurrent_offsetc           	      C   s   t |d}|jdtdd}|r(|dr(|d}td|}|r(|dS |jdtd	d
}|rU|jdtdd}|rU|drUtd|d}|rU|dS dS )uB   Получить offset для следующей страницыrC   rT   u;   Показать ещё|Загрузить ещё|Show more)stringrW   z[?&]offset=(\d+)r%   rD   zpagination|pagesrE   u   »|вперед|nextN)r   rk   rJ   rK   r1   r{   r}   )	r   rB   r   rP   	show_morerW   r   
pagination	next_linkr   r   r   r6   !  s   



zVKParser._get_next_offsetc                 C   s   | j   dS )u   Закрыть сессиюN)r   close)r   r   r   r   r   8  s   zVKParser.closer,   )r   r   )__name__
__module____qualname__dictrs   r   r|   r   r   r   r   rA   r5   rL   rq   rr   r   ro   rt   r6   r   r   r   r   r   r
      s    05:"%&
r
   )r   bs4r   r   typingr   r   r   r   rJ   timeloggingfake_useragentr   basicConfigINFO	getLoggerr   r/   r
   r   r   r   r   <module>   s    
