Соскоб javascript стол со свитком с использованием селена - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь очистить таблицу, которая генерируется с помощью javascript, но я изо всех сил. Пока мой код:

driver = webdriver.Chrome();

driver.get("https://af.ktnlandscapes.com/")

# get table -- first wait for table to fully load
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//*[@id='list-view']/tbody/tr")))
table = driver.find_element_by_xpath("//*[@id='list-view']")

# get rows
rows = table.find_elements_by_xpath("tbody/tr")

# iterate rows and get cells
for row in rows:

    # get cells
    print (row.get_attribute("listing"))

Я хочу очистить числа "перечисление =" в таблице. Я не уверен, как извлечь номера из списка, и я изо всех сил пытаюсь понять, как заставить страницу открывать остальные строки таблицы, поскольку они загружаются, только когда вы немного прокручиваете таблицу вниз.

I am interested in these listing numbers

Ответы [ 2 ]

4 голосов
/ 21 января 2020

Попробуйте использовать следующий код:

driver = webdriver.Chrome()
driver.get("https://af.ktnlandscapes.com/")

# get table -- first wait for table to fully load
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//*[@id='list-view']/tbody/tr")))
table = driver.find_element_by_xpath("//*[@id='list-view']")

get_number = 0
while True:
    count = get_number
    rows = table.find_elements_by_xpath("tbody/tr[@class='list-view-listing']")
    driver.execute_script("arguments[0].scrollIntoView();", rows[-1])  # scroll to last row
    get_number = len(rows)
    print(get_number)
    time.sleep(1)
    if get_number == count:
        break

Вывод:

20
40
60
80
100
120
140
160
180
200
220
240
260
280
300
320
339
339

На самом деле в веб-консоли запрашивается 339 строк. enter image description here

2 голосов
/ 21 января 2020

Это, вероятно, проще сделать с помощью requests. Если вы просматриваете страницу в Chrome / Firefox, когда прокручиваете область списка, она отправляет GET-запросы на дополнительные данные. Конечная точка: /list-view-load.php?landscape_id=31&landscape_nid=33192&region=All&category=All&subcategory=All&search=&custom1=&custom2=&custom3=&custom4=&custom5=&offset=20, смещение увеличивается на 20 для каждого запроса.

Вы можете имитировать это с помощью:

import requests
from lxml import html

sess = requests.Session()
url = ('https://af.ktnlandscapes.com/sites/all/themes/landscape_tools/functions'
       '/list-view-load.php?landscape_id=31&landscape_nid=33192&region=All&'
       'category=All&subcategory=All&search=&custom1=&custom2=&custom3=&'
       'custom4=&custom5=&offset={offset}')

gets = []
for i in range(50):
    data = sess.get(url.format(offset=20*i)).json().get('data')
    if not data:
        break
    gets.append(data)
    print(f'\rfinished request {i}', end='')
else:
    print('There is more data!! Increase the range.')

listings = []
for g in gets:
    h = html.fromstring(g)
    listings.extend(h.xpath('tr/@listing'))

print('Number of listings:', len(listings))
# prints:
Number of listings: 339

listings
# returns
['91323', '91528', '91282', '91529', '91572', '91356', '91400', '91445',
 '91373', '91375', '91488', '91283', '91294', '91324', '91423', '91325',
 '91475', '91415', '91382', '91530', '91573', '91295', '91326', '91424',
 ...
 '91568', '91592', '91613', '91569', '91593', '91594', '91570', '91352',
 '91414', '91486', '91353', '91304', '91311', '91354', '91399', '91602',
 '91571', '91610', '103911']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...