Очистка таблицы с разбивкой на страницы с тем же URL-адресом

Я пытаюсь очистить таблицу с разбивкой на страницы из «https://tariffs.ib-net.org/sites/IBNET/TariffTable#», где URL-адрес остается одинаковым для всех страниц.

Я уже обращался к страницам ниже за помощью, но не смог найти решение -

https://stackoverflow.com/questions/70180819/scrape-a-table-data-from-a-paginated-webpage-where-the-url-does-not-change-but-t

https://stackoverflow.com/questions/42635015/using-selenium-to-scrape-a-table-across-multiple-pages-when-the-url-doesnt-chan

https://stackoverflow.com/questions/73362475/using-selenium-to-scrape-paginated-table-data-python

https://stackoverflow.com/questions/75479097/scrape-multiple-pages-with-the-same-url-using-python-selenium

Из раздела «Очистка динамической таблицы данных многих страниц, но с одним и тем же URL-адресом» было интересно узнать, что мы можем извлечь файл json, но я понятия не имею, как это сделать.

Любая помощь будет оценена,

Мои испытания:

Код 1:

from lxml import html
import requests
import pandas as pd
import re
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from openpyxl import load_workbook
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
#from .actions.wheel_input import ScrollOrigin
from win32com.client import Dispatch
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
import urllib
import requests

options = Options()
# options.add_argument('--headless')
#options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(options=options)

url = 'https://tariffs.ib-net.org/sites/IBNET/TariffTable#'
driver.get(url)
time.sleep(10)
wait = WebDriverWait(driver, 10)
x=driver.find_element(By.XPATH,'//*[@id = "datatab_length"]/label/select')
drop=Select(x)

drop.select_by_visible_text("100")
time.sleep(10)

table = wait.until(EC.presence_of_element_located((By.XPATH, "//table[@class='table table-striped table-hover table-bordered dataTable no-footer dtr-inline collapsed']")))

#utility=[]
#city=[]
#service=[]
#date=[]
#fifteenm3=[]
#fiftym3 = []
#hundredm3 = []
data_list=[]
while True:
    # Extract data from the current page
    rows = table.find_elements(By.XPATH, "//table[@class='table table-striped table-hover table-bordered dataTable no-footer dtr-inline collapsed']//tbody")
    
    for row in rows:
        columns = row.find_elements(By.TAG_NAME, "tr")
        data_list.append([col.text.strip() for col in columns])
        print(data_list)
        next_button = driver.find_element(By.XPATH, "//*[@class='paginate_button next']/a")
        if next_button:
             # Click the next page button
            next_button.click()
            time.sleep(10)
            continue
        else:
            break 

Код 2:

from lxml import html
import requests
import pandas as pd
import re
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from openpyxl import load_workbook
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from win32com.client import Dispatch
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
import urllib
import requests


options = webdriver.ChromeOptions() 
options.add_argument('--start-maximized')
options.add_argument("disable-gpu")
browser = webdriver.Chrome()
browser.maximize_window()
actions=ActionChains(browser)
browser.get("https://tariffs.ib-net.org/sites/IBNET/TariffTable#")
time.sleep(5)

table_header= browser.find_elements(By.XPATH,"//table[@id='datatab']/thead")
header_row = []
for header in table_header:
    header_row.append(header.text)
#print(header_row)

utility=[]
city=[]
service=[]
date=[]
fifteenm3=[]
fiftym3=[]
hundredm3=[]

while True:
    all_rows = browser.find_elements(By.XPATH,"//div[@class='row']//tbody")
    for index in range(len(all_rows)):
        all_columns = all_rows[index].find_elements(By.XPATH,"//*[@role='row']")
        utility.append(all_columns[0].text)
        print(utility)
        city.append(all_columns[1].text)
        print(city)
        service.append(all_columns[2].text)
        print(service)
        date.append(all_columns[3].text)
        print(date)
        fifteenm3.append(all_columns[4].text)
        print(fifteenm3)
        fiftym3.append(all_columns[5].text)
        print(fiftym3)
        hundredm3.append(all_columns[6].text)
        print(hundredm3)
    if browser.find_element(By.XPATH,"//*[@class='paginate_button next']/a"):
        browser.find_element(By.XPATH,"//*[@class='paginate_button next']/a").click()
        time.sleep(5)
        continue
    else:
        break
        
df=pd.DataFrame()
df['Utlity']=utility
df['service']=service
df['city']=city
df['date']=date
df['15m3']=fifteenm3
df['50m3']=fiftym3
df['100m3']=hundredm3

df.to_csv('data.csv')

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь применим ответ, упомянутый в разделе Очистка динамической таблицы данных многих страниц, но с одним и тем же URL-адресом. На высоком уровне, чтобы получить точный URL-адрес и значения, вот что вам нужно сделать:

  1. Перейдите на вкладку «Сеть» в консоли разработчика. Очистить все текущие журналы.
  2. Нажмите на следующую страницу таблицы на веб-странице и на вкладке сети найдите запрос, отправленный браузером.
  3. Щелкните правой кнопкой мыши запрос и скопируйте его как fetch или скручивание (как вы предпочитаете).
  4. Теперь, когда у вас есть запрос вместе с информацией о его заголовке, перейдите к своему коду и вставьте запрос (конечно, вам придется преобразовать запрос для использования библиотек, доступных на вашем языке).
  5. Измените параметры запроса, чтобы получить желаемое поведение. В этом случае, если длина параметра достаточно велика, вы должны получить все данные. Если это слишком медленно или ненадежно, вы можете получать записи пакетами по 100, повторяя попытки страниц, которые приводят к отброшенным запросам.

Вот код Python для запроса из моего браузера: https://pym.dev/p/2ueeq/. Вы можете упростить это, потому что большую часть этой информации не требуется отправлять.

Я не знаком с вашим уровнем знаний в области инструментов разработки, поэтому, если вы застряли на каком-либо/всех этапах здесь, давайте обсудим это в комментариях под этим ответом.

Вы случайно не сгенерировали этот ответ с помощью ChatGPT или другого ИИ? Очень похоже.

Barry the Platipus 03.06.2024 11:00

@Shraiysh - Большое спасибо за помощь. Он работает до нескольких страниц, а затем выдает ошибку ниже. Я попытался уменьшить длину до 99, а также увеличить ее до 1000, но через несколько страниц это прекратилось. ``` ----------------------------------------------- -------------‌​--------------- KeyError Traceback (последний вызов) Cell In[78], строка 117 115 else: 116 print(f"Успех для start = {start}") --> 117 all_entries.append((response.json()['data'])) 119 print(len(all_entries)) KeyError: 'data' ```

r_sh_07 03.06.2024 12:43

Нет, @BarrythePlatipus — это был только я. Не знаю, как доказать, что я точно не робот и не использовал никакой ИИ для написания этого :)

Shraiysh 03.06.2024 18:51

@r_sh_07 точно, через сколько страниц? Если вы в некоторой степени знакомы с кодированием на Python, вы сможете это отладить - кажется, что ответ на какой бы итерации ни застревал - ответ не содержит данных. Вероятно, вам нужно зарегистрировать json и проверить, почему.

Shraiysh 03.06.2024 18:55

На самом деле нет данных, превышающих 16000 записей, так что все хорошо. Большое спасибо за помощь @Shraiysh

r_sh_07 05.06.2024 05:10

Другие вопросы по теме