Первый публичный отчет об этой статье [Обыкновенная дорога Old Boy]
Привет!Я@Марко Питон сказал,Программист с 10-летним опытом。
Вы все смотрели недавние Азиатские игры? Помимо того, что он вдохновляет, он также содержит историю о любви и ненависти (в основном ориентированную на Сяоли и Корею). Друзья, которые его смотрели, все поймут!
Я использовал Python для сканирования всех заметок по теме #Азиатские игры в Ханчжоу на Сяохуншу. Цели следующие:
Результаты сканирования следующие:
Всего существует 7 основных полей, в том числе:
Название заметки, идентификатор заметки, ссылка на заметку, псевдоним автора, идентификатор автора, ссылка автора, время публикации. 2. Пояснение кода сканера
Основная идея реализуется посредством данных интерфейса анализа веб-страниц.
Нажмите кнопку «Поделиться» в правом верхнем углу мобильного клиента, а затем выберите «Копировать ссылку», как показано ниже:
Вставьте скопированную ссылку в браузер компьютера и включите режим разработчика следующим образом:
Прокрутите страницу вниз, чтобы отобразить дополнительные данные заметки. Откройте ссылку запроса, начинающуюся с заметок, чтобы просмотреть данные предварительного просмотра:
В результате получается ссылка на внешний запрос и начинается разработка кода сканера.
Сначала импортируйте необходимые вам библиотеки:
import requests # Отправить запрос
import random
from time import sleep # Установите ожидание, чтобы предотвратить обратное сканирование
import time
import pandas as pd # сохранить CSV
import datetime
import os
Определите заголовок запроса:
# Заголовок запроса
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',
}
Поскольку я не знаю, сколько всего страниц и сколько раз нужно прокрутить вниз, я использую цикл while до тех пор, пока не сработает условие завершения.
Итак, как определить условие завершения? Я заметил, что в возвращаемых данных есть параметр под названием «has_more», смело догадываюсь, что он означает, есть ли еще данные, и его значение истинно в обычных обстоятельствах. Если его значение ложно, это означает, что данных больше нет, то есть достигнута последняя страница и пора завершить цикл.
Следовательно, структура основного кода должна быть такой (ниже приведен псевдокод, в основном для выражения логики, не копируйте напрямую):
while True:
# Отправить запрос
r = requests.get(url, headers=h1)
# Анализ данных
json_data = r.json()
# Анализ один за другим
for i in json_data['data']['notes']:
# Название заметки
title = i['title']
title_list.append(title)
# Сохраняем данные в 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://www.xiaohongshu.com/web_api/sns/v3/page/notes?page_size=6&sort=hot&page_id={}&sid='.format(
page_id)
else:
url = 'https://www.xiaohongshu.com/web_api/sns/v3/page/notes?page_size=6&sort=hot&page_id={}&sid=&cursor={}'.format(
page_id, next_cursor)
# Отправить запрос
r = requests.get(url, headers=h1)
# Анализ данных
json_data = r.json()
# Получить курсор для следующей страницы
next_cursor = json_data['data']['cursor']
Наконец, логично сохранить данные csv:
# Сохранить данные в DF
df = pd.DataFrame(
{
'номер страницы': page,
'Название заметки': title_list,
'идентификатор заметки': note_id_list,
«Ник автора»: author_name_list,
«Идентификатор автора»: author_id_list,
«Время выпуска»: create_time_list,
}
)
# сохранить в csv
df.to_csv(result_file, mode='a+', header=header, index=False, encoding='utf_8_sig')
На этом этапе разрабатывается код сканера.
Полный код также включает в себя логические реализации, такие как преобразование временных меток, случайное время ожидания, анализ ключевых полей и сохранение данных Dataframe. Подробности см. в конце статьи.
Первый публичный отчет об этой статье [Обыкновенная дорога Old Boy]
Я@Марко Питон сказал,Программист с 10-летним опытом,Продолжайте делиться полезной информацией о Python!