Рубрики
Без рубрики

Выскабливание сайта электронной коммерции с помощью BeautifulSoup

выскабливание сайта электронной коммерции с помощью beautifulsoup

Автор оригинала: Kayode Adechinan T. Salami.

Тематическое исследование

В этом руководстве вы узнаете, как очистить сайт электронной коммерции с помощью библиотеки BeautifulSoup python.

Что вам понадобится

Для этого урока вам понадобится полный образец веб-сайта электронной коммерции. Я связал образец веб-сайта электронной коммерции с полным исходным кодом учебника. Клонируйте репозиторий , откройте папку shop-cart и внутри нее выполните следующую команду. Он будет обслуживать содержимое папки.

  python -m http.server 8000

Откройте свой веб-браузер по следующему адресу: http://localhost:8000/products.html

FireShot Capture 9 - Twitter Bootstrap shopping cart - http___localhost_8000_products.html.png

Как завершить этот учебник

1. Установите запросы и библиотеку beautifulsoup:

  pip install requests
  pip install beautifulsoup4

2. Ваш первый парсинг с BeautifulSoup

  from bs4 import BeautifulSoup
  import requests
  page = requests.get("http://localhost:8000/products.html")
  soup = BeautifulSoup(page.content, 'html.parser')
  print(soup.prettify())

Здесь мы делаем http-запрос для получения URL-адреса, на котором размещена наша веб-страница электронной коммерции. Затем мы анализируем содержимое полученной страницы с помощью ‘html.parser’ , который входит в стандартную библиотеку Python. И, наконец, мы показываем html-код!.

3. Извлеките все продукты

Если вы посмотрите на html-код за веб-страницей списка продуктов, вы можете заметить, что все продукты завернуты в тег div с классом well well-small вот так:

  

Our Products

И каждый продукт построен так:

Итак, ключ здесь в том, что вы не можете очистить сайт, если не знаете, как он построен. Вы должны выяснить, как идут дела. Совет здесь заключается в том, чтобы щелкнуть правой кнопкой мыши на любой странице и выбрать опцию view page source . Вот и ты.

Теперь мы можем использовать метод find_all для поиска элементов по классу или идентификатору. В нашем случае мы ищем все элементы li с классом span4 .

  from bs4 import BeautifulSoup
  import requests
  page = requests.get("http://localhost:8000/products.html")
  soup = BeautifulSoup(page.content, 'html.parser')

  def retrieve_all_products():
      print(soup.find_all('li', class_='span4'))

  if __name__ == '__main__':
      retrieve_all_products()

Если вы запустите его, он должен вернуть список в качестве ответа.

4. Получите цену продукта

Теперь давайте получим цену одного продукта

  from bs4 import BeautifulSoup
  import requests
  page = requests.get("http://localhost:8000/products.html")
  soup = BeautifulSoup(page.content, 'html.parser')

  def retrive_first_product_price():
      all_products = soup.find_all('li', class_='span4')
      product_one = all_products[0]
      product_one_price = product_one.find("strong")
      print(product_one_price.get_text())
      print(product_one_price.get_text().strip().strip('$'))

  if __name__ == '__main__':
      retrive_first_product_price()

Во-первых, мы получаем все продукты. Затем мы берем результат и, исходя из этого, ищем цену. Этот находится внутри тега strong . Найдя цену, мы ее показываем. Мы также можем удалить символ$. Как видите, вы можете искать элемент на основе предыдущего результата поиска. В отличие от метода find_all , который возвращает list элементов или пустой список, метод find возвращает single элемент или None.

5. Создайте поддельный компаратор цен

Предположим, мы хотим сравнить наши продукты с их ценой в качестве критерия. Вот очень простой способ сделать это.

  from bs4 import BeautifulSoup
  import requests
  page = requests.get("http://localhost:8000/products.html")
  soup = BeautifulSoup(page.content, 'html.parser')
  
  def lazy_comparator():
    all_products = soup.find_all('li', class_='span4')
    products = {}
    for product in all_products:
        products[product.find("p").get_text().strip()] = product.find("strong").get_text().strip().strip('$')
    print (sorted([(v, k) for k, v in products.items()]))

  if __name__ == '__main__':
      lazy_comparator()

Вот несколько заметок. Получив весь продукт, мы помещаем каждый из них в словарь, а затем делаем фильтрацию.

Вот и все

Получите полный исходный код на github . Взгляните также на официальную документацию BeautifulSoup .