Почему парсер не извлекает данные и сохраняет пустые значения?

Мне для анализа данных требуется большое количество колонок. Я использую библиотеку 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
  • 26 октября 2024 г. 12:02
Ответы на вопрос 2
Проблема, с которой вы столкнулись, может быть связана с несколькими аспектами парсинга данных с помощью библиотеки `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


Результат:
Похожие вопросы