Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 12, 2022 14:31:47

Vlad018
Зарегистрирован: 2022-08-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Сайтов

Добрый день всем.

Изучаю Python путем написания парсера для сайта. Пока только первого. Тестовые (учебные) страницы по парсингу уже прошел.
Теперь мне для работы нужно спарсить сайт с мебельными фабриками. Уже удалось вытащить название, адрес, телефон, сайт (было самое сложное т.к. адрес сайта зашифрован и находится в атрибуте тега). Дальше столкнулся с новой проблемой, которую пока не удается решить самому из-за недостатка знаний.
Дело в том что некоторые карточки не имеют ссылки на сайт. И когда код доходит до этой карточки, то появляется ошибка. Если кто знает в чем дело - помогите пожалуйста! Если есть еще какие-нибудь комментарии по существующему коду, рад буду выслушать… Ниже код парсера:

    
import requests
from bs4 import BeautifulSoup
import base64
URL = 'https://rnd.spravker.ru/mebelnyie-fabriki/'
page = requests.get(URL)
soup = BeautifulSoup(page.content, "lxml")
items = soup.find_all('div', class_='org-widget__in')
for i in items:  # выводим данные из карточек с html кодом
    itemName = i.find('h3', class_='org-widget-header__title')
    itemAdress = i.find('span', class_='org-widget-header__meta org-widget-header__meta--location')
    itemPhone = i.find('dd', class_='spec__value')
    DATAURL = i.find("span", class_="js-pseudo-link").get("data-url")
    base64_message = DATAURL
    base64_bytes = base64_message.encode('UTF-8')
    message_bytes = base64.b64decode(base64_bytes)
    message = message_bytes.decode('UTF-8')
    print(itemName.text.strip())
    print(itemAdress.text.strip())
    print(itemPhone.text.strip())
    print(message)
    print()


Отредактировано FishHook (Авг. 12, 2022 15:06:58)

Прикреплённый файлы:
attachment Ошибка.jpg (30,5 KБ)

Офлайн

#2 Авг. 12, 2022 15:09:31

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг Сайтов

 data_url_span = i.find("span", class_="js-pseudo-link")
if span is None:
    continue
data_url = data_url_span.get("data-url")



Офлайн

#3 Авг. 12, 2022 15:19:20

Vlad018
Зарегистрирован: 2022-08-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Сайтов

FishHook

Спасибо добрый человек что отозвался. Я примерно так себе это и представлял.

Вставил этот отрезок, теперь ругается на span:

Traceback (most recent call last):
File “CUsers/User/Desktop/python/Lesson. Parsing/Parsing 12.08.22-2.py”, line 16, in <module>
if span is None:
NameError: name ‘span’ is not defined

Офлайн

#4 Авг. 12, 2022 15:34:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг Сайтов

Vlad018
ну показывайте



Офлайн

#5 Авг. 12, 2022 15:45:49

Vlad018
Зарегистрирован: 2022-08-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Сайтов

Кажется есть продвижение. Заменил после if span на data_url_span. Считались все карточки со страницы, кроме той где не был указан сайт. А хотелось бы ее тоже получить, только вместо сайта поставить, например 0 или пробел. Все это дело надо же как-то в таблицу потом запихнуть…

import requests
from bs4 import BeautifulSoup
import base64

URL = 'https://rnd.spravker.ru/mebelnyie-fabriki/'
page = requests.get(URL)
soup = BeautifulSoup(page.content, "lxml")
items = soup.find_all('div', class_='org-widget__in')

for i in items: # выводим данные из карточек с html кодом
itemName = i.find('h3', class_='org-widget-header__title')
itemAdress = i.find('span', class_='org-widget-header__meta org-widget-header__meta--location')
itemPhone = i.find('dd', class_='spec__value')
data_url_span = i.find("span", class_="js-pseudo-link")
if data_url_span is None:
data_url_span = 0
continue
DATAURL = data_url_span.get("data-url")
base64_message = DATAURL
base64_bytes = base64_message.encode('UTF-8')
message_bytes = base64.b64decode(base64_bytes)
message = message_bytes.decode('UTF-8')
print(itemName.text.strip())
print(itemAdress.text.strip())
print(itemPhone.text.strip())
print(message)
print()

Отредактировано Vlad018 (Авг. 12, 2022 16:11:45)

Офлайн

#6 Авг. 12, 2022 17:08:31

Vlad018
Зарегистрирован: 2022-08-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Сайтов

