Парсер сайта rusplitka.ru

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Python:
from bs4 import BeautifulSoup
import bs4
import requests
import html.parser
import pdb
import logging
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)

def html_get():
    with open("index.html", "w", encoding='utf-8') as f:
        htmll = requests.get("https://www.rusplitka.ru/catalog/plitka-dlya-vannoj/")
        f.write(htmll.text)
        f.close()
def name_produkt():
    logging.info('Start script')
    html_get()
    with open("index.html", 'r', encoding='utf-8') as f:
        contents = f.read()
        f.close()
        for soup in BeautifulSoup(contents,features="html.parser").find_all("div", class_="description-block" ):
            for soups in soup.find_all("a", class_='title'):
                colektion = "https://www.rusplitka.ru"+soups.get('href')
                f = open('colection.txt', 'a')
                f.write(colektion)
                f.close()
                # logging.info('%s ', colektion)
                html = requests.get(colektion).text
                for a in BeautifulSoup(html, features="html.parser").find('div', class_="plitka grid").find('div', class_='item col-lg-2 col-sm-3').find('div', class_='wrap').find('div', class_='row').find('div', class_='col-sm-6').find_all('a'):
                    link = a.get('href')
                    logging.info('%s ', link)
                    f = open("links.txt", 'a+')
                    i = 1
                    while i < 2:
                        i = i + 1
                        f.write("https://www.rusplitka.ru"+link+ '\n')
print(name_produkt())
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('stop script')
Доброго времени суток ;)
Я пишу парсер характеристики с сайта rusplitka.ru, мне нужно спарсить характеристику продукта со всех колекций.
Я написал этот скрипт, но он не закончен так как я с толкнулся с проблемой.
Мне нужно сначало спарсить ссылки на продукт пример для этого я с колекции подробно парсю по div а потом из a вытаскиваю href.
Скрипт мне выдает сначало 4 ссылки потом выдает ошибку.

2020-08-01 10:57:51,822 - Start script
2020-08-01 10:57:53,795 - /products/lb-ceramics/ornella-8109/plitka-nastennaya-ornella-ornella-bezh-5032-0203-24524/
2020-08-01 10:57:54,482 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-plain-bianco-111641/
2020-08-01 10:57:55,111 - /products/ape-ceramicas/arts-1-16261/keramogranit-arts-trendy-mix-20-107717/
2020-08-01 10:57:55,914 - /products/arcana/stracciatella-15141/keramogranit-stracciatella-guba-20x20-8025-97792/
Traceback (most recent call last):
File "d:/PARS-site/pars.py", line 36, in <module>
print(name_produkt())
File "d:/PARS-site/pars.py", line 28, in name_produkt
for a in BeautifulSoup(html, features="html.parser").find('div', class_="plitka grid").find('div', class_='item col-lg-2 col-sm-3').find('div', class_='wrap').find('div', class_='row').find('div', class_='col-sm-6').find_all('a'):
AttributeError: 'NoneType' object has no attribute 'find'


Спасибо за помощь



Good day ;) I am writing a parser characteristics from the site rusplitka.ru, I need to parse the characteristics of a product from all collections. I wrote this script, but it is not finished since I ran into a problem. I need to parse the links to the product first. For this, I parse the div in detail from the collection and then pull out the href from a. The script first gives me 4 links and then gives an error. thanks for the help

#bs4 #request #html.pars #loggin #Pyton3
 
Последнее редактирование:

Jerry

Пользователь
Пользователь
Июл 28, 2020
29
12
3
Если рассматривать этот код:
Python:
with open("links.txt", 'r') as f:
    while i < 201:
        i = i+1
        line = f.readline()
        f.close()
        f = open('index.html', 'w')
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        f.write(index)
        write(index,i)

То он не будет работать, потому что строка f.close() закроет файл links.txt.

Поэтому в своем примере я выделил для него отдельную переменную links_file:
Python:
with open("links.txt", 'r') as links_file:


Вот как у меня читается из файла

Python:
with open("links.txt", 'r') as f:
    while i < 201:
        i = i+1
        line = f.readline()
        g = open('index.html', 'w')
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        g.write(index)
        write(index,i)

Выглядит правильно. Только index.html не закрывается. Сейчас все работает?
В целом при работе с файлами рекомендуется использовать контекстный менеджер with. Он автоматом закроет файл при окончании его использования.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Покажите код и напишите текст ошибки. Код вставляйте через кнопку ...-> код -> python.
 

