Парсинг динамической таблицы

Мне нужно вытащить ссылки на видосы из картинок с сайта
https://www.piku.co.kr/w/rank/3ed2LS

Методом научного тыка обнаружил, что ссылки вроде как подгружаются с xhr-запроса https://www.piku.co.kr/w/rank/x.php?u=3ed2LS

Пытался получить get-запрос с помощью XMLHttpRequest, но, в итоге, получил CORS-ошибку.

введите сюда описание изображения

С selenium пытался нажимать на эти картинки, чтобы открыть проигрыватель, но он ругается на то, что таких объектов нет (AttributeError: 'list' object has no attribute 'click') (обращался к ним через xPath), пробовал такой трюк с ютубом, там все получилось:

введите сюда описание изображения

from selenium import webdriver

PATH = 'C:/Users/JonnyK/Desktop/files/parser/chromedriver.exe'

driver = webdriver.Chrome(PATH)
driver.get('https://www.piku.co.kr/w/rank/3ed2LS')
driver.implicitly_wait(10)
driver.find_elements_by_xpath("//*[@id='DataTables_Table_0']/tbody/tr[1]/td[2]/div").click()
driver.quit()

введите сюда описание изображения

PS Не одну неделю парюсь с решением этой задачи, поэтому очень сильно надеюсь на помощь знатоков...


Ответы (1 шт):

Автор решения: Jack_oS

Можно обойтись requests, без selenium:

import json
import requests

url = 'https://www.piku.co.kr/w/rank/x.php?u=3ed2LS'
# length - "с запасом", можно и 99999
payload = {'start': '0', 'length': '999', 'draw': '0'}

r = requests.post(url, data=payload)
res = json.loads(r.content)

количество элементов в ответе:

>>>len(res['data'])
790

т.е. все; и первый из них, для ознакомления:

>>> res['data'][0]
['1', "<div style='width:100%;height:100px;background-size:cover;background-position:center top;background-image:url(https://img.youtube.com/vi/Q_n3n819dGI/mqdefault.jpg)'></div>", '<strong data-no=3549717>Gachi Нурминский - Валим на Gay-PArty</strong>', '15.10', '78.24']

обработайте и запишите в удобную вам структуру:

data = []
for d in res['data']:
    image_url = d[1][d[1].find('(')+1:d[1].find(')')]
    data.append({
        'number': int(d[0]),
        'title': d[2][d[2].find('>')+1:d[2].rfind('<')],
        'image_url': image_url,
        'video_url': 'https://www.youtube.com/watch?v=' + image_url.replace('https://img.youtube.com/vi/', '').replace('/mqdefault.jpg', ''),
    })

в data будет список словарей с номером, заголовком и двумя ссылками:

>>> data
[
    {'number': 1, 'title': 'Gachi Нурминский - Валим на Gay-PArty', 'image_url': 'https://img.youtube.com/vi/Q_n3n819dGI/mqdefault.jpg', 'video_url': 'https://www.youtube.com/watch?v=Q_n3n819dGI'},
...
    {'number': 790, 'title': 'Мир похож на цветной луг ♂gachi remix♂ri', 'image_url': 'https://img.youtube.com/vi/yliWPQ1Z4-I/mqdefault.jpg', 'video_url': 'https://www.youtube.com/watch?v=yliWPQ1Z4-I'}
]
→ Ссылка