Удалось продвинуться еще дальше. Появилась злосчастная карточка, но 0 так и не пишется. Может получится и без него. Видно будет когда дойду до выгрузки в csv…

Буду продолжать эту тему пока не дойду до финала. Следующий этап - сбор данных с последующих страниц. Сложности, думаю, еще будут…

FishHook, спасибо за подсказку. Неделю мучался.

 import requests
from bs4 import BeautifulSoup
import base64
URL = 'https://rnd.spravker.ru/mebelnyie-fabriki/'
page = requests.get(URL)
soup = BeautifulSoup(page.content, "lxml")
items = soup.find_all('div', class_='org-widget__in')
for i in items:  # выводим данные из карточек с html кодом
    itemName = i.find('h3', class_='org-widget-header__title')
    itemAdress = i.find('span', class_='org-widget-header__meta org-widget-header__meta--location')
    itemPhone = i.find('dd', class_='spec__value')
    print(itemName.text.strip())
    print(itemAdress.text.strip())
    print(itemPhone.text.strip())
    data_url_span = i.find("span", class_="js-pseudo-link")
    if data_url_span is None:
        data_url_span = 0
        print()
        continue
    DATAURL = data_url_span.get("data-url")
    base64_message = DATAURL
    base64_bytes = base64_message.encode('UTF-8')
    message_bytes = base64.b64decode(base64_bytes)
    message = message_bytes.decode('UTF-8')
    print(message)
    print()

Офлайн

#7 Авг. 25, 2022 18:52:57

Vlad018
Зарегистрирован: 2022-08-12
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Сайтов

Добрый день всем. Ниже продолжение истории с парсингом…

Итак, мне все-таки удалось добавить пагинацию в свой код, а также выгрузку в csv файл, при помощи pandas, и модуль sleep. Теперь все работает корректно. Подкорректировал немного блок“ if data_url_span is None:” так как он перестал работать. Заменил его на связку Try-Except. Этот способ также пришлось добавить и к другим переменным.
В итоге код бегает по странице без всяких проблем.

P.S. Прошу профессионалов прокомментировать, насколько корректно, с вашей точки зрения, написан код.

Заранее благодарен.

 import requests
from bs4 import BeautifulSoup
import base64
from time import sleep
import pandas as pd
headers = {'user-agent': 'Mozilla/5.0'} 
URL = 'https://rnd.spravker.ru/mebelnyie-fabriki/'
page = requests.get(URL)
soup = BeautifulSoup(page.content, "lxml")
items = soup.find_all('div', class_='org-widget__in')
data = []
for p in range (1,9):
    print(p)
    URL = f'https://rnd.spravker.ru/mebelnyie-fabriki/page-{p}/'
    page = requests.get(URL)
    sleep(1)
    soup = BeautifulSoup(page.content, "lxml")
    items = soup.find_all('div', class_='org-widget__in')
    for i in items:  # выводим данные из карточек с html кодом
        #itemName = i.find('h3', class_='org-widget-header__title').text.strip()
        #itemPhone = i.find('dd', class_='spec__value').text.strip()
        #itemAdress = i.find('span', class_='org-widget-header__meta org-widget-header__meta--location').text.strip()
        try:
            itemName = i.find('h3', class_='org-widget-header__title').text.strip()
        except:
            itemName = '_'
        try:
            itemPhone = i.find('dd', class_='spec__value').text.strip()
        except:
            itemPhone = '_'
        try:
            itemAdress = i.find('span', class_='org-widget-header__meta org-widget-header__meta--location').text.strip()
        except:
            itemAdress = '_'
        try:
            data_url = i.find("span", class_="js-pseudo-link").get("data-url")
        except:
            data_url = '_'
        base64_message = data_url
        base64_bytes = base64_message.encode('UTF-8')
        message_bytes = base64.b64decode(base64_bytes)
        data_url_link = message_bytes.decode('UTF-8')
        data.append([itemName, itemAdress, itemPhone, data_url_link])
print(data)
print (len(data))
header = ['itemName', 'itemAdress', 'itemPhone', 'data_url_link']
df = pd.DataFrame(data, columns=header)
df.to_csv('/Users/User/Desktop/python/Lesson. Parsing/rnd_spravker.ru_mebelnyie-fabrikidata.csv', sep=';', encoding='utf8')
# файл с неправильной кодировкой можно исправить в https://эксель-онлайн.рф/ и скачать в xlsx

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version