Guest User

Untitled

a guest
Dec 14th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.38 KB | None | 0 0
  1. import time
  2. import logging
  3. import random
  4. import string
  5. from mysql.connector import MySQLConnection
  6. from selenium.webdriver.common.by import By
  7. from selenium.webdriver.support.ui import WebDriverWait
  8. from selenium.webdriver.support import expected_conditions as EC
  9. from selenium import webdriver
  10. from selenium.common.exceptions import *
  11. import re
  12. import unittest
  13.  
  14. db_bd = "test"
  15. db_user = "root"
  16. db_password = ""
  17. db_host = "localhost"
  18.  
  19. log = logging.getLogger(__name__)
  20. format = '%(asctime)s %(levelname)s:%(message)s'
  21. logging.basicConfig(format=format, level=logging.INFO)
  22.  
  23. url_main = "http://tereshkova.test.kavichki.com/"
  24. time_waiting_item = 5 #Время ожидание появления элемента
  25.  
  26.  
  27. #Функция генерации случайной строки, только ASCII
  28. def random_string(size, type):
  29. types = ("name", "count", "price")
  30. if type in types:
  31. if(type == "name"):
  32. chars = string.ascii_lowercase
  33. else:
  34. chars = string.digits
  35. return ''.join(random.choice(chars) for _ in range(size))
  36. else:
  37. log.info("Вы не правильно указали тип генерируемой строки для. Должно быть name, count или price. Конец программы.")
  38. exit(8)
  39.  
  40.  
  41.  
  42. #Функция отправки запроса к базе данных
  43. def query_database(sql_query, data, type):
  44. types = ("insert", "select")
  45. if type in types:
  46. try:
  47. conn = MySQLConnection(user=db_user, password=db_password, host=db_host, database=db_bd)
  48. conn.autocommit = True
  49. cursor = conn.cursor()
  50. try:
  51. cursor.execute(sql_query, data)
  52. if(type == "insert"):
  53. # Возврат идентификатора добавленной строки
  54. return cursor.lastrowid
  55. elif(type == "select"):
  56. # Возврат кортеж значения запроса
  57. rows = cursor.fetchall()
  58. return rows
  59. except Exception as e:
  60. log.info("Ошибка запроса: %s. Конец программы", e)
  61. exit(6)
  62. finally:
  63. cursor.close()
  64. conn.close()
  65. except Exception as e:
  66. log.info("Ошибка подключения к базе данных: %s. Конец программы", e)
  67. exit(6)
  68.  
  69. else:
  70. log.info("Вы не правильно указали тип SQL - запроса. Должно быть select или insert. Конец программы.")
  71. exit(5)
  72.  
  73.  
  74. #Инициализация driver
  75. def init_driver():
  76. ff = "../install/chromedriver.exe"
  77. chrome_option = webdriver.ChromeOptions()
  78. # chrome_option.add_argument("headless") #Режим headless
  79. prefs = {"profile.managed_default_content_settings.images": 2} #Настройка, которая отключает загрузку изображений
  80. chrome_option.add_experimental_option("prefs", prefs)
  81. try:
  82. return webdriver.Chrome(executable_path=ff, options=chrome_option)
  83. except SessionNotCreatedException:
  84. print("Ошибка инициализации браузера. Скорее всего у вас не установлен браузер. Пожалуйста обратитесь к разработчику парсера")
  85.  
  86. #Парсинг товаров на сайте
  87. def parse(driver):
  88. rows = []
  89. try:
  90. table = driver.find_element_by_id("tbl")
  91. except NoSuchElementException:
  92. print("Элемент не найден. Конец программы")
  93. exit(3)
  94. #Нахождение записей в таблице на сайте
  95. tr_list = table.find_elements_by_css_selector('tbody > tr')
  96. if(len(tr_list) == 0):
  97. print("Элементы tr не найдены. Конец программы")
  98. exit(4)
  99. for tr in tr_list:
  100. td_list = tr.find_elements_by_css_selector('td')
  101. if(len(td_list) != 4):
  102. print("Количество элементов td не соответствует 4. Возможно поменялась разметка. Конец программы")
  103. exit(5)
  104. name = td_list[0].text.strip()
  105. count = td_list[1].text.strip()
  106. price = td_list[2].text.strip()
  107. temp = []
  108. temp.append(name)
  109. temp.append(count)
  110. temp.append(price)
  111. log.info("Товар: %s, количество: %s, цена: %s", name, count, price)
  112.  
  113. rows.append(temp)
  114. print(rows)
  115. return rows
  116.  
  117. #Функция добавления новых товаров на сайте
  118. def add_new_purchase_site(driver, cound_add):
  119. add_list = []
  120. for count in range(cound_add):
  121. try:
  122. #Кнопка добавление новой записи на сайте
  123. a_id_open = driver.find_element_by_id("open")
  124. a_id_open.click()
  125. except NoSuchElementException:
  126. print("Элемент не найден. Конец программы")
  127. exit(7)
  128. try:
  129. div_class_new = WebDriverWait(driver, time_waiting_item).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#new")))
  130. except TimeoutException:
  131. log.info("Элемент div с id = new не найден. Увеличьте время ожидание появления элемента в переменной time_waiting_item или проверьте разметку. Конец программы")
  132. exit(8)
  133. try:
  134. input_id_name = div_class_new.find_element_by_id("name")
  135. except NoSuchElementException:
  136. log.info("Элемент input с id = name не найден. Конец программы")
  137. exit(9)
  138.  
  139. #Вводим случайную строку в поле с длинной строки = 5
  140. name = random_string(5, "name")
  141. input_id_name.send_keys(name)
  142.  
  143. try:
  144. input_id_count = div_class_new.find_element_by_id("count")
  145. except NoSuchElementException:
  146. log.info("Элемент input с id = count не найден. Конец программы")
  147. exit(10)
  148. # Вводим случайную строку в поле с длинной строки = 2
  149. count = random_string(2, "count")
  150. input_id_count.send_keys(count)
  151.  
  152. try:
  153. input_id_price = div_class_new.find_element_by_id("price")
  154. except NoSuchElementException:
  155. log.info("Элемент input с id = price не найден. Конец программы")
  156. exit(11)
  157. # Вводим случайную строку в поле с длинной строки = 2
  158. price = random_string(2, "price")
  159. input_id_price.send_keys(price)
  160. time.sleep(5)
  161. try:
  162. input_id_add = div_class_new.find_element_by_id("add").click()
  163. except NoSuchElementException:
  164. log.info("Элемент input с id = add не найден. Конец программы")
  165. exit(12)
  166. add_list.append([name, count, price])
  167. #Очистка Input-ов
  168. input_id_name.clear()
  169. input_id_count.clear()
  170. input_id_price.clear()
  171.  
  172. return add_list
  173.  
  174. #Метод определяющий разница двух многомерных списков
  175. def different_list(list1, list2):
  176. #list2 > list1
  177. # diff=[x for x in list1 if x not in [y for y in list2]]
  178. diff = [x for x in list1 if x[0] not in [y[0] for y in list2]]
  179. return diff
  180.  
  181. def main(url):
  182. # Проверка на некорретность ссылок
  183. text_search = re.search("^http", url)
  184. if (text_search == None):
  185. log.info("Ссылка %s некорректна. Конец программы", url)
  186. exit(1)
  187.  
  188. log.info("Запуск браузера")
  189. driver = init_driver()
  190.  
  191. log.info("Переход на %s", url)
  192. try:
  193. driver.get(url)
  194. except Exception as e:
  195. print("Ошибка перехода. Конец программы", e) # Не отслеживается
  196. exit(2)
  197.  
  198. #Получаем список с сайта
  199. rows_table = parse(driver)
  200.  
  201. # Добавление в базу данных
  202. for row in rows_table:
  203. sql_query = "INSERT INTO purchase(name, count, price) VALUES (%s, %s, %s)"
  204. query_database(sql_query, row, "insert")
  205.  
  206. list_add_in_table_site = add_new_purchase_site(driver, 4)
  207.  
  208. #Получаем записи из БД
  209. sql_query = "SELECT name, count, price FROM purchase"
  210. set_in_database = query_database(sql_query, None, "select")
  211.  
  212. log.info("------------------------Повторный парсинг страницы-----------")
  213. list_purchase_in_table_site = parse(driver)
  214. print(list_add_in_table_site)
  215. print(list_purchase_in_table_site)
  216. print(set_in_database)
  217. print("Отсутствуют в базе данных:", different_list(list_purchase_in_table_site, list_add_in_table_site))
  218. print("Имеются и в базе данных и на сайте", different_list(list_add_in_table_site, list(set_in_database)))
  219. time.sleep(1000)
  220. driver.close()
  221.  
  222. if __name__ == '__main__':
  223. start = time.time()
  224. unittest.main()
  225. main(url_main)
  226. log.info("Время работы: %s", time.time() - start)
Add Comment
Please, Sign In to add comment