Jerry

Пользователь
Пользователь
Июл 28, 2020
29
12
3
Из документации:
If find_all() can’t find anything, it returns an empty list. If find() can’t find anything, it returns None

Т.е. при вызове find() может вернуться None. Если от None попытаться вызвать find() будет ошибка AttributeError: 'NoneType' object has no attribute 'find', как у вас в строке
Python:
for a in BeautifulSoup(html, features="html.parser").find('div', class_="plitka grid").find('div', class_='item col-lg-2 col-sm-3').find('div', class_='wrap').find('div', class_='row').find('div', class_='col-sm-6').find_all('a'):

Поэтому имеет смысл проверять результат вызова find() прежде чем дальше вызывать от него что-то еще.
 

Jerry

Пользователь
Пользователь
Июл 28, 2020
29
12
3
Попробуйте вывести в лог результат каждого find().
На скриншоте, например, не видно 'item col-lg-2 col-sm-3').

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

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример:
Python:
from bs4 import BeautifulSoup
import requests
import logging
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)


collections = []
links = []


def get_collections():
    logging.info('Start script')
    response = requests.get("https://www.rusplitka.ru/catalog/plitka-dlya-vannoj/")
    soup = BeautifulSoup(response.text, features="html.parser")
    for soup in BeautifulSoup(response.text, features="html.parser").find_all("div", class_="description-block" ):
        for soups in soup.find_all("a", class_='title'):
            collection = "https://www.rusplitka.ru" + soups.get('href')
            logging.info('%s ', collection)
            collections.append(collection)


def get_product_links():
    for collection in collections:
        html = requests.get(collection).text
        grid = BeautifulSoup(html, features="html.parser").find('div', class_="plitka grid")
        items = grid.find_all('div', class_='item')
        for item in items:
            link = item.find('div', class_='wrap').find('div', class_='row').find('div', class_='col-sm-6').find('a')
            logging.info('%s ', link['href'])
            links.append('https://www.rusplitka.ru' + link['href'])


# коллекции с первой страницы
get_collections()
# ссылки
get_product_links()

# запись ссылок в файл
with open('plitka_links.txt', 'w', encoding='utf-8') as f:
    for link in links:
        f.write(link + '\n')

logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('stop script')
 
  • Мне нравится
Реакции: Rodion

Jerry

Пользователь
Пользователь
Июл 28, 2020
29
12
3
Функция write() работает только по первому товару и записывает только 1 товар

В этом месте всегда читается одна и та же строка
Python:
def reads():
    i=0
    while i < 201:
        i = i+1
        f = open("links.txt", 'r') # link.txt файл с ссылками на товар
        line = f.readline() # <===

Если открыть файл один раз перед запуском цикла, то строки будут перебираться, например:

Python:
with open("links.txt", 'r') as links_file:
    while i < 201:
        i = i+1
        line = links_file.readline()
 
  • Мне нравится
Реакции: Rodion

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Покажите код и напишите текст ошибки. Код вставляйте через кнопку ...-> код -> python.
вот
 

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Из документации:


Т.е. при вызове find() может вернуться None. Если от None попытаться вызвать find() будет ошибка AttributeError: 'NoneType' object has no attribute 'find', как у вас в строке
Python:
for a in BeautifulSoup(html, features="html.parser").find('div', class_="plitka grid").find('div', class_='item col-lg-2 col-sm-3').find('div', class_='wrap').find('div', class_='row').find('div', class_='col-sm-6').find_all('a'):

