красивый суп не возвращает ничего, когда элемент существует в браузере

#python #web-scraping #beautifulsoup

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

Вопрос:

Я просмотрел предыдущие ответы, но ни один из них не показался применимым. Я создаю скребок quizlet с открытым исходным кодом для извлечения всех ссылок из класса (например https://quizlet.com/class/3675834 /). В этом случае тегом является a, а классом является «UILink». Но когда я использую следующий код, возвращаемый список не содержит элемента, который я ищу. Это из-за проблемы JavaScript, описанной здесь?

Я попытался использовать предыдущий метод импорта папки, как написано здесь, но он не содержит URL-адресов.

Как я могу очистить эти URL-адреса?

 import requests
from bs4 import BeautifulSoup

headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
}
url = 'https://quizlet.com/class/8536895/'

response = requests.get(url, verify=False, headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
b = soup.find_all("a", class_="UILink")

  

Ответ №1:

Вы не сможете напрямую очищать динамические веб-страницы, используя just requests . То, что вы видите в браузере, — это полностью отображаемая страница, обработанная браузером.

Чтобы очистить данные с таких веб-страниц, вы должны следовать любому из приведенных ниже подходов.

  1. Используйте requests-html вместо requests

    запросы на установку pip-html

scraper.py

 from requests_html import HTMLSession
from bs4 import BeautifulSoup 

session = HTMLSession()

url = 'https://quizlet.com/class/8536895/' 

response = session.get(url)
response.html.render()  # render the webpage

# access html page source with html.html
soup = BeautifulSoup(response.html.html, 'html.parser') 

b = soup.find_all("a", class_="UILink")

print(len(b))
  

Примечание: для рендеринга страницы используется безголовый браузер (chromium) под капотом. Поэтому он может время от времени прерываться или быть немного медленным.

  1. Используйте selenium webdriver

Используется driver.get(url) для получения страницы и передачи источника страницы в beautiful Soup с driver.page_source

Примечание: запустите это и в безголовом режиме, и иногда может быть некоторая задержка.