Анализ высокой доступности Weibo Crawler за 2021 г.

искусственный интеллект Python

Обзор поискового робота Weibo

Сегодня я научу вас писать код для краулера Weibo.Вы можете самостоятельно сканировать горячие темы или комментарии в Weibo, что удобно для анализа и визуализации связанных данных.

Github-адрес проекта:GitHub.com/Python3SPI…, пожалуйста, не используйте данные, полученные этим проектом поискового робота, в каких-либо незаконных целях.

Адрес сборника статей проекта:Билеты. WeChat.QQ.com/tickets/app mode gal…

Сканер Weibo в основном имеет две ориентации: один — это сканер контента Weibo, а его поля назначения включают текст Weibo, издателя, количество репостов/комментариев/лайков и т. д., а другой — сканер комментариев Weibo, чьи поля назначения в основном это текст комментария и комментатор.

Есть четыре основных веб-сайта для поисковых роботов Weibo, ПК-станцияweibo.com,weibo.cnи соответствующая m(мобильная) станцияm.weibo.com(не могу просматривать на компьютере),m.weibo.cn, в целом,.cnСравнивать.comБолее простой пользовательский интерфейс уродливее, м-станция уродливее, чем компьютерная станция с более простым пользовательским интерфейсом.

1.png

2.png

3.png

4.png

Сведения о репозитории Github

Каталог склада показан на рисунке ниже, который в основном разделен на две части.GUI 功能集中版и无 GUI 功能独立版, GUI — графический пользовательский интерфейс.

5.png

Централизованная версия функции GUI

Сначала толькоGUI 功能集中版В этой части основной код — GUI.py и WeiboCommentScrapy.py.

6.png

GUI.py включает в себя логику сканера и графический интерфейс. Он построен на основе PyQt5. Часть сканера состоит из трех классов: WeiboSearchScrapy, WeiboUserScrapy и WeiboTopicScrapy. Все их целевые сайтыweibo.cn, оба наследуются от класса потока Thread.

7.png

Что реализовано в GUI.Py, так это искатель пользователя/темы, то есть сканирование микроблогов под указанным пользователем/темой.Когда мы нажимаем на интерфейс, чтобы отправить задачу сканирования, будет запущен соответствующий сканер потока, а после сканирования завершено, будет активирован соответствующий поисковый робот.Сигнал между классом и основным интерфейсом указывает, что захват завершен.

8.png

GUI.py запускает рендеринг следующим образом:

9.gif

10.gif

Будь то пользователь Weibo или поисковый робот, ограничение составляет около 50 страниц.

После сканирования Weibo мы можем использовать WeiboCommentScrapy.py для сканирования комментариев указанного Weibo, как указать, см. следующий рисунок.

11.png

Уведомлениеweibo.cnИдентификатор станции Weibo похож наIjEDU1q3wэтот формат и следующиеm.weibo.cnФормат идентификатора Weibo отличается (это чистое число, которое относительно длинно), и сканер комментариев может сканировать только первые 100 страниц.

Пользователи/темы/комментарии Weibo Данные сканера последовательно сохраняются в файле csv в папке пользователь/тема/комментарий.

20200313 Код централизованной версии измеренной функции GUI все еще доступен, но exe недействителен, потому что exe нужно запаковывать и выпускать каждый раз при обновлении кода. , теперь уже в третьей редакции)

Обратите внимание, что концентрированная версия функций графического интерфейса предназначена дляweibo.cn, это станция с самым уродливым интерфейсом, не ставьтеweibo.comилиm.weibo.cncookie здесь, иначе произойдет следующая ошибка:

encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
I/O error : encoder error
encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
I/O error : encoder error

В то же время, если что-то вродеPermissionError: [Errno 13] Permission denied: 'comment/IaYZIu0Ko.csvОшибки, подобные этой, возникают из-за того, что вы открыли файл csv в Excel, а программа продолжает добавлять к файлу. Блокировка не может быть получена, и сообщается об ошибке. Если вы хотите просмотреть содержимое файла во время работы, вы можете использовать Pycharm Плагин CSV.

Автономная версия без функций графического интерфейса

12.png

Под этим файлом есть три файла WeiboCommentScrapy.py, WeiboTopicScrapy.py, WeiboSuperCommentScrapy.py, первые два пока дляweibo.cnДа, WeiboTopicScrapy.py был соответствующим образом обновлен и может поддерживать поиск по промежутку времени.Например, если в этой теме ранее было 1000 страниц, мы можем просканировать только до 130 страниц, но можно разделить эти 1000 страниц по периоду времени, каждый Период времени (Год-Месяц-День, не поддерживает гранулярность времени в часах и ниже) может достигать 130 страниц независимо от длины.

А WeiboSuperCommentScrapy.py предназначен дляm.weibo.cnДа, этот сканер комментариев не имеет ограничения в 100 страниц.Я получил несколько комментариев w+ для одного Weibo, но некоторые могут получить только несколько K (фактические комментарии — несколько w+), что очень сбивает с толку. Вы можете запустить этот файл, не устанавливая куки самостоятельно, и вы можете автоматически получить куки, войдя в свою учетную запись.Этот шаг представляет собой статью блогера, который научился у Цзяньшу (woohoo.brief.com/afraid/8 об этом 04794 ох…) но после отладки обнаружил что есть параметрmax_id_type+1 будет добавлен на странице 17, а ответ на комментарий будет проанализирован и сохранен.

Разобранный код выглядит следующим образом, непосредственно извлекая json :

def info_parser(data):
    id,time,text =  data['id'],data['created_at'],data['text']
    user = data['user']
    uid,username,following,followed,gender = \
        user['id'],user['screen_name'],user['follow_count'],user['followers_count'],user['gender']
    return {
        'wid':id,
        'time':time,
        'text':text,
        'uid':uid,
        'username':username,
        'following':following,
        'followed':followed,
        'gender':gender
    }

Захваченный код выглядит следующим образом:

def start_crawl(cookie_dict,id):
    base_url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'
    next_url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id={}&max_id_type={}'
    page = 1
    id_type = 0
    comment_count = 0
    requests_count = 1
    res = requests.get(url=base_url.format(id,id), headers=headers,cookies=cookie_dict)
    while True:
        print('parse page {}'.format(page))
        page += 1
        try:
            data = res.json()['data']
            wdata = []
            max_id = data['max_id']
            for c in data['data']:
                comment_count += 1
                row = info_parser(c)
                wdata.append(info_parser(c))
                if c.get('comments', None):
                    temp = []
                    for cc in c.get('comments'):
                        temp.append(info_parser(cc))
                        wdata.append(info_parser(cc))
                        comment_count += 1
                    row['comments'] = temp
                print(row)
            with open('{}/{}.csv'.format(comment_path, id), mode='a+', encoding='utf-8-sig', newline='') as f:
                writer = csv.writer(f)
                for d in wdata:
                    writer.writerow([d['wid'],d['time'],d['text'],d['uid'],d['username'],d['following'],d['followed'],d['gender']])
​
            time.sleep(5)
        except:
            print(res.text)
            id_type += 1
            print('评论总数: {}'.format(comment_count))
​
        res = requests.get(url=next_url.format(id, id, max_id,id_type), headers=headers,cookies=cookie_dict)
        requests_count += 1
        if requests_count%50==0:
            print(id_type)
        print(res.status_code)

Меры по предотвращению сканирования в основном заключаются в установке User-Agent и Cookie. Вы можете попробовать это. Если у вас есть какие-либо вопросы, оставьте сообщение.