из импорта запросов получить | |
импорт ре, html, json, os, sys | |
, если «termux» в sys.prefix: | |
попытка: | |
os.system(«termux-setup-storage») | |
кроме: | |
проход | |
каталог = «/sdcard/OK-RU» | |
иначе: | |
дир = «ОК-РУ» | |
попытка: | |
os. mkdir(дир) | |
кроме: | |
проход | |
класс ОкРуДл: | |
по определению __init__(я,видео_url): | |
self.url = видео_url | |
определяющих размеров (я, размер): | |
для x в [‘B’, ‘KB’, ‘MB’, ‘GB’, ‘TB’]: | |
, если размер < 1024.0: | |
возврат «%3.1f %s» % (размер, x) | |
Размер | /= 1024,0 |
размер возврата | |
def getb(self,frame_url,title): | |
х = получить (frame_url) | |
xx = открыть (f»{dir}/{название}. mp4″,»ab») | |
xx.write(x.content) | |
вернуть x.content | |
@свойство | |
загрузка по умолчанию (самостоятельно): | |
bb = bytearray() | |
r = get(self.url,headers={«User-agent»:»Mozilla/5.0 (Linux; Android 9; Redmi Note 5A) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36 «}) | |
v = re.search(r’data\-video\=\»(.*?)\»‘,r.text).group(1) | |
данные = json.loads(html.unescape(v)) | |
video_title = данные[«videoName»]. replace(«.»,»_»).replace(«/»,»_») | |
print(f»\nПодготовка к загрузке \033[92m{video_title}\033[0m») | |
URL-адрес = данные[«videoSrc»] | |
v = get(url,headers={«User-agent»:»Mozilla/5.0 (Linux; Android 9; Redmi Note 5A) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36″} ) | |
w = re.findall(r’http[s]:\/\/.*?\/video\/’,v.text) | |
х = получить(ш[0]).текст | |
y = re.findall(r'[(САМЫЙ НИЗКИЙ)|(СРЕДНИЙ)|(ВЫСОКИЙ)].*?.ts’,x) | |
кадров = [] | |
print(«Начало. ..») | |
для рамы в y: | |
b = self.getb(w[0]+frame,video_title) | |
бб += б | |
кадров.добавить(кадр) | |
print(f»\rПрогресс загрузки: \033[92m{round((len(frames)/len(y))*100)}%\033[0m [\033[92m{self.sizes(len(bb))}\033[0m]..»,end =»», флеш = Истина) | |
print(f»\nВидео успешно загружено.\nВидео сохранено в \033[92m{dir}/{video_title}.mp4\033[0m\nДля другой программы: \033[92mhttps://karjokpangesty.blogspot.com\033 [0м») | |
, если __name__==’__main__’: | |
os. система(«очистить») | |
print(f»»»\033[0m | |
_ | |
___ | | __ _ __ _ _ | |
/ _ \| |/ / | ‘__| | | | | |
| (_) | <_| | | |_| | | |
\___/|_|\_(_)_| \__,_| | |
\033[92mVideo Downloader \033[0m|\033[92m Karjok Pangesty\033[0m | |
«»») | |
urlz = input(«\033[92mok.ru URL видео: \033[0m») | |
# urlz = re. search(«http[s]\:\/\/[m\.]+ok\.ru»,url) | |
, если URL-адрес: | |
ок = OkRuDl(urlz) | |
ок.загрузить | |
иначе: | |
печать(«Неверный URL-адрес!») |
для получения ссылок с веб-сайта ok.ru с поисковым запросом из файла excel с использованием python selenium
Я не могу получить несколько ссылок на видео с ok.ru, используя код ниже:
из веб-драйвера импорта селена из selenium.webdriver.common.by импорт импортировать openpyxl # Настройте параметры Chrome параметры = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') # Настроить драйвер Chrome драйвер = webdriver.Chrome(опции=опции) # Перейдите на ok. ru driver.get('https://ok.ru') # Принять куки # cookies_button = driver.find_element(By.CSS_SELECTOR, 'div#hook_Block_CookieNotifier button.cookie-settings__submit') # cookies_button.click() # Авторизоваться username_input = driver.find_element(By.CSS_SELECTOR, 'input[name="st.email"]') password_input = driver.find_element(By.CSS_SELECTOR, 'input[name="st.password"]') login_button = driver.find_element(By.CSS_SELECTOR, 'input.button-pro[type="submit"]') username_input.send_keys('[email protected]') password_input.send_keys('Пароль') логин_кнопка.щелчок() # Чтение данных из входного файла input_file = 'input_file.xlsx' output_file = 'ok_links.xlsx' рабочая книга = openpyxl.load_workbook (входной_файл) рабочий лист = рабочая книга.активный max_row = рабочий лист.max_row # Настраиваем выходной файл output_workbook = openpyxl.Workbook() output_worksheet = output_workbook.active # Перебираем строки во входном файле для строки в диапазоне (1, max_row + 1): запрос = рабочий лист.ячейка (строка = строка, столбец = 1). значение если запрос не None: print(f"Поиск {запроса}") search_box = driver.find_element(By.CSS_SELECTOR, 'input[name="st.query"]') search_box.clear() search_box.send_keys(запрос) search_box.submit() # Извлеките результаты поиска видео video_links = driver.find_elements(By.XPATH, '//*[@id="hook_Block_SearchMRB"]/portal-search/div/div[1]/div[2]/div[2]/div[1]/h3 ') print(f"Найдено всего {len(video_links)} видео") # Добавляем результаты поиска видео в лист результатов для ссылки в video_links: title_element = link.find_element(By.XPATH, '//*[@id="hook_Block_SearchMRB"]/portal-search/div/div[1]/div[2]/div[2]/div[1]/h3 ') заголовок = элемент_заголовка.текст URL-адрес = ссылка.get_attribute("href") output_worksheet.append([запрос, заголовок, URL-адрес]) print(f"Добавлена ссылка: {название} ({url})") # Сохранить выходной файл output_workbook. save (выходной_файл) # Очистить водитель.выйти()
Он работает нормально для одной ссылки, но я хочу получить все ссылки под результатами поиска.
Кажется, я указал неправильный xpath. Любая помощь, которую я могу получить, чтобы решить эту проблему, очень ценится.
- python
- selenium-webdriver
- просмотр веб-страниц
В определении title_element
вы используете
, так как вы хотите ограничить поиск внутри ссылка
. Но этого мало, надо еще добавить точку .
перед xpath:
.//*[@id="hook_Block_SearchMRB"]/portal-search/div/div[1]/div[2]/div[2]/div[1]/h3
Помните
-
//div
находит div во всех html -
.//div
находит div, которые являются потомками текущего узла
Более того
-
.//
находит потомков текущего узла -
.