#python #web-scraping #beautifulsoup
#python #очистка веб-страниц #beautifulsoup
Вопрос:
Мой код для веб-скребка:
from bs4 import BeautifulSoup
import requests
url = "https://www.airtel.in/recharge-online?icid=header_new"
page = requests.get(url)
soup = BeautifulSoup(page.content, "lxml")
[i.text for i in soup.select(".fs-lg icn-rupee")]
URL, с которого я пытаюсь выполнить очистку, является: https://www.airtel.in/recharge-online?icid=header_new
(на веб-сайте провайдера указаны цены на тарифные планы)
Класс, который я пытаюсь очистить: «fs-lg icn-rupee», в котором хранится числовое значение цены
Также, второй, менее важный вопрос, возможно ли очистить все теги, имеющие класс «fs-lg», используя что-то вроде функции «.find_all()» (где очищаются теги, имеющие класс «fs-lg», а также те, которые имеют «fs-lg icn-rupee») или мне придется делать это с помощью отдельного вызова?
Вывод, который я получаю в данный момент:
[]
Моим желаемым результатом был бы класс и его содержимое, которые я хотел бы превратить в строку, используя «.get_text()» или что-то в этом роде, а затем сохранить это в .csv-файл для последующего использования.
Комментарии:
1. Если этот элемент загружается с помощью JavaScript после загрузки страницы, вам понадобится библиотека, подобная selenium, для выполнения JavaScript для создания этого элемента.
2. Привет, Carcigenicate, я действительно новичок во всем этом, так что вполне может быть, что мне следовало использовать selenium для выполнения JS (который, я помню, где-то видел в выводе, что js не был выполнен). Как бы вы посоветовали мне это сделать и какие базовые ресурсы вы бы порекомендовали, чтобы я мог больше узнать о selenium и о том, как его использовать в моем конкретном приложении?
Ответ №1:
Веб-сайт использует JavaScript, но requests
не поддерживает его. таким образом, мы можем использовать библиотеку типа Requests-HTML для очистки страницы.
Установите его с помощью pip install requests-html
.
Чтобы также выбрать класс fs-lg
, мы можем разделить CSS-селектор запятой ,
. Смотрите этот пример:
from requests_html import HTMLSession
from bs4 import BeautifulSoup
URL = "https://www.airtel.in/recharge-online?icid=header_new"
# Initialize an HTML Session
session = HTMLSession()
# Get the html content
response = session.get(URL)
# Execute JavaScript
response.html.render(sleep=3)
soup = BeautifulSoup(response.html.html, "lxml")
print([i.text for i in soup.select("p.fs-lg.icn-rupee, .fs-lg")])
Выводит:
['₹2498', '2GB', '365 Days', '₹1498', '24 GB', '365 Days', '₹698', '2GB', '84 Days', '₹598', '1.5GB', '84 Days', '₹558', '3GB', '56 Days', '₹449', '2GB', '56 Days', '₹399', '1.5GB', '56 Days', '₹398', '3GB', '28 Days', '₹379', '6GB', '84 Days', '₹349', '2GB', '28 Days', '₹298', '2GB', '28 Days', '₹289', '1.5GB', '28 Days', '₹279', '1.5GB', '28 Days', '₹249', '1.5GB', '28 Days', '₹219', '1GB', '28 Days', '₹199', '1GB', '24 Days', '₹179', '2GB', '28 Days', '₹149', '2GB', '28 Days', '₹129', '1GB', '24 Days', '₹19', '200 MB', '2 Days', '₹79', '200 MB', '28 Days', '₹49', '100 MB', '28 Days', '₹45', '0 MB', '28 Days', '₹401', '3 GB', '28 Days', '₹48', '3 GB', '28 Days', '₹5000', '₹4800', 'NA', '₹1000', '₹960', 'NA', '₹500', '₹480', 'NA', '₹100', '₹81.75', 'NA', '₹20', '₹14.95', 'NA', '₹10', '₹7.47', 'NA']
Редактировать с помощью Selenium: установите его с помощью pip install selenium
. Загрузите Chromedriver отсюда
from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep
URL = "https://www.airtel.in/recharge-online?icid=header_new"
driver = webdriver.Chrome(r"C:pathtochromedriver.exe")
driver.get(URL)
sleep(5)
soup = BeautifulSoup(driver.page_source, "lxml")
print([i.text for i in soup.select("p.fs-lg.icn-rupee, .fs-lg")])
driver.quit()
Комментарии:
1. Привет, Мендель, спасибо за информацию по части javascript, я не знал, что сайты могут так отличаться! Я попробовал ваш код, и, похоже, все еще появлялась какая-то ошибка во время выполнения: «Невозможно использовать HTMLSession в существующем цикле событий. Вместо этого используйте AsyncHTMLSession «, что я попытался сделать, хотя каким-то образом это тоже не решило проблему.. Хотелось бы знать, сделали ли вы что-то другое или я чего-то здесь не хватает..
2. Я проверил chrome driver, и это выглядит довольно схематично, особенно с учетом того факта, что я не использую виртуальные машины и в основном пишу в своей привилегированной учетной записи.. Возможно ли запустить этот код на jupyter без chromedriver, поскольку я запускал ваш предыдущий код с оболочкой python, и он работал нормально
3. можете ли вы сказать по опыту, насколько безопасным вы нашли chrome driver? Существуют ли какие-либо серьезные недостатки в его инфраструктуре, которые могут представлять определенные уязвимости для моей системы в случае, если каким-либо образом драйвер chrome будет скомпрометирован?
4. @SomilVarshney это с открытым исходным кодом. github.com/SeleniumHQ/selenium/tree/trunk/py
5. Я последовал вашему совету использовать Selenium, и, черт возьми, это работает отлично! Я даже могу настроить его так, чтобы он идеально подходил под то, что я хочу! Я не могу отблагодарить вас за ваше время и усилия!!!