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

Web Scraping Python Tutorial – Как царапать данные с сайта

Автор оригинала: Mehul Mohan.

Python – это красивый язык для кода. Он имеет отличную экосистему упаковки, гораздо меньше шума, чем вы найдете на других языках, и это супер легко в использовании.

Python используется для ряда вещей, от анализа данных на серверное программирование. И один захватывающий использование Python является веб-соскоб.

В этой статье мы осмотрим, как использовать Python для Scraping. Мы также будем работать через полную практику в классе, поскольку мы продолжаем.

ПРИМЕЧАНИЕ. Мы будем соскабливать веб-страницу, которую я размещаю, поэтому мы можем смело изучить его соскоб. Многие компании не позволяют соскабливать свои веб-сайты, так что это хороший способ учиться. Просто убедитесь, что проверьте, прежде чем Scrape.

Введение в веб-класс

Если вы хотите, вы можете использовать Этот бесплатный класс Codedamn Это состоит из нескольких лабораторий, чтобы помочь вам изучить веб-соскреб. Это будет практичным практическим упражнением обучения на кодедамне, похоже на то, как вы узнаете на FreeCodeCamp.

В этом классе вы будете использовать эту страницу, чтобы проверить Scraping Web: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/

Этот класс состоит из 7 лабораторий, и вы решите лабораторию в каждой части этого блога. Мы будем использовать Python 3.8 + Beautifulsoup 4 для веб-соскоба.

Часть 1: Загрузка веб-страниц с «Запрос»

Это Ссылка на эту лабораторию Отказ

Запросы Модуль позволяет отправлять HTTP-запросы с помощью Python.

HTTP-запрос возвращает объект ответа со всеми данными ответа (контент, кодирование, состояние и т. Д.). Один пример получения HTML страницы:

import requests

res = requests.get('https://codedamn.com')

print(res.text)
print(res.status_code)

Прохождение требований:

  • Получить содержимое следующего URL, используя Запросы Модуль: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
  • Храните текстовый ответ (как показано выше) в переменной под названием текст
  • Храните код состояния (как показано выше) в переменной под названием статус
  • Печать TXT и Статус Использование Печать функция

Как только вы понимаете, что происходит в коде выше, это довольно просто пройти эту лабораторию. Вот решение этой лаборатории:

import requests

# Make a request to https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
# Store the result in 'res' variable
res = requests.get(
    'https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/')
txt = res.text
status = res.status_code

print(txt, status)
# print the result

Давайте перейдем к части 2 теперь, когда вы построите больше на вершине своего существующего кода.

Часть 2: Извлечение заголовок с Booksoup

Это Ссылка на эту лабораторию Отказ

В этом классе вы будете использовать библиотеку под названием Beautifulsoup в Python, чтобы сделать веб-соска. Некоторые функции, которые делают BeautifulSoup мощным решением:

  1. Он обеспечивает много простых методов и идиомы Pythonic для навигации, поиска и модификации дерева DOM. Не требует большого количества кода для записи приложения
  2. Красивый суп сидит на верхней части популярных парсеров Python, таких как LXML и HTML5Lib, позволяя вам попробовать различные стратегии анализа или скорость торговли для гибкости.

По сути, Beautifulsoup может проанализировать что-нибудь в Интернете, которую вы его даете.

Вот простой пример BeautifulSoup:

from bs4 import BeautifulSoup

page = requests.get("https://codedamn.com")
soup = BeautifulSoup(page.content, 'html.parser')
title = soup.title.text # gets you the text of the (...)

Прохождение требований:

  • Используйте Запросы Пакет, чтобы получить название URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
  • Используйте BeautifulSoup для хранения заголовка этой страницы в переменную под названием Заголовок страницы

Глядя на пример выше, вы можете увидеть, как только мы кормием Page.Content Внутри Beautifulsoup вы можете начать работать с парным деревом DOM очень питон. Решение для лаборатории было бы:

import requests
from bs4 import BeautifulSoup

# Make a request to https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract title of page
page_title = soup.title.text

# print the result
print(page_title)

Это была также простая лаборатория, где мы должны были изменить URL-адрес и распечатать название страницы. Этот код пройдет лабораторию.

Часть 3: суп-эд корпус и голова

Это Ссылка на эту лабораторию Отказ

В последней лаборатории вы видели, как вы можете извлечь Название со страницы. Это одинаково легко извлечь определенные разделы тоже.

Вы также видели, что вам нужно позвонить .text На них, чтобы получить строку, но вы можете распечатать их без звонка .text ТОО, и это даст вам полную разметку. Попробуйте запустить пример ниже:

import requests
from bs4 import BeautifulSoup

