Как очистить данные, доступные после событий кликов

#python #web-scraping #hidden

#python #веб-очистка #скрыто

Вопрос:

Я могу открыть HTML-страницу, но не уверен, как получить доступ к текстовым данным, скрытым под нажатием кнопки, поскольку данных нигде нет в источнике страницы.

 from requests import get

URL = 'https://melvyl.on.worldcat.org/oclc/1076548274'
step1 = get(URL)

print(steps.text)
# how do I navigate to `Check Availability`?
 

Я хотел бы получить данные, которые отображаются в интерактивном режиме, когда вы нажимаете Check Availability рядом с тем местом, где написано Библиотеки Калифорнийского университета в Беркли. Откроется окно, содержащее номер вызова, который я ищу (например, «DT157.675 .M37 2019«).

Ответ №1:

Когда вы отслеживаете сетевой трафик [в вашем браузере перейдите в Дополнительные инструменты> Инструменты разработчика> Сеть или нажмите Ctrl Shift I в браузере Chrome и выберите Сеть и фильтр XHR ], вы увидите, что при нажатии Check Availability браузер отправляет запрос get на другой URL для получения данных.

 from requests import get
from bs4 import BeautifulSoup

# Monitor Post Requests
id_ = 5689
URL = f'https://melvyl.on.worldcat.org/ajax/availabilityFulfillment/oclc/1076548274/registryId/{id_}'
params = {'editionclusteroclcnumbers': 1076548274}

response = get(URL, params=params)

soup = BeautifulSoup(response.text, 'html.parser')
class_name = "availability_call_number_cell availability_left_hand_cell"
results = soup.find('td', class_=class_name).get_text(strip=True)

print(results)
#'DT157.675 .M37 2019'
 

Пример
введите описание изображения здесь

Пробуя разные места, кажется, единственное, что меняется id_ . Если вы знаете идентификаторы, мы можем собрать все данные с помощью цикла:

 
# Monitor Post Requests

# Lets get all ids

URL = 'https://melvyl.on.worldcat.org/ajax/availabilityFulfillment/oclc/1076548274'
params = {'editionClusterOclcNumbers': '1076548274,1130899029,1126209791'}
response = get(URL, params=params)
soup = BeautifulSoup(response.text, 'html.parser')
id_s = [item['id'].split('_')[-2] for item in soup.find_all("button", {"title":"Check Availability"})]

# get data for all ids
data = []
class_name = "availability_call_number_cell availability_left_hand_cell"
for id_ in id_s:
 
    URL= f'https://melvyl.on.worldcat.org/ajax/availabilityFulfillment/oclc/1076548274/registryId/{id_}'
    params = {'editionclusteroclcnumbers': 1076548274}

    response = get(URL, params=params)

    soup = BeautifulSoup(response.text, 'html.parser')
    
    data.append(soup.find('td', class_=class_name).get_text(strip=True))
    
print(data)
 

Комментарии:

1. Вау, это намного больше, чем я надеялся. Большое вам спасибо!