Привет!ЯМарко Питон сказал,Программист с 10-летним опытом.
Мы продолжаем рассказывать о случае с сканером Python. Сегодня мы сканируем данные комментариев под указанными заметками (заметками, связанными с «Палестиной») на Xiaohongshu.
Старое правило — сначала показывать результаты:
Скриншот 1:
Скриншот 2:
Скриншот 3:
Всего было просканировано более 10 000 комментариев по теме «Палестина». Каждый комментарий содержит 10 ключевых полей, в том числе:
Ссылка на заметку, номер страницы, псевдоним комментатора, идентификатор комментатора, ссылка на домашнюю страницу комментатора, время комментария, IP-адрес комментария, лайки комментария, уровень комментария, содержание комментария.
Среди них уровни комментариев включают в себя: корневой комментарий, комментарий второго уровня и расширенный комментарий второго уровня.
Откройте любой комментарий в заметках Xiaohongshu, откройте режим разработчика браузера, сеть, XHR и найдите данные предварительного просмотра целевой ссылки следующим образом:
В результате получается ссылка на внешний запрос и начинается разработка кода сканера.
Сначала импортируйте необходимые вам библиотеки:
import requests
from time import sleep
import pandas as pd
import os
import time
import datetime
import random
Определите заголовок запроса:
# Заголовок запроса
h1 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
# Файлы cookie необходимо регулярно менять
'Cookie': «Замените собственным значением файла cookie»,
}
После моего фактического теста заголовок запроса содержит как User-Agent, так и Cookie, и сканирование может быть достигнуто.
Среди них файлы cookie имеют решающее значение и требуют регулярной замены. Так где же взять печенье? Вот как:
Далее разработайте логику перелистывания страниц.
Поскольку я не знаю, сколько всего страниц и сколько раз нужно прокрутить вниз, я использую цикл while до тех пор, пока не сработает условие завершения.
Итак, как определить условие завершения? Я заметил, что в возвращаемых данных есть параметр под названием «has_more», смело догадываюсь, что он означает, есть ли еще данные, и его значение истинно в обычных обстоятельствах. Если его значение ложно, это означает, что данных больше нет, то есть достигнута последняя страница и пора завершить цикл.
Следовательно, структура основного кода должна быть такой (ниже приведен псевдокод, в основном для выражения логики, не копируйте напрямую):
while True:
# Отправить запрос
r = requests.get(url, headers=h1)
# Анализ данных
json_data = r.json()
# Анализ один за другим
for c in json_data['data']['comments']:
# Содержание комментария
content = c['content']
content_list.append(content)
# Сохраняем данные в csv
。。。
# Определить условия расторжения
next_cursor = json_data['data']['cursor']
if not json_data['data']['has_more']:
print('Следующей страницы нет, завершите цикл!')
break
page += 1
Кроме того, есть ключевой вопрос, как перелистывать страницы.
Просмотрите параметры запроса следующим образом:
Курсор здесь является основанием для перемещения страницы вниз, поскольку в возвращаемых данных каждого запроса также присутствует курсор:
Смелое предположение состоит в том, что курсор в возвращаемых данных — это курсор, используемый для запроса следующей страницы. Следовательно, логическая реализация этой части должна быть следующей (ниже приведен псевдокод, в основном для выражения логики, не копируйте). напрямую):
while True:
if page == 1:
url = 'https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id={}&top_comment_id=&image_scenes=FD_WM_WEBP,CRD_WM_WEBP'.format(
note_id)
else:
url = 'https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id={}&top_comment_id=&image_scenes=FD_WM_WEBP,CRD_WM_WEBP&cursor={}'.format(
note_id, next_cursor)
# Отправить запрос
r = requests.get(url, headers=h1)
# Анализ данных
json_data = r.json()
# Получить курсор для следующей страницы
next_cursor = json_data['data']['cursor']
Кроме того, я упоминал в первой главе, что я тоже поднялся на второй уровень комментариев и второй уровень расширенных комментариев. Как я это сделал?
После анализа в возвращаемых данных есть узел sub_comment_count, который представляет количество вложенных комментариев. Если оно больше 0, это означает, что комментарий имеет вложенные комментарии, а затем из узла sub_comments можно сканировать вторичные комментарии.
Среди них комментарий второго уровня расширяется, а root_comment_id в параметре запроса представляет идентификатор родительского комментария. Другая логика такая же и не будет повторяться.
Наконец, логично сохранить данные csv:
# Сохранить данные в DF
df = pd.DataFrame(
{
«Ссылка на заметку»: 'https://www.xiaohongshu.com/explore/' + note_id,
'номер страницы': page,
«Псевдоним комментатора»: nickname_list,
«Идентификатор комментатора»: user_id_list,
«Ссылка на домашнюю страницу комментатора»: user_link_list,
«Время комментирования»: create_time_list,
«Комментарий к территории IP»: ip_list,
«Количество лайков на комментарии»: like_count_list,
«Уровень комментариев»: comment_level_list,
'Содержание комментария': content_list,
}
)
# Установить заголовок файла CSV
if os.path.exists(result_file):
header = False
else:
header = True
# сохранить в csv
df.to_csv(result_file, mode='a+', header=header, index=False, encoding='utf_8_sig')
На этом этапе разрабатывается код сканера.
Полный код также включает в себя ключевую логику, такую как преобразование временных меток, случайное время ожидания, анализ других полей, сохранение данных Dataframe и циклическое сканирование нескольких заметок одновременно.
Демонстрационный код: нет