微博評論API
- 想要爬取某一條微博的評論,首先會想到微博官方提供的API,但是不巧的是,官方提供的api能夠獲取的評論數量有限,不足以分析,那怎么辦呢?
- 我們想到了網頁端,手機端的微博,希望直接爬取上面的數據。試了下網頁端,可能網頁做得很完善了吧,網頁端找不到突破口,於是想到手機端碰碰運氣。通過使用chrome的工具,發現:爬取最新評論的URL如下:
url='https://m.weibo.cn/api/comments/show?id='+weibo_id+'&page={}',如果希望爬取某條微博下的評論,將weibo_id替換為該微博id即可。
爬取數據
- 如今找到了微博評論的API,后面的事情就輕車熟路了。上requests,發get請求,傳入帶有cookies的header即可。cookies就是自己微博登陸的cookies,可以使用chrome開發者工具獲得。如百度的cookies可以通過network標簽頁下,選擇某一文檔獲得。

直接上代碼比較直觀:
i=0 # 評論的頁數
comment_num=1 # 爬取的評論總數量
while True:
try:
req=requests.get(url=url.format(i),headers=headers)
comment_page=req.json()['data']
if req.status_code==200:
print('讀取%s頁的評論:'%i)
for j in range(0,len(comment_page)):
print('第%s條評論'%comment_num)
user=comment_page[j]
comment_id=user['user']['id']#評論id
print(comment_id)
user_name=user['user']['screen_name']#發表評論的用戶名
print(user_name)
create_at=user['created_at']#發表時間
print(create_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)#防止反爬蟲機制,停止一會~~~~
else:
break
except:
i+=1
pass
現在我們已經獲取到了微博的評論,我們就把他們用Mysql存儲起來,以待后面的使用。我們使用pymysql這個包來操作Mysql,一個簡單的操作代碼如下:
class Sql(object):
def __init__(self):
pass
def connect_sql(self):
self.conn=pymysql.connect(host='127.0.0.1',user='root',password='1111',charset='utf8',use_unicode=False)
self.cur=self.conn.cursor()
def insert_data(self,comment_id,user_name,create_at,text,likenum,source):
#數據庫名為nlp,表名為luhan
sql='insert into nlp.luhan(comment_id,user_name,created_at,text,likenum,source) values(%s,%s,%s,%s,%s,%s)'
param=(comment_id,user_name,create_at,text,likenum,source)
try:
self.cur.execute(sql,param)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
這個類定義了一個insert_data函數,連接Mysql后,將上面的comment_id,user_name,create_at,text,likenum,source傳入函數即可存入Mysql。
至此,就可以把某條微博的評論獲取到本地了。
