Предисловие: эта статья в основном включает в себя точки знаний, включая поисковый робот Sina Weibo, простое чтение и запись баз данных Python, простую дедупликацию данных списка и простую обработку естественного языка (модуль snowNLP, машинное обучение). Подходит для чтения друзьями, имеющими определенную базу программирования и немного разбирающимися в python.
Я полагаю, что технологический круг недавно высмеивал одну вещь: Weibo в полдень 8 октября вызвало бурю негодования среди пользователей Sina Weibo (особенно пользователей женского пола), в результате чего Sina Weibo была парализована.
Создатель этого Weibo — мировой суперпопулярный айдол Лу Хань.
Программисты одну за другой начали научные дискуссии:
Как Лухан взорвал сервер Weibo?
Как инженеры Weibo работают сверхурочно во время свадьбы
Как программисты Taobao прощают Лухана
В этот момент весь мир знал, что Лу Хань влюблен.
Поклонницы оленей во всем мире вместе потеряли свою любовь.
Так что же чувствуют фанаты Лухана? Давайте проанализируем комментарии о любви Лухана на Weibo, проанализируем настроение фанатов и послушаем меня. (Если вы хотите увидеть результаты анализа, вы можете сразу перейти к Разделу 5)
1. Сина API Weibo
Пережив горе (действительно болезненное) из-за того, что меня несколько раз банили, я научился «хорошей» привычке проверять API перед сканированием сайта. Как крупная компания Sina могла не запустить Sina Weibo API?Sina имеет собственный API для разработчиков.открытая платформа,вотPython вызывает метод Weibo API, ниже приведен код для доступа к API Weibo путем входа в App_key и App_secret, код основан на py2. Есть некоторые проблемы с py3 при использовании модуля weibo.
from weibo import APIClient
import webbrowser
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
APP_KEY = '你的App Key ' #获取的App Key
APP_SECRET = '你的AppSecret' #获取的AppSecret
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' #回调链接
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
webbrowser.open_new(url) #打开默认浏览器获取code参数
print '输入url中code后面的内容后按回车键:'
code = raw_input()
r = client.request_access_token(code)
access_token = r.access_token
expires_in = r.expires_in
client.set_access_token(access_token, expires_in)
Теперь, когда вы знаете, как войти в API, как вызвать API для сканирования одного комментария Weibo? Одна строка кода для этого.
r = client.comments.show.get(id = 4160547165300149,count = 200,page = 1)
Все комментарии по отдельному Weibo находятся в r.comments, которые нужно сравнить здесьДокументация API Weibo, API Weibo заявил, что для вызова API комментариев Weibo требуется авторизация пользователя, но вы можете вызывать этот API, если знаете идентификатор отдельного Weibo, а как получить идентификатор отдельного Weibo будет сказано позже (молчите , Не сообщайте Weibo, если он есть).
Получите API по пути client.interface name.get(параметр запроса).После получения API вы можете просмотреть спецификации в деталях интерфейса.В документе есть примеры возвращаемых результатов.
Имя json-интерфейса данных ключа также указано в документации.
Если мы хотим получить содержимое комментариев Weibo, нам нужно только вызвать текстовый интерфейс.
for st in r.comments:
text = st.text
2. Сканер Weibo
Вызвав Sina Weibo API, мы можем просто получить информацию о комментариях одного Weibo, Почему это просто, ведь популярная информация стоит дорого! Вы думаете, что Weibo большого V просто дает вам вызовы API бесплатно? Несертифицированные разработчики приложений могут запрашивать только тысячи вызовов API в день. Это для такого большого V, как Лухан, у которого есть сотни тысяч комментариев на одном Weibo. ...слишком мало (ТТ)
Так что щипайте, все равно придется писать сканер Weibo.
Как говорится, познание себя и познание врага не будет опасным в сотне боёв.Как большая компания, Сина должна была пережить сотни сражений.Должна пережить бесчисленное количество войн между гадами и антиползунами, и она должна надежная стратегия против сканирования. Как говорится, перед лицом сильного врага иди в обход.Есть большой парень, который хорошо сказал, просканировав сайт, сначала просканировав мобильный терминал:https://m.weibo.cn/
После входа в Weibo зайдите на Weibo, где Лу Хан объявил о своих отношениях, _(:зゝ∠)_ уже имеет 200w+ комментариев, вы можете увидеть неспокойные сердца фанатов под тихим Weibo...
URL-адрес Weibo на мобильном терминале простой и понятный, не такой сложный и непонятный, как логика на стороне ПК:https://m.weibo.cn/status/4160547165300149После еще нескольких микроблогов вы можете узнать номер после статуса, который является идентификатором одного микроблога.
Комментарии включают в себя популярные комментарии и последние комментарии, но независимо от того, какие комментарии, продолжайте прокручивать вниз, URL-адрес не изменится. Щелкните правой кнопкой мыши браузер Chrome и «Проверить», чтобы наблюдать за изменениями в сети.
Из файла xhr сети мы можем узнать, что правило изменения популярных комментариев:
'https://m.weibo.cn/single/rcList?format=cards&id=' + 单条微博id + '&type=comment&hot=1&page=' + 页码
Схема изменений в последних комментариях такова:
'https://m.weibo.cn/api/comments/show?id=' + 单条微博id + '&page=' + 页码
Открытымhttps://m.weibo.cn/single/rcList?format=cards&id=4154417035431509&type=comment&hot=1&page=1Вы можете посмотреть json-файл популярных комментариев.
Дальше рутина, маскировка шапки браузера, чтение json-файла, обход каждой страницы… Дело не в этом! Перейдите непосредственно к коду~ Вот код py3~
import re,time,requests,urllib.request
weibo_id = input('输入单条微博ID:')
# url='https://m.weibo.cn/single/rcList?format=cards&id=' + weibo_id + '&type=comment&hot=1&page={}' #爬热门评论
url='https://m.weibo.cn/api/comments/show?id=' + weibo_id + '&page={}' #爬时间排序评论
headers = {
'User-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0',
'Host' : 'm.weibo.cn',
'Accept' : 'application/json, text/plain, */*',
'Accept-Language' : 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding' : 'gzip, deflate, br',
'Referer' : 'https://m.weibo.cn/status/' + weibo_id,
'Cookie' : '登录cookie信息',
'DNT' : '1',
'Connection' : 'keep-alive',
}
i = 0
comment_num = 1
while True:
# if i==1: #爬热门评论
# r = requests.get(url = url.format(i),headers = headers)
# comment_page = r.json()[1]['card_group']
# else:
# r = requests.get(url = url.format(i),headers = headers)
# comment_page = r.json()[0]['card_group']
r = requests.get(url = url.format(i),headers = headers) #爬时间排序评论
comment_page = r.json()['data']
if r.status_code ==200:
try:
print('正在读取第 %s 页评论:' % i)
for j in range(0,len(comment_page)):
print('第 %s 条评论' % comment_num)
user = comment_page[j]
comment_id = user['user']['id']
print(comment_id)
user_name = user['user']['screen_name']
print(user_name)
created_at = user['created_at']
print(created_at)
text = re.sub('<.*?>|回复<.*?>:|[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]','',user['text'])
print(text)
likenum = user['like_counts']
print(likenum)
source = re.sub('[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]','',user['source'])
print(source + '\r\n')
comment_num+=1
i+=1
time.sleep(3)
except:
i+1
pass
else:
break
Несколько заметок здесь:
1. После настройки интервала сканирования вероятность бана сканера Weibo значительно снижается (особенно ночью)
2. Количество json-данных, возвращаемых Sina, каждый раз случайное, поэтому после перелистывания страницы будет дублирование данных, поэтому используется дедупликация данных, о которой будет рассказано далее.
3. Добавил код для удаления эмодзи-выражений в тексте и исходнике (долго записывал в базу, и почти прошел путь от удаления библиотеки до убегания/(ㄒоㄒ)/), а также убрал ответы смешал в нем чужой html код.
4. Я написал только прочитанные данные, а не как их сохранить, ведь надо считать! в соответствии с! библиотека! горячий! (Вот в чем дело! Стучите по доске)
3. Чтение и запись баз данных на питоне
Хотя краулер Weibo значительно увеличил объем сбора данных, он также легко блокируется Sina, потому что это краулер. Решение завершить цикл здесь заключается в том, что статус сети не равен 200, но когда Weibo обнаружит, что это поисковый робот, Weibo вернет веб-страницу, а на веб-странице нет реального контента. сообщит об ошибке, а данные проползли раньше, ничего не осталось.
Но если вы проползете некоторое время и сохраните данные один раз, объем данных увеличится... Холодные файлы хлопают случайным образом по лицу... Мое сердце как бы... В это время нам нужно использовать база данных.
База данных, как следует из ее названия, является хранилищем для хранения данных.Как система управления, которая разрабатывалась более 60 лет, база данных имеет огромную область применения и сложные функции... Ну не могу я ее редактировать больше.
В этой статье основная роль базы данныхЛист Excel в стиле AI(●—●). В процессе обхода в нем будут храниться просканированные данные, и в нем будет храниться просканированный номер.Даже если программа искателя будет прервана, данные, просканированные до прерывания, будут храниться в базе данных.
Большинство баз данных можно использовать с Python, а Mijiang знает mysql, sqlite, mongodb и redis. Вот mysql на макеустановка mysql, программное обеспечение для управления базами данныхСправка по использованию Navicat, найти другие системы самостоятельно, если есть какие-либо проблемы во время установки и использования, пожалуйста, не приходите ко мне (побег
В соответствии с приведенным выше кодом создайте базу данных, таблицу и домен, а также формат домена в navicat. Добавьте код в программу Python.
conn =pymysql.connect(host='服务器IP(默认是127.0.0.1)',user='服务器名(默认是root)',password='服务器密码',charset="utf8",use_unicode = False) #连接服务器
cur = conn.cursor()
sql = "insert into nlp.love_lu(comment_id,user_name,created_at,text,likenum,source) values(%s,%s,%s,%s,%s,%s)" #格式是:数据名.表名(域名)
param = (comment_id,user_name,created_at,text,likenum,source)
try:
A = cur.execute(sql,param)
conn.commit()
except Exception as e:
print(e)
conn.rollback()
Запустив программу python, было просканировано около 1 Вт комментариев в реальном времени. Прежде чем перейти к следующему шагу, мы должны прочитать содержимое базы данных. Чтение кода базы данных в python также очень просто.
conn =pymysql.connect(host='服务器IP',user='用户名',password='密码',charset="utf8") #连接服务器
with conn:
cur = conn.cursor()
cur.execute("SELECT * FROM nlp.love_lu WHERE id < '%d'" % 10000)
rows = cur.fetchall()
Таким образом, информация, просканированная ранее, считывается, но, как упоминалось ранее, количество данных, возвращаемых сканером Weibo, является случайным при перелистывании страниц, поэтому будут повторяющиеся ситуации, поэтому после прочтения вам нужно использоватьесли... не вОператор выполняет дедупликацию данных.
for row in rows:
row = list(row)
del row[0]
if row not in commentlist:
commentlist.append([row[0],row[1],row[2],row[3],row[4],row[5]])
4. НЛП обработки естественного языка
НЛП — это область искусственного интеллекта. Оно может заставить машины понимать человеческий язык посредством разработки алгоритмов. Естественный язык также является более сложной частью искусственного интеллекта. Язык, столь же широкий, глубокий и непредсказуемый, как китайский, представляет собой серьезную трудность в НЛП. , в питоне много модулей связанных с НЛП, заинтересованные друзья могут пройтиПростой анализ тональности текста с помощью pythonПервый взгляд на НЛП.
Я взял (бан) тест (юнь) некоторые готовые алгоритмы анализа тональности и проанализировал просканированные комментарии.Высокий процент ошибок _(:зゝ∠)_ , что мне делать? Стоит ли переделывать алгоритм? Мицзян, кажется, столкнулась с первой серьезной проблемой в своей жизни, вызванной плохим изучением языка...
Конечно, такая девушка, как Ми Соус, которая лан и дуэт, естественно быстро обнаружила известную китайскую библиотеку НЛП на питоне:snowNLP. Метод, вызываемый snowNLP, относительно прост, метод вызова и сгенерированный результат подробно объясняются в исходном коде.
def snowanalysis(textlist):
sentimentslist = []
for li in textlist:
s = SnowNLP(li)
print(li)
print(s.sentiments)
sentimentslist.append(s.sentiments)
Этот код получает файл списка, сгенерированный основным текстом комментария, после чтения базы данных и выполняет анализ значения тональности для каждого комментария по очереди. SnowNLP может генерировать значение от 0 до 1 в соответствии с данным предложением.Когда значение больше 0,5, это означает, что эмоциональная полярность предложения более положительная.Когда оценка меньше 0,5, эмоциональная полярность более отрицательная. Чем очевиднее эмоции, давайте посмотрим на результаты теста комментариев.
Из содержания текста и соответствующих значений ниже видно, что баллы благословения или выражения положительных эмоций в основном выше 0,5, а баллы ожидания расставания или выражения негативных эмоций в основном ниже 0,5. . В результатах анализа также есть определенные ошибки, и алгоритм можно оптимизировать с помощью обучения.
5. Проанализируйте результаты
Давайте посмотрим на результаты этого анализа (●—●).
plt.hist(sentimentslist,bins=np.arange(0,1,0.02))
plt.show()
Подсчитайте список значений настроений, обработанных в предыдущем разделе, и создайте карту распределения. Время сбора данных на рисунке ниже — 19:00 9 октября, и было собрано 1w комментариев.
↑Лухан объявил о распределении сентиментальной ценности любви, комментарии Weibo
Давайте посмотрим на ответ Гуань Сяотуна на Weibo.
↑ Соответствующее распределение значений тональности комментариев Гуань Сяотуна в Weibo
Согласно этим двум цифрам видно, что эмоциональное значение чаще встречается на двух концах от 0, 1 и около 0,5, что указывает на то, что эмоции болельщиков в отношении таких событий более очевидны, независимо от того, положительные они или отрицательные. Но также можно заметить, что положительных эмоций больше, чем отрицательных.
Я также посчитал выражения Weibo, которые появились в комментариях.
Количество выражений в комментариях к Лу Ханю почти в 3 раза больше, чем у Гуань Сяотуна, а первое место в списке занимают все[давай], видно, что фанаты по-прежнему в большинстве своем поддерживают роман Лухана, и, конечно же, есть люди, которые хотят[жалоба БМ]Главные герои, и некоторые люди считают, что[грустный], хочу успокоиться[не беспокойте меня].
Затем выполните анализ облака слов по содержанию комментариев.
↑ Лухан признается в любви в облаке комментариев Weibo
↑ Соответствующее облако комментариев Гуань Сяотуна в Weibo
В Weibo Лухана есть много таких слов, как благословение, поддержка и вместе, а также есть несколько вопрошающих голосов, таких как почему, недостойный, расставание и т. Д. Те же слова есть в Weibo Гуань Сяотуна, но, кажется, есть много Что касается слов Рэба и Ли Ифэна, то складывается впечатление, что у обоих скандальные КП.
Угадайте, что является фоновым изображением облака слов? Про рисовый соус говорить не буду, вы сами это чувствуете.
Авторские права на эту статью принадлежат Dajidali Xiaomijiang@經書, Zhaimi RICE@zhihu и не могут быть воспроизведены без разрешения.