-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript_v2.py
More file actions
159 lines (142 loc) · 13.1 KB
/
script_v2.py
File metadata and controls
159 lines (142 loc) · 13.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import time
import random
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Настройки
FORM_URL = "https://docs.google.com/forms/d/e/1FAIpQLScF1o40ojRPFdZp40yGOamiTdNzz9Ma5ExvuOtPdNBBM1G5fw/viewform"
OUTPUT_FILE = "answers_log.csv"
DELAY_BETWEEN_ACTIONS = 0.1
# Ввод от пользователя
num_respondents = int(input("Сколько респондентов вы хотите сгенерировать? "))
def wait_and_click(driver, xpath):
print(f"[INFO] Поиск и клик по xpath: {xpath}")
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath)))
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element)
element.click()
time.sleep(DELAY_BETWEEN_ACTIONS)
def find_question_block_by_heading(driver, heading_text):
print(f"[DEBUG] Поиск блока вопроса с заголовком: {heading_text}")
return WebDriverWait(driver, 10).until(
EC.presence_of_element_located((
By.XPATH,
f"//span[@class='M7eMe' and normalize-space(text())='{heading_text}']/ancestor::div[contains(@class,'Qr7Oae')]"
))
)
def wait_and_click_in_question(driver, heading_text, value):
block = find_question_block_by_heading(driver, heading_text)
element = block.find_element(By.XPATH, f".//div[@data-value='{value}']")
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element)
element.click()
time.sleep(DELAY_BETWEEN_ACTIONS)
def click_checkbox_in_question(driver, heading_text, label_text):
block = find_question_block_by_heading(driver, heading_text)
checkbox = block.find_element(By.XPATH, f".//div[@role='checkbox' and @aria-label='{label_text}']")
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", checkbox)
checkbox.click()
time.sleep(DELAY_BETWEEN_ACTIONS)
def generate_profile():
profile_type = random.choices(["спортсмен_активист", "спортсмен_обычный", "не_спортсмен"], weights=[40, 35, 25])[0]
age = random.choice([18, 19, 20, 21, 22])
gender = random.choice(["Мужской", "Женский"])
university = random.choice(["РГУ", "РГРТУ", "РязГМУ", "РГАТУ", "Рязанский филиал Мосполитеха"])
if age == 18:
course = 1
elif age == 19:
course = random.choice(["1", "2"])
elif age == 20:
course = random.choice(["2", "3"])
elif age == 21:
course = random.choice(["3", "4"])
elif age == 22:
course = random.choice(["4", "5"])
else:
course = None
does_sport = "Да" if profile_type.startswith("спортсмен") else "Нет"
return {
"age": age,
"gender": gender,
"university": university,
"course": course,
"does_sport": does_sport,
"profile_type": profile_type
}
def save_to_csv(profile, index):
header = ["ID", "Возраст", "Пол", "Университет", "Курс", "Занимается спортом", "Тип профиля"]
row = [index, profile["age"], profile["gender"], profile["university"], profile["course"], profile["does_sport"], profile["profile_type"]]
try:
with open(OUTPUT_FILE, "x", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerow(row)
except FileExistsError:
with open(OUTPUT_FILE, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(row)
def fill_form(driver, profile):
driver.get(FORM_URL)
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//form")))
time.sleep(2)
wait_and_click_in_question(driver, "1. Укажите ваш возраст:", str(profile['age']))
wait_and_click_in_question(driver, "2. Укажите ваш пол:", profile['gender'])
wait_and_click_in_question(driver, "3. Укажите ваш университет:", profile['university'])
wait_and_click_in_question(driver, "4. Укажите курс обучения:", profile['course'])
wait_and_click_in_question(driver, "5. Регулярно ли вы занимаетесь спортом (хотя бы 2 раза в неделю)?", profile['does_sport'])
wait_and_click(driver, "//span[text()='Далее']/ancestor::div[@role='button']")
time.sleep(2)
if profile["does_sport"] == "Да":
fill_sport_branch(driver, profile["profile_type"])
else:
fill_no_sport_branch(driver, profile["profile_type"])
wait_and_click(driver, "//span[text()='Отправить']/ancestor::div[@role='button']")
def fill_sport_branch(driver, profile_type):
wait_and_click_in_question(driver, "6. Как вы оцениваете уровень своей социализации в университете?", "Полностью социализирован" if profile_type == "спортсмен_активист" else "В целом хорошо, но есть трудности")
for val in random.sample(["Дисциплина", "Саморазвитие", "Успешность", "Общение", "Лидерство", "Независимость"], 3):
click_checkbox_in_question(driver, "7. Какие ценности вы считаете для себя наиболее важными в студенческой жизни? (Можно выбрать до 3)", val)
wait_and_click_in_question(driver, "8. Насколько активно вы участвуете в жизни студенческого сообщества?", random.choice(["Активно", "Скорее активно"] if profile_type == "спортсмен_активист" else ["Скорее активно", "Скорее не активно"]))
wait_and_click_in_question(driver, "9. Чувствуете ли вы развитие личных качеств во время учёбы в университете?", random.choice(["Да, однозначно", "Отчасти"]))
wait_and_click_in_question(driver, "10. Насколько вы удовлетворены уровнем своего взаимодействия с другими студентами?", random.choice(["Полностью удовлетворен", "Скорее да"]))
wait_and_click_in_question(driver, "11. Какое влияние, по вашему мнению, спорт оказывает на уровень социализации студентов?", "Способствует укреплению социальных связей")
wait_and_click_in_question(driver, "12. Влияет ли спорт на вашу уверенность в себе и своих силах?", random.choice(["Значительно", "Незначительно"]))
for val in random.sample(["Снимать стресс", "Поддерживать здоровье", "Находить друзей", "Всё перечисленное"], random.randint(2, 4)):
click_checkbox_in_question(driver, "13. Спорт помогает вам:", val)
wait_and_click_in_question(driver, "14. Влияют ли тренировки на вашу учебную успеваемость?", random.choice(["Положительно", "Нейтрально"]))
wait_and_click_in_question(driver, "15. Как часто вы участвуете в спортивных мероприятиях вуза?", random.choice(["Регулярно", "Иногда"]))
for val in random.sample(["Командные виды спорта (футбол, баскетбол и др.)", "Индивидуальные виды спорта (бег, плавание, йога и др.)", "Фитнес, тренажерный зал", "Танцы"], random.randint(1, 3)):
click_checkbox_in_question(driver, "16. Какой вид физической активности Вы предпочитаете? (можно выбрать несколько вариантов)", val)
wait_and_click_in_question(driver, "17. Как часто вы взаимодействуете с людьми из других учебных групп или факультетов благодаря занятиям спортом?", random.choice(["Очень часто", "Иногда"]))
for val in random.sample(["Работа в команде", "Лидерские качества", "Навыки общения и сотрудничества", "Преодоление трудностей и стрессовых ситуаций"], random.randint(2, 4)):
click_checkbox_in_question(driver, "18. Какие из следующих социальных навыков вы развиваете благодаря занятиям спортом?", val)
def fill_no_sport_branch(driver, profile_type):
wait_and_click_in_question(driver, "6. Как вы оцениваете уровень своей социализации в университете?", "В целом хорошо, но есть трудности" if profile_type == "не_спортсмен" else "Слабо социализирован")
for val in random.sample(["Дисциплина", "Саморазвитие", "Успешность", "Общение", "Лидерство", "Независимость"], 3):
click_checkbox_in_question(driver, "7. Какие ценности вы считаете для себя наиболее важными в студенческой жизни? (Можно выбрать до 3)", val)
wait_and_click_in_question(driver, "8. Насколько активно вы участвуете в жизни студенческого сообщества?", random.choice(["Скорее не активно", "Не участвую"] if profile_type == "не_спортсмен" else ["Скорее активно"]))
wait_and_click_in_question(driver, "9. Чувствуете ли вы развитие личных качеств во время учёбы в университете?", random.choice(["Да, однозначно", "Отчасти", "Нет"]))
wait_and_click_in_question(driver, "10. Насколько вы удовлетворены уровнем своего взаимодействия с другими студентами?", random.choice(["Полностью удовлетворен", "Скорее да", "Скорее нет"]))
wait_and_click_in_question(driver, "11. Какое влияние, по вашему мнению, спорт оказывает на уровень социализации студентов?", random.choice(["Способствует укреплению социальных связей", "Не влияет на социализацию"]))
for val in random.sample(["Нет времени", "Нет интереса", "Проблемы со здоровьем", "Финансовые трудности"], random.randint(1, 3)):
click_checkbox_in_question(driver, "12. Что мешает вам заниматься спортом регулярно?", val)
wait_and_click_in_question(driver, "13. Считаете ли вы занятия спортом важным элементом социализации?", random.choice(["Да", "Возможно", "Нет"]))
for val in random.sample(["Волонтерство", "Творческие объединения", "Онлайн-общение", "Никакие"], random.randint(1, 3)):
click_checkbox_in_question(driver, "14. Какие формы активности помогают вам общаться с другими студентами?", val)
wait_and_click_in_question(driver, "15. Считаете ли вы, что отсутствие спорта ограничивает ваш личностный рост?", random.choice(["Да", "Нет", "Не думал об этом"]))
for val in random.sample(["Нехватка времени", "Финансовые трудности", "Отсутствие интереса", "Плохая спортивная инфраструктура"], random.randint(1, 3)):
click_checkbox_in_question(driver, "16. Какие факторы мешают Вам заниматься спортом?", val)
wait_and_click_in_question(driver, "17. Хотели бы вы заниматься спортом, если бы были созданы комфортные условия?", random.choice(["Да", "Не уверен", "Нет"]))
# Запуск Chrome
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
service = Service()
driver = webdriver.Chrome(service=service, options=chrome_options)
# Основной цикл
for i in range(1, num_respondents + 1):
profile = generate_profile()
fill_form(driver, profile)
save_to_csv(profile, i)
print("Заполнение завершено.")
driver.quit()