Мне для анализа данных требуется большое количество колонок. Я использую библиотеку cianparser для парсинга объявлений о продаже, однако определенные данные из списка processed_data не поддаются парсингу. Я пробовала проверить ключи и обнаружила, что нужные данные отсутствуют, хотя <b>with_extra_data = True</b>, что, по идее, должно обеспечивать сбор информации после <b>if with_extra_data:</b>. Тем не менее, этого не происходит. <br/> <br/> <b>Список ключей:</b> <br/> <br/> <pre><code class="python">{'author': 'Абсолют Недвижимость', 'author_type': 'developer', 'url': 'https://www.cian.ru/sale/flat/307207783/', 'location': 'Москва', 'deal_type': 'sale', 'accommodation_type': 'flat', 'floor': 14, 'floors_count': 19, 'rooms_count': 1, 'total_meters': 37.6, 'price_per_month': -1, 'commissions': 0, 'price': 9743081, 'district': '', 'street': '', 'house_number': '', 'underground': '', 'residential_complex': 'Город-парк Первый Московский'}</code></pre> <br/> <br/> <b>Вот фрагмент кода (это еще не все, продолжение будет ниже):</b> <br/> <br/> <pre><code class="python">import csv import cianparser import os import time import random import requests import logging # Настройка логирования logging.basicConfig(filename='parsing_errors.log', level=logging.ERROR, format='%(asctime)s:%(levelname)s:%(message)s') def save_data_to_csv(data, file_name, mode='a'): if not data: return fieldnames = data[0].keys() file_exists = os.path.isfile(file_name) with open(file_name, mode, newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) if not file_exists or mode == 'w': writer.writeheader() write
Проблема, с которой вы столкнулись, может быть связана с несколькими аспектами парсинга данных с помощью библиотеки `cianparser`. Рассмотрим возможные причины и способы их решения: 1. **Отсутствие данных на сайте**: Убедитесь, что данные, которые вы пытаетесь извлечь, действительно доступны на странице. Некоторые объявления могут не содержать всей необходимой информации, и в таких случаях библиотека будет сохранять пустые значения. 2. **Версия библиотеки**: Проверьте, используете ли вы последнюю версию библиотеки `cianparser`. Иногда разработчики обновляют библиотеки, исправляя ошибки и добавляя новые функции. Убедитесь, что у вас установлена последняя версия: ``` pip install --upgrade cianparser ``` 3. **Обработка ключей**: Возможно, некоторые ключи не обрабатываются корректно в методах извлечения данных. Убедитесь, что все ключи, которые вы ожидаете, правильно называются и действительно присутствуют в данных. 4. **Логирование и отладка**: Используйте логирование, чтобы отслеживать, какие ключи отсутствуют и какие ошибки возникают при парсинге. Вы уже настроили логирование, поэтому добавьте вывод отладочной информации для проверки получаемых данных: ```python logging.debug(f'Полученные данные: {data}') ``` 5. **Пример кода**: Убедитесь, что ваш код правильно обрабатывает данные после их извлечения. В приведенном вами коде нет полной логики, отвечающей за обработку данных. Например, обработайте ошибки, которые могут возникнуть при попытке извлечь данные: ```python try: # Ваш код парсинга except Exception as e: logging.error(f'Ошибка парсинга: {e}') ``` 6. **Примеры данных**: Чтобы получить более конкретную помощь, предоставьте больше информации о том, какие конкретные данные вы не можете извлечь, и в каком формате они должны быть. 7. **Тестирование отдельных полей**: Попробуйте извлекать данные по отдельности. Это может помочь определить, какое именно поле не извлекается. Например: ```python for key in ['district', 'street', 'house_number', 'underground']: if key not in data or not data[key]: logging.warning(f'Поле {key} отсутствует или пустое') ``` Проанализируйте вышеперечисленные возможности и сделайте соответствующие изменения. Если проблемы сохраняются, возможно, стоит рассмотреть вопрос о поддержке от разработчиков библиотеки или ассоциированных форумах, где могут быть ответы на схожие вопросы.
Есть несколько моментов:
1. Про длинный кусок кода - он и не будет работать так, как вы хотите, потому что вы передаёте аргументwith_extra_data=True
в свою самописную функцию, а вparser.get_flats()
- нет. Соответственно он и не парсит дополнительные поля, отсюда и: "пробовала вывести ключи: смотрю, а их там тупо нет".
Должно быть:
data = parser.get_flats(deal_type=deal_type, rooms=rooms, with_extra_data=True, additional_settings={"start_page": page, "end_page": page})
2. Если вы действительно использовали эти прокси (а не просто привели их для примера), то это бессмысленно - они нерабочие. Прокси из свободного доступа редко долго живут, а тут вообще из примера на pypi.org / github.
3. Вёрстка сайтов постоянно изменяется, в том числе и для противодействия парсингу. Текущая версия циана не имеет<span>
c текстом "Тип жилья", а именно такой селектор использовался в библиотеке парсера, следовательно он всегда будет отдавать-1
.
4. Если вы всё-таки хотите парсить сайт, используя cianparser, то вам нужно внести несколько изменений в файл библиотеки: "Путь до вашего проекта\venv\Lib\site-packages\cianparser\flat\page.py".
В функцию__parse_flat_offer_page_json__(self)
после инициализации словаряpage_data
, добавить:ot = self.offer_page_soup.select_one('[data-name="OfferSummaryInfoItem"] p:nth-of-type(2)').get_text() page_data["object_type"] = ot
и закомментировать строчки:
# if "Тип жилья" == span.text: # page_data["object_type"] = spans[index + 1].text
Результат: