Python скриншот сайтов из Excel

Данный скрипт делает скриншоты страниц. Читает адрес сайта с таблицы Excel и запускает браузер Firefox, тот переходит по ссылке и делает скрин.
Результат сохраняется в указанную ранее папку и его путь добавляется в список. По окончанию работы списки сохраняются в Excel документ.
При повторной работе скрипт может обновить скриншоты или не делать новые.
  1. # Обновление установщика pip
  2. python.exe -m pip install --upgrade pip
  3. # Установка модулей
  4. pip install -U selenium
  5. pip install pandas
  6. pip install xlrd
  7. pip install openpyxl
  8. pip install Pillow
  9. # Запуск скрипта
  10. py main.py
  1. # Импортируем зависимости необходимые для работы скрипта
  2. from PIL import Image                   # Для преобразования PNG в JPG
  3. import time                             # Работа со временем
  4. import random                           # Для генерации уникальных имен файлов
  5. from selenium import webdriver          # Две зависимости для работы с Firefox
  6. from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
  7. import pandas                           # Для работы с форматом Excel
  8.  
  9. #(ВНИМАНИЕ Перезапишет файл) # Если нужно обновить старые скрины то ставим 100
  10. UPD_SCREEN = 100
  11.  
  12. # Каталог со скриптом main.py
  13. MAIN_DIR    = 'F:/Python/WebScreen/'
  14.  
  15. # Файл с Excel таблицей
  16. EXEL_FILE   = MAIN_DIR+'assets/data/input.xlsx'
  17.  
  18. # Имя листа в Excel файле
  19. SHEET       = 'input'
  20.  
  21. # Директория сохранения скриншотов
  22. IMG_PATH    = MAIN_DIR+'assets/images/'
  23.  
  24. # Добавляет формат в конец файла
  25. IMG_END     = '.jpg'
  26.  
  27. # Полный путь к портативной версии браузера Firefox
  28. FFOX        = MAIN_DIR+'bin/Firefox64/firefox.exe'
  29.  
  30. # Полный путь к драйверу для работы браузера Firefox
  31. FFOX_DR     = MAIN_DIR+'bin/geckodriver.exe'
  1. wr_timer0 = time.time() # Старт программы
  2.  
  3. # Экземпляр браузера Firefox
  4. binary = FirefoxBinary(FFOX)
  5. # Драйвер для работы с Firefox
  6. driver = webdriver.Firefox(firefox_binary=binary, executable_path=FFOX_DR)
  7.  
  8.  
  9. # Функция создает уникальный идентификатор
  10. def getUID():
  11.     seed = random.getrandbits(32)
  12.     while True:
  13.        yield seed
  14.        seed += 1
  15.  
  16. # Есть ли данные о скриншоте
  17. def isData(s):
  18.     return bool(len(s)>5)
  19.  
  20. # Функция делает скриншот через браузер
  21. # принимает адрес страницы и путь сохранения для скриншота
  22. # хранит данные в формате PNG
  23. def getPageFullScreen(url, path):
  24.     driver.get(url) # передаем адрес в драйвер
  25.     el = driver.find_element_by_tag_name('body') # драйвер ищет элемент body
  26.     el.screenshot(path)    # сохраняет скриншот по указанному пути
  27.     # сохраняем
  28.     im = Image.open(path)
  29.     rgb_im = im.convert('RGB')  # Извлекаем RGB спектр
  30.     rgb_im.save(path)
  31.  
  32. # Функция учавствует в развязке
  33. def denouement(url, pts, index, index_max):
  34.     print('Ссылка ' + str(index) + ' из ' + str(index_max))
  35.     getPageFullScreen(url, pts)    # делаем скриншот сайта
  36.  
  37. # ------------------
  38.  
  39. # Читаем файл Excel
  40. cols = [0, 1, 2, 3];
  41. data = pandas.read_excel(EXEL_FILE, sheet_name=SHEET, header=None, usecols=cols)
  42.  
  43. #   Запишем содержимое в списки
  44. A1  = data[0].tolist() #   Индекс
  45. B1  = data[1].tolist() #   Название
  46. C1  = data[2].tolist() #   Ссылка
  47. D1  = data[3].tolist() #   Имена скринов
  48.  
  49.  
  50. # Создадим пустой список для записи пути к скринам
  51. DD1        = []        #   Имя и путь скрина
  52. ITEMS_SIZE = len(C1)   #   Получаем количество элементов
  53. UID        = getUID()  #   Уникальные значения
  54.  
  55. # ------------------
  56.  
  57. wr_timer1 = time.time()
  58. print('Начинаем читать. С момента запуска прошло секунд: ', wr_timer1-wr_timer0)
  59.  
  60.  
  61. for i in range(ITEMS_SIZE):
  62.     if C1[i]==C1[i]:
  63.         if not isData(str(D1[i])):
  64.             # Если скриншот не делали
  65.             id = next(UID) # Уникальный индекс
  66.             # формируем путь сохранения файла
  67.             IMG_PTS = IMG_PATH + str(id) + IMG_END
  68.             denouement(C1[i], IMG_PTS, i, ITEMS_SIZE)
  69.             # Добавляем путь скрина в список
  70.             DD1.append(IMG_PTS)
  71.             print('Новый скриншот сохранен: ' + IMG_PTS)
  72.         else:
  73.             # Если уже делали скриншот этой страницы
  74.             if UPD_SCREEN == 100:  # Делать скриншот повторно?
  75.                 denouement(C1[i], str(D1[i]), i, ITEMS_SIZE)
  76.                 # Добавляем путь скрина в список
  77.                 DD1.append(str(D1[i]))
  78.                 print('Скриншот ' + str(D1[i]) + ' был обновлен')
  79.             else: # Оставить без изменений если UPD_SCREEN != 100
  80.                 DD1.append(str(D1[i]))
  81.                 print('Скриншот этой страницы уже есть')
  82.     else:
  83.         # Если ссылка отсутствует в Excel
  84.         # Запишем пустоту в DD1, его длина должна быть равна ITEMS_SIZE
  85.         DD1.append('')
  86.         print('В этой строке нет адреса')
  87.  
  88.  
  89. # ----------
  90.  
  91.  
  92. wr_timer2 = time.time()    # Прочитали файл
  93. print('Прочитали. С момента чтения прошло секунд: ', wr_timer2-wr_timer1)
  94.  
  95. driver.quit()   # Закрываем браузер
  96.  
  97.  
  98.  
  99. # Убедимся что индексы списков равны - выводим в консоль
  100. print('D1 = ' + str(len(D1)),  'DD1 = ' + str(len(DD1)))
  101.  
  102. # Сохраним списки в DataFrame
  103. data_final = {'A': A1, 'B': B1, 'С': C1, 'D': DD1}
  104. data_frame = pandas.DataFrame(data=data_final)
  105.  
  106. # Сохраняем DataFrame в наш файл - это перезапишет исходный Excel файл
  107. data_frame.to_excel(EXEL_FILE, sheet_name=SHEET, index=False, header=None)
  108.  
  109. wr_timer3 = time.time()
  110. print('Успешно завершен. Время затрачено в секундах: ', wr_timer3-wr_timer0)
Структура проекта:
WebScreen\assets\data\input.xlsx - файл Excel
WebScreen\assets\images\ - сюда сохранять скрины
WebScreen\bin\Firefox64\ - portable версия лучшего (единственного) браузера в мире, ним делаем скрины
WebScreen\bin\geckodriver.exe - драйвер для работы браузера
WebScreen\main.py

P.S пустой файл Excel с активными столбцами A-номер строки , B-заголовок сайта, C-ссылка на нужную страницу сайта, D - равно 0, а по завершению скрипта ссылка на скриншот в вашей ФС

Реклама

Мы в соцсетях

vk tw tg yt gt