Поэтому имеет смысл проверять результат вызова find() прежде чем дальше вызывать от него что-то еще.
дело в том что по тэгам и классам страници индетичны я проверял
 

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
2020-08-01 12:40:25,561 - Start script
2020-08-01 12:40:26,631 - https://www.rusplitka.ru/products/lb-ceramics/ornella-8109/
2020-08-01 12:40:27,221 - /products/lb-ceramics/ornella-8109/plitka-nastennaya-ornella-ornella-bezh-5032-0203-24524/
2020-08-01 12:40:27,222 - https://www.rusplitka.ru/products/41zero42/biscuit-16529/
2020-08-01 12:40:27,821 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-plain-bianco-111641/
2020-08-01 12:40:27,821 - https://www.rusplitka.ru/products/ape-ceramicas/arts-1-16261/
2020-08-01 12:40:28,399 - /products/ape-ceramicas/arts-1-16261/keramogranit-arts-trendy-mix-20-107717/
2020-08-01 12:40:28,399 - https://www.rusplitka.ru/products/arcana/stracciatella-15141/
2020-08-01 12:40:29,070 - /products/arcana/stracciatella-15141/keramogranit-stracciatella-guba-20x20-8025-97792/
2020-08-01 12:40:29,070 - https://www.rusplitka.ru/products/mainzu/mandala-13459/
Traceback (most recent call last):
File "d:/PARS-site/pars.py", line 37, in <module>
print(name_produkt())
File "d:/PARS-site/pars.py", line 29, in name_produkt
for a in BeautifulSoup(html, features="html.parser").find('div', class_="plitka grid").find('div', class_='item col-lg-2 col-sm-3').find('div', class_='wrap').find('div', class_='row').find('div', class_='col-sm-6').find_all('a'):
AttributeError: 'NoneType' object has no attribute 'find'
Снимок.PNG
Первая ссылка это каталог а вторая это продукт
 
Последнее редактирование:

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Попробуйте вывести в лог результат каждого find().
На скриншоте, например, не видно 'item col-lg-2 col-sm-3').

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

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Я решил проблему :D
Но появилась другая :confused::mad:
Python:
from bs4 import BeautifulSoup
import bs4
import requests
import html.parser
import pdb
import logging
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)


def html_get():
    with open("index.html", "w", encoding='utf-8') as f:
        htmll = requests.get(
            "https://www.rusplitka.ru/catalog/plitka-dlya-vannoj/")
        f.write(htmll.text)
        f.close()


def name_produkt():
    logging.info('Start script')
    html_get()
    with open("index.html", 'r', encoding='utf-8') as f:
        contents = f.read()
        f.close()
        for soup in BeautifulSoup(contents, features="html.parser").find_all("div", class_="description-block"):
            for soups in soup.find_all("a", class_='title'):
                colektion = "https://www.rusplitka.ru"+soups.get('href')
                logging.info('%s ', colektion)
                f = open('colection.txt', 'a')
                f.write(colektion)
                f.close()
                # logging.info('%s ', colektion)
                html = requests.get(colektion).text
                for a in BeautifulSoup(html, features="html.parser").find_all('a', class_='title'):
                    link = a.get('href')
                    logging.info('%s ', link)
                    f = open("links.txt", 'a+')
                    i = 1
                    while i < 2:
                        i = i + 1
                        f.write("https://www.rusplitka.ru"+link + '\n')