# Make a request
page = requests.get(
    "https://codedamn.com")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract title of page
page_title = soup.title.text

# Extract body of page
page_body = soup.body

# Extract head of page
page_head = soup.head

# print the result
print(page_body, page_head)

Давайте посмотрим, как вы можете извлечь Тело и голова разделы с ваших страниц.

Прохождение требований:

  • Повторите эксперимент с URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
  • Хранить заголовок страницы (без вызова .text) URL в Заголовок страницы
  • Хранить содержание тела (без вызова .Text) URL в Page_body
  • Хранить головной контент (без вызова .Text) URL в Страница_head

Когда вы пытаетесь распечатать Page_body или Страница_head Вы увидите, что те, которые напечатаны как Строки Отказ Но на самом деле, когда ты Печать (Тип страницы_body) Вы увидите, что это не строка, но работает нормально.

Решение этого примера будет простым, основанным на коде выше:

import requests
from bs4 import BeautifulSoup

# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract title of page
page_title = soup.title

# Extract body of page
page_body = soup.body

# Extract head of page
page_head = soup.head

# print the result
print(page_title, page_head)

Часть 4: Выберите с BaintheSoup

Это Ссылка на эту лабораторию Отказ

Теперь, когда вы изучили некоторые части Beautifulsoup, давайте посмотрим, как вы можете выбрать элементы DOM с помощью красивых методов.

Как только у вас есть суп Переменная (как предыдущие лаборатории), вы можете работать с .Выберите На этом представляется селектор CSS внутри BeautifulSoup. То есть вы можете добраться до дерева DOM, так как вы выберете элементы с CSS. Давайте посмотрим на пример:

import requests
from bs4 import BeautifulSoup

# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract first 

(...)

text first_h1 = soup.select('h1')[0].text

.Выберите Возвращает список всех элементов Python. Вот почему вы выбрали только первый элемент здесь с [0] индекс.

Прохождение требований:

  • Создать переменную all_h1_tags Отказ Установите его в пустой список.
  • Использовать .Выберите Чтобы выбрать все

    Теги и храните текст этих H1 внутри all_h1_tags список.
  • Создать переменную seventh_p_text и хранить текст 7-го P Элемент (индекс 6) внутри.

Решение этой лаборатории:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create all_h1_tags as empty list
all_h1_tags = []

# Set all_h1_tags to all h1 tags of the soup
for element in soup.select('h1'):
    all_h1_tags.append(element.text)

# Create seventh_p_text and set it to 7th p element text of the page
seventh_p_text = soup.select('p')[6].text

print(all_h1_tags, seventh_p_text)

Давайте продолжим.

Часть 5: Лучшие предметы соскобы прямо сейчас

Это Ссылка на эту лабораторию Отказ

Давайте пойдем вперед и извлечь верхние предметы, соскобы из URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/

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

Чтобы пройти этот вызов, позаботьтесь о следующих вещах:

  • Использовать .Выберите извлечь названия. (Подсказка: один селектор для названий продукта может быть A.Title )
  • Использовать .Выберите Чтобы извлечь метку счетчика обзора для этих названий продукта. (Подсказка: один селектор для обзоров может быть div.ratings ) Примечание: это полная метка (то есть | 2 отзыва ) И не просто номер. Создайте новый словарь в формате:
info = {
   "title": 'Asus AsusPro Adv...   '.strip(),
   "review": '2 reviews\n\n\n'.strip()
}
  • Обратите внимание, что вы используете полоса Метод удаления любых дополнительных новостей/пробелов у вас может быть на выходе. Это важно пройти эту лабораторию.
  • Добавьте этот словарь в списке под названием top_items.
  • Распечатайте этот список в конце

Есть несколько задач, которые будут выполнены в этой задаче. Давайте сначала посмотрим на решение и понять, что происходит:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
top_items = []

# Extract and store in top_items according to instructions on the left
products = soup.select('div.thumbnail')
for elem in products:
    title = elem.select('h4 > a.title')[0].text
    review_label = elem.select('div.ratings')[0].text
    info = {
        "title": title.strip(),
        "review": review_label.strip()
    }
    top_items.append(info)

print(top_items)

Обратите внимание, что это только одно из решений. Вы можете попробовать это по-другому. В этом решении:

  1. Прежде всего вы выбираете все Div.thumbnail Элементы, которые дают вам список отдельных продуктов
  2. Тогда вы переживаете их
  3. Потому что Выберите Позволяет вам цепотать над собой, вы можете использовать SELECT еще раз, чтобы получить заголовок.
  4. Обратите внимание, что поскольку вы бежите внутри цикла для Div.thumbnail Уже H4> A.Title Селектор даст вам только один результат внутри списка. Вы выбираете 0-й элемент этого списка и извлеките текст.
  5. Наконец, вы разбиваете любое дополнительное пробелование и добавьте его в свой список.

