zoukankan      html  css  js  c++  java
  • 获取数据——爬取某微博评论

    微博评论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+'
    ')
    
                        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。

    至此,就可以把某条微博的评论获取到本地了。

  • 相关阅读:
    全局对象
    公用属性与原型链
    内存图
    JS中数据类型的转换
    for in 遍历
    JS里的数据类型
    Collect~Something else
    Spring Batch学习笔记(一)
    C#之WinForm设置控件居中
    C#之使用AutoUpdater自动更新客户端
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307655.html
Copyright © 2011-2022 走看看