Эта статья была впервые опубликована в паблике "Python Knowledge Circle", при необходимости перепечатки обращайтесь к автору в паблик-аккаунте для авторизации.
предисловие
Ссылки навигации по всем статьям в официальном аккаунте организованы в предыдущей статье, на самом деле, если организовывать вручную, то это очень трудоемкая вещь, так как при добавлении статей в официальный аккаунт можно выбрать только одну статью, которая является радиокнопкой.
Среди сотен статей трудно выбрать одну за другой.
Как Pythoner, pk, конечно, не может быть настолько неэффективным Мы используем краулер для извлечения информации, такой как заголовок и ссылка на статью.
захват пакетов
Нам нужно извлечь URL-адрес запроса статьи официальной учетной записи путем захвата пакета, обратитесь к статье о захвате пакетов, написанной ранее.Подготовка перед приложением для сканера Python, на этот раз Brother PK напрямую получает информацию о списке статей общедоступной учетной записи WeChat на стороне ПК, что проще.
Я беру в качестве примера инструмент для захвата пакетов Charles, проверяю запрос на разрешение захвата компьютера, который обычно проверяется по умолчанию.
Чтобы отфильтровать другие нерелевантные запросы, мы устанавливаем доменное имя, которое мы хотим сканировать, внизу слева.
Откройте WeChat на стороне ПК и откройте список статей общедоступной учетной записи «Python Knowledge Circle», Чарльз соберет большое количество запросов и найдет нужный нам запрос.Возвращаемая информация JSON содержит заголовок, аннотацию, ссылку и другую информацию. статьи все в коммmsgинформация ниже.
Это результаты после запроса ссылки, и мы можем просмотреть URL-адрес ссылки запроса в обзоре.
Получив так много информации с помощью захвата пакетов, мы можем написать сканер, который просканирует всю информацию статьи и сохранит ее.
функция инициализации
Список исторических статей на официальном аккаунте скользит вверх.После загрузки дополнительных статей обнаруживается, что в ссылке меняется только параметр смещения.Мы создаем функцию инициализации и добавляем IP-адрес прокси,заголовок запроса и информацию.Заголовок запроса содержит User-Agent, Cookie и Referer.
Эту информацию можно увидеть в инструменте захвата пакетов.
запросить данные
После захвата и анализа ссылки запроса мы можем использовать библиотеку запросов, чтобы сделать запрос и сделать вывод, равен ли код возврата 200. Если это 200, возвращаемая информация нормальная. Мы создадим функцию parse_data() для разбора и извлечения того, что нам нужно, возвращенных сообщений.
def request_data(self):
try:
response = requests.get(self.base_url.format(self.offset), headers=self.headers, proxies=self.proxy)
print(self.base_url.format(self.offset))
if 200 == response.status_code:
self.parse_data(response.text)
except Exception as e:
print(e)
time.sleep(2)
pass
Извлечь данные
Анализируя возвращенные данные Json, мы видим, что нужные нам данные находятся в приложении.msgext_info ниже.
Мы используем json.loads для анализа возвращенной информации Json и сохраняем нужные нам столбцы в файле csv.Существует три столбца информации: заголовок, аннотация и ссылка на статью.Другую информацию также можно добавить самостоятельно.
def parse_data(self, responseData):
all_datas = json.loads(responseData)
if 0 == all_datas['ret'] and all_datas['msg_count']>0:
summy_datas = all_datas['general_msg_list']
datas = json.loads(summy_datas)['list']
a = []
for data in datas:
try:
title = data['app_msg_ext_info']['title']
title_child = data['app_msg_ext_info']['digest']
article_url = data['app_msg_ext_info']['content_url']
info = {}
info['标题'] = title
info['小标题'] = title_child
info['文章链接'] = article_url
a.append(info)
except Exception as e:
print(e)
continue
print('正在写入文件')
with open('Python公众号文章合集1.csv', 'a', newline='', encoding='utf-8') as f:
fieldnames = ['标题', '小标题', '文章链接'] # 控制列的顺序
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(a)
print("写入成功")
print('----------------------------------------')
time.sleep(int(format(random.randint(2, 5))))
self.offset = self.offset+10
self.request_data()
else:
print('抓取数据完毕!')
Таким образом, результаты обхода будут сохранены в формате csv.
При запуске кода вы можете столкнуться с ошибкой SSLError.Самое быстрое решение — удалить s из https перед base_url, а затем запустить его.
Сохраняйте ссылки в формате уценки
Люди, которые часто пишут статьи, должны знать, что обычно при написании текста будет использоваться формат Markdown для написания статей, в этом случае, на какой бы платформе она ни размещалась, формат статьи не изменится.
В формате Markdown это представлено [название статьи] (ссылка URL статьи), поэтому нам просто нужно добавить еще один столбец информации при сохранении информации.Получается заголовок и ссылка статьи, а также URL в формате Markdown просто.
md_url = '[{}]'.format(title) + '({})'.format(article_url)
После завершения обхода эффект следующий.
Мы просто вставляем весь столбец ссылок md в заметки в формате Markdown.Большинство программ для создания заметок умеет создавать новые файлы в формате Markdown.
Таким образом, эти навигационные ссылки на статьи организованы по категориям.
Вы когда-нибудь решали небольшую проблему в своей жизни с помощью Python? Добро пожаловать, чтобы оставить сообщение для обсуждения.