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

Web Scraping в Python – Как соскрести веб-сайт электронной коммерции, используя красивый суп и Pandas

Автор оригинала: Manthan Koolwal.

В этом посте мы собираемся соскребать веб-сайт электронной коммерции. Мы попадем в каждую отдельную страницу продукта и извлечь нашу информацию оттуда. Это Сайт Мы собираемся царапать – это интернет-магазин, который продает виски.

Не забудьте проверить Robots.txt Файл перед соскобом любого сайта. Вы должны иметь в виду, что вы можете излишне принести веб-сайт вниз и может навредить их услугам. Итак, пожалуйста, не наводните свои серверы с помощью записку.

Я пошел на подраздел сайта здесь, и похоже, что есть довольно много вариантов. И если вы хотите узнать, что рейтинги пользователей для каждого продукта, вы должны открыть каждую страницу продукта, чтобы получить рейтинги (вы не можете найти их на главной странице).

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

Но у некоторых из них нет рейтинга. Вместо этого в этих случаях мы перейдем к каждому продукту и получим О текст тоже. Пошли!

Наша настройка довольно проста. Просто создайте папку и установите красивый суп, Pandas и запросы. Чтобы создать папку и установить библиотеки, введите команды, приведенные ниже. Я предполагаю, что вы уже установили Python 3.x.

mkdir scraper 
pip install beautifulsoup4 
pip install requests
pip install pandas

Теперь создайте файл внутри этой папки и назовите его все, что вам нравится. Я использую имя Scraper.py Отказ Мы собираемся в импорт запросы, Pandas и BS4.

import requests
from bs4 import BeautifulSoup
import pandas as pd

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

Кроме того, мы отправим пользовательский агент в каждом HTTP-запросе, потому что если вы сделаете запрос на получение Запросы Затем по умолчанию пользовательский агент является Python который может быть заблокирован.

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

baseurl = "https://www.thewhiskyexchange.com"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

Теперь нам нужно исследовать страницу, чтобы мы могли выяснить, где есть ссылки и как мы собираемся получить их. Вы должны открыть инструменты Chrome DEV, используя ISPECT (команда + опция + C).

Мы напишем скрипт, чтобы пройти каждый из них и создать URL для нас. Для этого нам нужно сначала сделать HTTP Call. Тогда мы извлеким Ли Элемент с использованием красивыхsoup.

k = requests.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky').text
soup=BeautifulSoup(k,'html.parser')
productlist = soup.find_all("li",{"class":"product-grid__item"})
print(productlist)

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

Далее получите HTML для предметов на этой странице. Теперь внутри каждого из этих списков есть ссылка на отдельную страницу продукта. Мы напишем скрипт, чтобы соскрести все эти ссылки от Производитель Отказ

productlinks = []
for product in productlist:
        link = product.find("a",{"class":"product-card"}).get('href')                 productlinks.append(baseurl + link)

Сначала мы объявили пустой список под названием ПродуктыЛинки. Тогда мы использовали для петли добраться до каждого Производитель элемент для извлечения ссылки. Мы использовали .get () функция, чтобы получить значение Атрибут Href Отказ После извлечения ссылки мы храним каждую ссылку внутри списка ПродуктыЛинки. Поскольку мы должны создать законный URL-адрес, мы добавили BaseURL на ссылку.

Как мы обсуждали ранее, мы должны покрыть все пять страниц сайта. Для этого мы представим A для цикла, прежде чем сделать HTTP Call. Поскольку есть 5 страниц, мы запускаем петлю от 1 до 6. Кроме того, обязательно измените целевой URL.

productlinks = []
for x in range(1,6):  
 k = requests.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky?pg={}&psize=24&sort=pasc'.format(x)).text  
 soup=BeautifulSoup(k,'html.parser')  
 productlist = soup.find_all("li",{"class":"product-grid__item"})
 
    for product in productlist:
        link = product.find("a",{"class":"product-card"}).get('href')
        productlinks.append(baseurl + link)

Это даст нам все ссылки, доступные на сайте. Теперь, чтобы подтвердить, вы можете распечатать длину ПродуктыLinks Отказ Мы должны получить 97 ссылок в общей сложности.

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

Далее мы собираемся проанализировать рисунок, в которой информация отображается на странице продукта. Мы извлеким название, цену, рейтинги и о тексте.

Имя находится под H1 Tag , О Текст под div tag, цена находится под P Tag и Рейтинг находится под метка охвата Отказ Теперь давайте извлечь их.

data=[]
for link in productlinks:
    f = requests.get(link,headers=headers).text
    hun=BeautifulSoup(f,'html.parser')

    try:
        price=hun.find("p",{"class":"product-action__price"}).text.replace('\n',"")
    except:
        price = None

    try:
        about=hun.find("div",{"class":"product-main__description"}).text.replace('\n',"")
    except:
        about=None

    try:
        rating = hun.find("div",{"class":"review-overview"}).text.replace('\n',"")
    except:
        rating=None

    try:
        name=hun.find("h1",{"class":"product-main__name"}).text.replace('\n',"")
    except:
        name=None

    whisky = {"name":name,"price":price,"rating":rating,"about":about}

    data.append(whisky)

Здесь вещи довольно просты. Мы начали для цикла, чтобы повторить все отдельные ссылки ПродуктыЛинки. Мы сделаем http получить звонок каждому ссылка а затем извлечь Цена, Название, Рейтинг и О текст.

Мы используем попробуйте и кроме Чтобы избежать любых ошибок, если какой-либо элемент не найден. Используйте заменить Функция для удаления всех разрывов линии или ненужные строки, которые мы ладим с извлеченной информацией.

Мы создали словарь с именем виски Где мы будем хранить всю извлеченную информацию. В самом конце мы храним словарь внутри списка данные Отказ

Теперь перед печатью данных мы собираемся сделать данные более презентабельными. Здесь мы будем использовать панды. Я люблю использовать панды!

df = pd.DataFrame(data)

print(df)

Вот полный код для скребка

import requests
from bs4 import BeautifulSoup
import pandas as pd

baseurl = "https://www.thewhiskyexchange.com"

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
productlinks = []
t={}
data=[]
c=0
for x in range(1,6):
    k = requests.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky?pg={}&psize=24&sort=pasc'.format(x)).text
    soup=BeautifulSoup(k,'html.parser')
    productlist = soup.find_all("li",{"class":"product-grid__item"})


    for product in productlist:
        link = product.find("a",{"class":"product-card"}).get('href')
        productlinks.append(baseurl + link)


for link in productlinks:
    f = requests.get(link,headers=headers).text
    hun=BeautifulSoup(f,'html.parser')

    try:
        price=hun.find("p",{"class":"product-action__price"}).text.replace('\n',"")
    except:
        price = None

    try:
        about=hun.find("div",{"class":"product-main__description"}).text.replace('\n',"")
    except:
        about=None

    try:
        rating = hun.find("div",{"class":"review-overview"}).text.replace('\n',"")
    except:
        rating=None

    try:
        name=hun.find("h1",{"class":"product-main__name"}).text.replace('\n',"")
    except:
        name=None

    whisky = {"name":name,"price":price,"rating":rating,"about":about}

    data.append(whisky)
    c=c+1
    print("completed",c)

df = pd.DataFrame(data)

print(df)

Заключение

Наконец, нам удалось соскрести всю информацию с каждой страницы веб-сайта. Точно так же вы можете соскребать другой текст с этого сайта. Как упражнение, вы можете попробовать соскоб этого Сайт Отказ Если у вас есть какие-либо вопросы для меня, пожалуйста, у меня мне Twitter ручка Отказ