Простые правильно?

Часть 6: Извлечение ссылок

Это Ссылка на эту лабораторию Отказ

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

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

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
image_data = []

# Extract and store in top_items according to instructions on the left
images = soup.select('img')
for image in images:
    src = image.get('src')
    alt = image.get('alt')
    image_data.append({"src": src, "alt": alt})

print(image_data)

В этой лаборатории ваша задача – извлечь href атрибут ссылок со своими текст также. Убедитесь, что следующие вещи:

  • Вы должны создать список под названием all_links.
  • В этом списке храните всю ссылку на диктографию. Это должно быть в следующем формате:
info = {
   "href": "",
   "text": ""
}
  • Убедитесь, что ваш текст лишен любого пробела
  • Убедитесь, что вы проверяете, если ваш .text Нет, прежде чем звонить .Strip () в теме.
  • Храните все эти диктовы в all_links.
  • Распечатайте этот список в конце

Вы извлекаете значения атрибута так же, как вы извлеките значения из Dict, используя получить функция. Давайте посмотрим на решение этой лаборатории:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
all_links = []

# Extract and store in top_items according to instructions on the left
links = soup.select('a')
for ahref in links:
    text = ahref.text
    text = text.strip() if text is not None else ''

    href = ahref.get('href')
    href = href.strip() if href is not None else ''
    all_links.append({"href": href, "text": text})

print(all_links)

Здесь вы извлекаете href атрибут так же, как вы сделали в случае изображения. Единственное, что вы делаете, также проверяет, если это нет. Мы хотим установить его в пустую строку, в противном случае мы хотим разбить пробел.

Часть 7: Генерация CSV от данных

Это Ссылка на эту лабораторию Отказ

Наконец, давайте понять, как вы можете генерировать CSV из набора данных. Вы создадите CSV со следующими заголовками:

  1. наименование товара
  2. Цена
  3. Описание
  4. Отзывы
  5. Изображение продукта

Эти продукты расположены в Div.thumbnail Отказ Котел CSV приведен ниже:

import requests
from bs4 import BeautifulSoup
import csv
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

all_products = []

products = soup.select('div.thumbnail')
for product in products:
    # TODO: Work
    print("Work on product here")


keys = all_products[0].keys()

with open('products.csv', 'w', newline='') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(all_products)

Вы должны извлечь данные с сайта и генерировать этот CSV для трех продуктов.

Прохождение требований:

  • Название продукта – это белое пространство урезанная версия имени элемента (пример – Asus Asuspro Adv ..)
  • Цена – это пробел урезанный, но полный ценовой ярлык продукта (пример – $ 1101.83)
  • Описание The The WhiteSpace Trammed версия описания продукта (пример – Asus Asuspro Advanced Bu401la-Fa271g темно-серый, 14 “, Core I5-4210U, 4 ГБ, 128 ГБ SSD, Win7 Pro)
  • Отзывы пробел урезанные версии продукта (пример – 7 отзывов)
  • Изображение продукта – это URL (атрибут SRC) изображения для продукта (пример -/webscraper-python-codedAmn-classroom-website/cart2.png)
  • Название файла CSV должно быть Products.csv и должен храниться в том же каталоге, что и ваш Script.py файл

Давайте посмотрим на решение этой лаборатории:

import requests
from bs4 import BeautifulSoup
import csv
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
all_products = []

# Extract and store in top_items according to instructions on the left
products = soup.select('div.thumbnail')
for product in products:
    name = product.select('h4 > a')[0].text.strip()
    description = product.select('p.description')[0].text.strip()
    price = product.select('h4.price')[0].text.strip()
    reviews = product.select('div.ratings')[0].text.strip()
    image = product.select('img')[0].get('src')

    all_products.append({
        "name": name,
        "description": description,
        "price": price,
        "reviews": reviews,
        "image": image
    })


keys = all_products[0].keys()

with open('products.csv', 'w', newline='') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(all_products)

для Блок самый интересный здесь. Вы извлекаете все элементы и атрибуты из того, что вы узнали до сих пор во всех лабораториях.

Когда вы запускаете этот код, вы в конечном итоге с хорошим файлом CSV. И вот обо всех основах сеть, соскоб с красивой величиной!

Заключение

Я надеюсь, что этот интерактивный класс от Codedamn Помогите вам понять основы веб-соскабливания с Python.

Если вам понравился этот класс и этот блог, скажи мне об этом на моем Twitter и Instagram Отказ Хотел бы услышать обратную связь!