excel_handler.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """Скрипт для работы с Excel файлами и валидации url адресов в них
  2. при помощи библиотек pandas и requests."""
  3. import pandas
  4. from urllib.parse import urlsplit
  5. import requests
  6. from pandas import DataFrame
  7. from requests.exceptions import MissingSchema, ConnectionError
  8. def get_dframe(excel_name: str, **kwargs) -> DataFrame:
  9. return pandas.read_excel(excel_name, **kwargs)
  10. def get_norm_hosts(df: DataFrame, url_column: str) -> set:
  11. """Функция для получения множества хостов из DataFrame имеющих
  12. только название домена и доменную зону (example.com)"""
  13. res = set()
  14. for site in df[url_column]:
  15. url = str(site).strip()
  16. url = urlsplit(url)
  17. host = url.hostname
  18. if host is not None:
  19. host = host.split('.')[-2:]
  20. norm_host = '.'.join(host)
  21. res.add(norm_host)
  22. return res
  23. def clean_dataframe_by_site(df: DataFrame, exclude_sites: set,
  24. url_column: str) -> DataFrame:
  25. """Функция очистки DataFrame от строк, которые имеют в поле url_column
  26. адреса из множества exclude_sites"""
  27. res = []
  28. for index, row in df.iterrows():
  29. sites = str(row[url_column]).strip().split(' | ')
  30. hosts = [urlsplit(site).hostname for site in sites
  31. if urlsplit(site).hostname is not None]
  32. norm_hosts = ['.'.join(host.split('.')[-2:]) for host in hosts]
  33. norm_hosts_set = set(norm_hosts)
  34. intersec = norm_hosts_set.intersection(exclude_sites)
  35. if len(intersec) == 0:
  36. res.append(row)
  37. return DataFrame(res)
  38. def get_dataframe_with_available_url(df: DataFrame, url_column: str
  39. ) -> DataFrame:
  40. """Функция отбраковки строк DataFrame
  41. в зависимости от доступности url адреса в них"""
  42. res = []
  43. for index, row in df.iterrows():
  44. sites = str(row[url_column]).strip().split(' | ')
  45. for site in sites:
  46. try:
  47. response = requests.get(site, timeout=5)
  48. except (MissingSchema, ConnectionError):
  49. continue
  50. else:
  51. if response.ok:
  52. res.append(row)
  53. return DataFrame(res)