print(name_produkt())
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('stop script')
2020-08-01 13:47:25,526 - Start script
2020-08-01 13:47:27,205 - https://www.rusplitka.ru/products/lb-ceramics/ornella-8109/
2020-08-01 13:47:27,977 - /catalog/land/
2020-08-01 13:47:28,006 - /products/lb-ceramics/ornella-8109/plitka-nastennaya-ornella-ornella-bezh-5032-0203-24524/
2020-08-01 13:47:28,015 - /products/lb-ceramics/ornella-8109/plitka-nastennaya-ornella-ornella-siniy-5032-0204-24525/
2020-08-01 13:47:28,015 - /products/lb-ceramics/ornella-8109/plitka-napolnaya-ornella-ornella-bezh-art-mozaika-5032-0199-24522/
2020-08-01 13:47:28,016 - /products/lb-ceramics/ornella-8109/plitka-napolnaya-ornella-ornella-siniy-art-mozaika-5032-0200-24523/
2020-08-01 13:47:28,055 - /products/lb-ceramics/ornella-8109/plitka-napolnaya-ornella-ornella-bezh-mozaika-5032-0201-24526/
2020-08-01 13:47:28,056 - https://www.rusplitka.ru/products/41zero42/biscuit-16529/
2020-08-01 13:47:28,953 - /catalog/land/
2020-08-01 13:47:28,954 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-plain-bianco-111641/
2020-08-01 13:47:28,954 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-plain-terra-111642/
2020-08-01 13:47:28,954 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-plain-salvia-111643/
2020-08-01 13:47:28,955 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-plain-notte-111644/
2020-08-01 13:47:28,955 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-dune-bianco-111645/
2020-08-01 13:47:28,956 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-dune-terra-111646/
2020-08-01 13:47:28,956 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-dune-salvia-111647/
2020-08-01 13:47:28,957 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-dune-notte-111648/
2020-08-01 13:47:28,957 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-waves-bianco-111649/
2020-08-01 13:47:28,958 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-waves-terra-111650/
2020-08-01 13:47:28,958 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-waves-salvia-111651/
2020-08-01 13:47:28,959 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-waves-notte-111652/
2020-08-01 13:47:28,959 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-peak-bianco-111653/
2020-08-01 13:47:28,960 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-peak-terra-111654/
2020-08-01 13:47:28,960 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-peak-salvia-111655/
2020-08-01 13:47:28,961 - /products/41zero42/biscuit-16529/plitka-nastennaya-biscuit-peak-notte-111656/
2020-08-01 13:47:28,961 - https://www.rusplitka.ru/products/ape-ceramicas/arts-1-16261/
2020-08-01 13:47:29,956 - /catalog/land/
2020-08-01 13:47:29,956 - /products/ape-ceramicas/arts-1-16261/plitka-nastennaya-arts-white-107707/
2020-08-01 13:47:29,957 - /products/ape-ceramicas/arts-1-16261/plitka-nastennaya-arts-tip-white-107708/
2020-08-01 13:47:29,957 - /products/ape-ceramicas/arts-1-16261/plitka-nastennaya-arts-nude-107709/
2020-08-01 13:47:29,958 - /products/ape-ceramicas/arts-1-16261/plitka-nastennaya-arts-tip-nude-107710/
2020-08-01 13:47:29,958 - /products/ape-ceramicas/arts-1-16261/plitka-nastennaya-arts-turquoise-107711/
2020-08-01 13:47:55,019 - stop script
И еще больше было
 

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Python:
from bs4 import BeautifulSoup
import bs4
import requests
import html.parser
import pdb
import logging
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
def reads():
    i=0
    while i < 201:
        i = i+1
        f = open("links.txt", 'r')# link.txt файл с ссыками на товар
        line = f.readline()
        f.close()
        f = open('index.html', 'w')# записываем для последуещего разбора
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        f.write(index)
        write(index)#вызов фунции
def write(index):    
    for soup in BeautifulSoup(index, features="html.parser").find("div", class_='col-sm-5 col-lg-7 info-product info-product--right').find('ul', class_='list-unstyled attrs'):
        for name in BeautifulSoup(index,features="html.parser").find("span", class_='label label-force label-primary js-product-code'):
            logging.info('%s :', name)# вывод информации
            f = open(name, "a+")# открытие в файл с именем = код товара
            f.write(str(soup) + '\n')
            f.close()
reads()
logging.info('stop script')

Функция write() работает только по первому товару и записывает только 1 товар
 

Вложения

  • links.txt
    95,4 КБ · Просмотры: 1
  • index.html.txt
    433,5 КБ · Просмотры: 1

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
В этом месте всегда читается одна и та же строка
Python:
def reads():
    i=0
    while i < 201:
        i = i+1
        f = open("links.txt", 'r') # link.txt файл с ссылками на товар
        line = f.readline() # <===

Если открыть файл один раз перед запуском цикла, то строки будут перебираться, например:

Python:
with open("links.txt", 'r') as links_file:
    while i < 201:
        i = i+1
        line = links_file.readline()
сечас попробую
 
  • Мне нравится
Реакции: Student

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Python:
def reads():
    i=0
    with open("links.txt", 'r') as f:
        while i < 201:
            i = i+1
            line = f.readline()
            f.close()
            f = open('index.html', 'w')
            lines = line.replace('\n', '')
            index = requests.get(lines).text
            f.write(index)
            write(index,i)
def write(index,i):
    i = i+1     
    for soup in BeautifulSoup(index, features="html.parser").find("div", class_='col-sm-5 col-lg-7 info-product info-product--right').find('ul', class_='list-unstyled attrs'):
        for name in BeautifulSoup(index,features="html.parser").find("span", class_='label label-force label-primary js-product-code'):
            logging.info('%s :', name+str(i))
            f = open(name, "w")
            f.write(str(soup) + '\n')
            if name == name:
                print('error')
                f.close()
            else:
                f = open(name, "w")
                f.write(str(soup) + '\n')
                f.close()
reads()
logging.info('stop script')
нет не получилось или я тупик
 
  • Мне нравится
Реакции: Student

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Python:
    with open("links.txt", 'r') as f:
        while i < 201:
            i = i+1
            line = f.readline()
            g = open('index.html', 'w')
            lines = line.replace('\n', '')
            index = requests.get(lines).text
            g.write(index)
            write(index,i)
Вот как у меня читается из файла
 

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Если рассматривать этот код:
Python:
with open("links.txt", 'r') as f:
    while i < 201:
        i = i+1
        line = f.readline()
        f.close()
        f = open('index.html', 'w')
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        f.write(index)
        write(index,i)

То он не будет работать, потому что строка f.close() закроет файл links.txt.

Поэтому в своем примере я выделил для него отдельную переменную links_file:
Python:
with open("links.txt", 'r') as links_file:




Python:
with open("links.txt", 'r') as f:
    while i < 201:
        i = i+1
        line = f.readline()
        g = open('index.html', 'w')
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        g.write(index)
        write(index,i)

Выглядит правильно. Только index.html не закрывается. Сейчас все работает?
В целом при работе с файлами рекомендуется использовать контекстный менеджер with. Он автоматом закроет файл при окончании его использования.

АА я всё понял спасибо большое ;)
 

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Если рассматривать этот код:
Python:
with open("links.txt", 'r') as f:
    while i < 201:
        i = i+1
        line = f.readline()
        f.close()
        f = open('index.html', 'w')
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        f.write(index)
        write(index,i)

То он не будет работать, потому что строка f.close() закроет файл links.txt.

Поэтому в своем примере я выделил для него отдельную переменную links_file:
Python:
with open("links.txt", 'r') as links_file:




Python:
with open("links.txt", 'r') as f:
    while i < 201:
        i = i+1
        line = f.readline()
        g = open('index.html', 'w')
        lines = line.replace('\n', '')
        index = requests.get(lines).text
        g.write(index)
        write(index,i)

Выглядит правильно. Только index.html не закрывается. Сейчас все работает?
В целом при работе с файлами рекомендуется использовать контекстный менеджер with. Он автоматом закроет файл при окончании его использования.
да все получилось Спасибо
 
Последнее редактирование:

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
ПОМОГИТЕ ПОЖАЛУСТА!!????
Python:
from bs4 import BeautifulSoup
import requests
import html.parser
import pdb
import logging
logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
def pars():
    i=0
    with open("links.txt", 'r') as f:
        while i < 2:
            i = i+1
            print(i)
            line = f.readline()
            lines = line.replace('\n', '')
            logging.info("%s ",line)
            index = requests.get(lines).text
            headers = []    
            for soup in BeautifulSoup(index, features="html.parser").find("div", class_='col-sm-5 col-lg-7 info-product info-product--right').find('ul', class_='list-unstyled attrs').find_all('li'):
                for name in soup.find_all('span'):
                    logging.info('%s :', name)
                    soup = str(soup)
                    soup = soup.replace('<span class="label">', '').replace('<span class="cat">', '').replace('</span>', '').replace('<a class="opt-hidden" href="/catalog/land/rossiya/">', '').replace('<span class="opt-display">','').replace('<li>','').replace('</li>','').replace('<i class="icon icon-flag rossiya"></i>','').replace('</a>','').replace('<sup>', ' ').replace('</sup>','').replace('<a class="js-rezcollection" href="/products/lb-ceramics/ornella-8109/">','').replace('<a class="man js-rezbrand" href="/catalog/land/rossiya/lb-ceramics/">','').replace('    ','').replace('\n','').replace('Артикул:','\nАртикул:')
                    f = open('produkte_list.txt', "a+", encoding='utf-8')
                    f.write(soup + '\n')
                    for line in f:
                        line = line.strip()
                        headers.append(line)
                        print(headers)
pars()
logging.info('stop script')

Первую ссылку парсит а дальше не записывает в переменную line ссылку с файла links.txt
 

Вложения

  • links.txt
    95,4 КБ · Просмотры: 0
  • produkte_list.txt
    5,4 КБ · Просмотры: 0

Rodion

Новичок
Пользователь
Май 8, 2020
18
2
3
Всем большое спасибо, вы очень помогли;)
 

Форум IT Специалистов