Форум сайта python.su
Добрый день всем.
Изучаю 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)
Прикреплённый файлы:
Ошибка.jpg (30,5 KБ)
Офлайн
data_url_span = i.find("span", class_="js-pseudo-link") if span is None: continue data_url = data_url_span.get("data-url")
Офлайн
FishHook
Офлайн
Vlad018
ну показывайте
Офлайн
Кажется есть продвижение. Заменил после 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)
Офлайн
Удалось продвинуться еще дальше. Появилась злосчастная карточка, но 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()
Офлайн
Добрый день всем. Ниже продолжение истории с парсингом…
Итак, мне все-таки удалось добавить пагинацию в свой код, а также выгрузку в 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
Офлайн