#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. Вау, это намного больше, чем я надеялся. Большое вам спасибо!