Web - парсинг — это метод извлечения данных, используемый исключительно для сбора данных с веб-сайтов. Он широко применяется для интеллектуального анализа данных или сбора ценной информации с крупных веб-сайтов. Веб-парсинг также полезен для личного использования. В Python есть замечательная библиотека под названием BeautifulSoup , которая позволяет выполнять веб-парсинг. Мы будем использовать её для сбора информации о товарах и сохранения данных в файл CSV.
В этой статье необходимы следующие предварительные условия.
url.txt: текстовый файл с несколькими URL-адресами страниц товаров Amazon для парсинга
Идентификатор элемента: нам нужны идентификаторы объектов, которые мы хотим извлечь из Интернета. Скоро мы это обсудим…
Вот как выглядит наш текстовый файл.
Необходимый модуль и установка:
BeautifulSoup: наш основной модуль содержит метод для доступа к веб-странице по протоколу HTTP.
pip install bs4
lxml: вспомогательная библиотека для обработки веб-страниц на языке Python.
pip install lxml
requests: делают процесс отправки HTTP-запросов безупречным. вывод функции
pip install requests
Подход:
- Сначала мы собираемся импортировать необходимые нам библиотеки.
- Затем мы возьмем URL, хранящийся в нашем текстовом файле.
- Мы передадим URL-адрес нашему объекту-супу, который затем извлечёт нужную информацию из указанного URL-адреса
на основе предоставленного нами идентификатора элемента и сохранит её в нашем CSV-файле.
Давайте посмотрим на код и увидим, что происходит на каждом важном этапе.
Шаг 1: Инициализация нашей программы.
Мы импортируем beautifulsoup и запросы, создаем/открываем CSV-файл для сохранения собранных данных. Мы объявили заголовок и добавили пользовательский агент. Это гарантирует, что целевой сайт, с которого мы будем собирать данные, не будет считать трафик нашей программы спамом и не заблокирует его.
from bs4 import BeautifulSoup
import requests
File = open("out.csv", "a")
HEADERS = ({'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/44.0.2403.157 Safari/537.36',
'Accept-Language': 'en-US, en;q=0.5'})
webpage = requests.get(URL, headers=HEADERS)
soup = BeautifulSoup(webpage.content, "lxml")
Шаг 2: Получение идентификаторов элементов.
Мы определяем элементы, просматривая отображаемые веб-страницы, чего нельзя сказать о нашем скрипте. Чтобы определить целевой элемент, мы получим его идентификатор и передадим его скрипту.
Получить идентификатор элемента довольно просто. Предположим, мне нужен идентификатор элемента с названием продукта. Всё, что мне нужно сделать, — это
- Перейдите по URL-адресу и просмотрите текст
- В консоли мы берем текст рядом с id =
Мы передаём его в функцию soup.find и преобразуем вывод функции в строку. Мы удаляем запятые из строки, чтобы они не мешали формату записи CSV.
try:
title = soup.find("span",
attrs={"id": 'productTitle'})
title_value = title.string
title_string = title_value
.strip().replace(',', '')
except AttributeError:
title_string = "NA"
print("product Title = ", title_string)
Шаг 3: Сохранение текущей информации в текстовый файл
Мы используем наш объект файла и записываем только что полученную строку, завершая её запятой «,», чтобы разделить столбцы при интерпретации в формате CSV.
File.write(f"{title_string},")
Выполните описанные выше 2 шага для всех атрибутов, которые вы хотите получить из Интернета,
например, цена товара, наличие и т. д.
Шаг 4: Закрытие файла.
File.write(f"{available},\n")
# closing the file
File.close()
При вводе последней части информации обратите внимание, что мы добавляем «\n» для перехода на новую строку. Если этого не сделать, вся необходимая информация будет записана в одну очень длинную строку. Мы закрываем файл с помощью File.close(). Это необходимо, иначе при следующем открытии файла может возникнуть ошибка.
Шаг 5: Вызов функции, которую мы только что создали.
if __name__ == '__main__':
# opening our url file to access URLs
file = open("url.txt", "r")
# iterating over the urls
for links in file.readlines():
main(links)
Мы открываем файл url.txt в режиме чтения и перебираем каждую его строку, пока не дойдём до последней. Вызываем основную функцию для каждой строки.
Вот как выглядит весь наш код:
# importing libraries
from bs4 import BeautifulSoup
import requests
def main(URL):
# opening our output file in append mode
File = open("out.csv", "a")
# specifying user agent, You can use other user agents
# available on the internet
HEADERS = ({'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/44.0.2403.157 Safari/537.36',
'Accept-Language': 'en-US, en;q=0.5'})
# Making the HTTP Request
webpage = requests.get(URL, headers=HEADERS)
# Creating the Soup Object containing all data
soup = BeautifulSoup(webpage.content, "lxml")
# retrieving product title
try:
# Outer Tag Object
title = soup.find("span",
attrs={"id": 'productTitle'})
# Inner NavigableString Object
title_value = title.string
# Title as a string value
title_string = title_value.strip().replace(',', '')
except AttributeError:
title_string = "NA"
print("product Title = ", title_string)
# saving the title in the file
File.write(f"{title_string},")
# retrieving price
try:
price = soup.find(
"span", attrs={'id': 'priceblock_ourprice'})
.string.strip().replace(',', '')
# we are omitting unnecessary spaces
# and commas form our string
except AttributeError:
price = "NA"
print("Products price = ", price)
# saving
File.write(f"{price},")
# retrieving product rating
try:
rating = soup.find("i", attrs={
'class': 'a-icon a-icon-star a-star-4-5'})
.string.strip().replace(',', '')
except AttributeError:
try:
rating = soup.find(
"span", attrs={'class': 'a-icon-alt'})
.string.strip().replace(',', '')
except:
rating = "NA"
print("Overall rating = ", rating)
File.write(f"{rating},")
try:
review_count = soup.find(
"span", attrs={'id': 'acrCustomerReviewText'})
.string.strip().replace(',', '')
except AttributeError:
review_count = "NA"
print("Total reviews = ", review_count)
File.write(f"{review_count},")
# print availablility status
try:
available = soup.find("div", attrs={'id': 'availability'})
available = available.find("span")
.string.strip().replace(',', '')
except AttributeError:
available = "NA"
print("Availability = ", available)
# saving the availability and closing the line
File.write(f"{available},\n")
# closing the file
File.close()
if __name__ == '__main__':
# opening our url file to access URLs
file = open("url.txt", "r")
# iterating over the urls
for links in file.readlines():
main(links)
Вывод:
Название продукта = 3D-принтер Dremel DigiLab 3D40 Flex с дополнительными принадлежностями, 30 планами уроков, курс профессионального развития, гибкая монтажная пластина, автоматическое 9-точечное выравнивание, совместимость с ПК и MAC OS, Chromebook, iPad
Цена продукта = 1699,00 долларов США
Общая оценка = 4,1 из 5 звезд
Общее количество отзывов = 40 оценок
Наличие = В наличии.
Название продукта = 3D-принтер Comgrow Creality Ender 3 Pro со съемной пластиной для сборки и сертифицированным UL блоком питания 220x220x250 мм
Цена продукта = NA
Общая оценка = 4,6 из 5 звезд
Всего отзывов = 2509 оценок
Наличие = NA
Название продукта = Конструктор идей для 3D-принтера Dremel Digilab 3D20 для начинающих любителей и мастериц
Цена продукта = $ 679,00
Общая оценка = 4,5 из 5 звезд
Всего отзывов = 584 оценки
Наличие = В наличии .
Название продукта = 3D-принтер Dremel DigiLab 3D45, отмеченный наградами, с нитью накаливания, совместимый с ПК и MAC OS, Chromebook, iPad, сетевой, со встроенной HD-камерой, нагревательной платформой, нейлоновой, ECO, ABS, PETG, PLA, возможностью печати
Цена продукта = 1710,81 $
Общая оценка = 4,5 из 5 звезд
Общее количество отзывов = 351 оценка
Наличие = В наличии.
Вот как выглядит наш файл out.csv.