Веб-очистка таблицы объектов "onclick" на веб-сайте с python - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь очистить данные для этой ссылки: страница .

Если вы нажмете стрелку вверх, вы заметите выделенные дни в разделах месяца. При нажатии на выделенный день появится таблица с инициированными тендерами на этот день. Все, что мне нужно сделать, это получить данные в каждой таблице за каждый выделенный день в календаре. Может быть один или несколько тендеров (максимум до 7) в день.

Таблица появляется при клике

Я выполнил некоторые операции по просмотру веб-страниц с помощью bs4, однако я думаю, что это работа для селена (пожалуйста, поправьте меня, если я ошибаюсь), с которой я не очень хорошо знаком.

До сих пор мне удалось найти элемент стрелки по XPATH для навигации по календарю и покажи мне больше месяцев После этого я пытаюсь щелкнуть в случайный день (в приведенном ниже коде, который я щелкнул 30.03.2020), в котором объект html с именем: "таблица тендеров клонирован" появляется в html при проверке. Имя объекта остается неизменным независимо от того, в какой день вы щелкнете.

Сейчас я довольно застрял, пытался выбрать итеративно и / или напечатать то, что находится внутри этой таблицы объектов, оно либо говорит, что объект не повторяется или Нет .

from selenium import webdriver

chrome_path = r"C:\Users\<name>\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

driver.get("http://www.ibex.bg/bg/данни-за-пазара/централизиран-пазар-за-двустранни-договори/търговски-календар/")
driver.find_element_by_xpath("""//*[@id="content"]/div[3]/div/div[1]/div/i""").click()
driver.find_element_by_xpath("""//*[@id="content"]/div[3]/div/div[2]/div[1]/div[3]/table/tbody/tr[6]/td[1]""").click()

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

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Что ж, я вижу, что нет смысла использовать selenium для такого случая, поскольку это замедлит вашу задачу.

Сайт загружен событием JavaScript, которое динамически отображает данные после загрузки страницы. .

requests библиотека не сможет отображать JavaScript на лету. так что вы можете использовать selenium или requests_html. и действительно, есть много модулей, которые могут сделать это.

Теперь у нас есть еще одна опция в таблице, чтобы отследить, откуда данные отображаются. Мне удалось найти запрос XHR , который используется для извлечения данных из back-end API и их рендеринга на стороне пользователя.

Вы можете получить XHR запрос по открытому Developer-Tools и проверке сети и проверке XHR/JS запросов, сделанных в зависимости от типа вызова, таких как fetch

import requests
import json

data = {
    'from': '2020-1-01',
    'to': '2020-3-01'
}


def main(url):
    r = requests.post(url, data=data).json()
    print(json.dumps(r, indent=4)) # to see it in nice format.
    print(r.keys())


main("http://www.ibex.bg/ajax/tenders_ajax.php")

Потому что я просто ленивый кодер: я сделаю это так:

import requests
import re
import pandas as pd
import ast
from datetime import datetime

data = {
    'from': '2020-1-01',
    'to': '2020-3-01'
}


def main(url):
    r = requests.post(url, data=data).json()
    matches = set(re.findall(r"tender_date': '([^']*)'", str(r)))
    sort = (sorted(matches, key=lambda k: datetime.strptime(k, '%d.%m.%Y')))
    print(f"Available Dates: {sort}")
    opa = re.findall(r"({\'id.*?})", str(r))
    convert = [ast.literal_eval(x) for x in opa]
    df = pd.DataFrame(convert)
    print(df)
    df.to_csv("data.csv", index=False)


main("http://www.ibex.bg/ajax/tenders_ajax.php")

Вывод: view-online

enter image description here

0 голосов
/ 02 апреля 2020

Пожалуйста, попробуйте следующее решение

driver.maximize_window()
wait = WebDriverWait(driver, 20)  


elemnt=wait.until(EC.presence_of_element_located((By.XPATH, "//body/div[@id='wrapper']/div[@id='content']/div[@class='tenders']/div[@class='form-group']/div[1]/div[1]//i")))
    elemnt.click()
    elemnt1=wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='form-group']//div[1]//div[3]//table[1]//tbody[1]//tr[6]//td[1]")))
    elemnt1.click()
    lists=wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='tenders-table cloned']")))
    for element in lists:
         print element.text
...