微博热门评论JSON文件爬取与数据处理技巧详解

[复制链接]
查看10 | 回复0 | 3 小时前 | 显示全部楼层 |阅读模式
<p><pre>    <code>&#39;https://m.weibo.cn/api/comments/show?id=&#39; + 单条微博id + &#39;&page=&#39; + 页码
</code></pre></p>
在社交媒体数据挖掘领域,微博信息的处理既具独到价值,亦面临诸多挑战。新浪提供的数据中,json格式的条目数量呈现随机性,这种现象常引发翻页时数据的重复问题,成为亟待解决的关键问题。

<p><pre>    <code>import re,time,requests,urllib.request
weibo_id = input(&#39;输入单条微博ID:&#39;)
# url=&#39;https://m.weibo.cn/single/rcList?format=cards&id=&#39; + weibo_id + &#39;&type=comment&hot=1&page={}&#39; #爬热门评论
url=&#39;https://m.weibo.cn/api/comments/show?id=&#39; + weibo_id + &#39;&page={}&#39; #爬时间排序评论
headers = {
    &#39;User-agent&#39; : &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0&#39;,
    &#39;Host&#39; : &#39;m.weibo.cn&#39;,
    &#39;Accept&#39; : &#39;application/json, text/plain, */*&#39;,
    &#39;Accept-Language&#39; : &#39;zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3&#39;,
    &#39;Accept-Encoding&#39; : &#39;gzip, deflate, br&#39;,
    &#39;Referer&#39; : &#39;https://m.weibo.cn/status/&#39; + weibo_id,
    &#39;Cookie&#39; : &#39;登录cookie信息&#39;,
    &#39;DNT&#39; : &#39;1&#39;,
    &#39;Connection&#39; : &#39;keep-alive&#39;,
    }
i = 0
comment_num = 1
while True:
    # if i==1:     #爬热门评论
    #     r = requests.get(url = url.format(i),headers = headers)
    #     comment_page = r.json()[1][&#39;card_group&#39;]
    # else:
    #     r = requests.get(url = url.format(i),headers = headers)
    #     comment_page = r.json()[0][&#39;card_group&#39;]
    r = requests.get(url = url.format(i),headers = headers)  #爬时间排序评论
    comment_page = r.json()[&#39;data&#39;]
    if r.status_code ==200:
        try:
            print(&#39;正在读取第 %s 页评论:&#39; % i)
            for j in range(0,len(comment_page)):
                print(&#39;第 %s 条评论&#39; % comment_num)
                user = comment_page[j]
                comment_id = user[&#39;user&#39;][&#39;id&#39;]


                print(comment_id)
                user_name = user[&#39;user&#39;][&#39;screen_name&#39;]
                print(user_name)
                created_at = user[&#39;created_at&#39;]
                print(created_at)
                text = re.sub(&#39;<.*?>|回复<.*?>:|[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]&#39;,&#39;&#39;,user[&#39;text&#39;])
                print(text)
                likenum = user[&#39;like_counts&#39;]
                print(likenum)
                source = re.sub(&#39;[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]&#39;,&#39;&#39;,user[&#39;source&#39;])
                print(source + &#39;\r\n&#39;)
                comment_num+=1
            i+=1
            time.sleep(3)
        except:
            i+1
            pass
    else:
        break
</code></pre></p>
新浪数据的随机性

新浪提供的json数据量每次返回均呈现随机性,这一现象在爬虫操作中带来了一定难度。在X日某次实践中,有数据挖掘者观察到,这种随机性导致翻页后数据重复出现的频率显著增加。这一现象并非孤立案例,众多数据挖掘项目均面临此问题。对爬虫程序来说,这种不确定性无疑提高了数据处理成本。此外,数据重复不仅造成资源浪费,还可能对后续数据分析的准确性造成影响,例如基于数据计算出的比例、趋势等。

从技术角度看,此类随机性导致的重复问题难以仅通过数据收集初期阶段得到解决。必须在后端数据处理阶段实施严格筛选,从而保障用于分析的最终数据集的精确性和适用性。

数据的预处理

处理文本与来源中嵌入的emoji表情是一项繁复的任务。程序员Y曾在X月份投入大量时间进行这一工作。这些表情在数据库写入过程中遭遇了重重困难,原因是数据库的编码与解析规则通常难以有效应对这类特殊字符。此外,还需移除其中穿插的回复他人的HTML代码,这也是一项不可或缺的操作。

HTML代码中包含众多标签与属性,这些元素在纯文本格式的数据库记录中缺乏实际意义。若不予以移除,将严重干扰数据提取与后续分析工作,进而影响文本分类、情感分析等处理结果的准确性。

爬虫循环判断的漏洞

爬虫程序以网络状态码200作为循环结束条件存在明显缺陷。在多次测试中,微博一旦识别出爬虫访问,便返回一个空白的网页,导致程序出错。例如,在最近的某个测试项目中,由于微博返回了空白页面,程序突然停止运行,之前辛苦收集的数据瞬间丢失。

<p><pre>    <code>conn =pymysql.connect(host=&#39;服务器IP(默认是127.0.0.1)&#39;,user=&#39;服务器名(默认是root)&#39;,password=&#39;服务器密码&#39;,charset="utf8",use_unicode = False)    #连接服务器
cur = conn.cursor()
sql = "insert into xue.xueresponse(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()
</code></pre></p>
该问题的根本原因在于循环判断条件的单一性过于简单。同时,这一现象使我们认识到,爬虫的稳定运行不仅受限于网络访问情况,还需综合考虑目标网站的反爬虫策略等因素。

数据库作为解决方案

面对爬虫可能出现的断线风险,数据库显现出其重要性。以MySQL数据库为例,在爬虫运行期间实时保存数据显得尤为关键。在一场持续10小时的测试中,每小时平均抓取2000条数据。若爬虫程序意外中断,数据库存储功能可确保数据安全,如同为数据存储增设了一道保障。

<p><pre>    <code>conn =pymysql.connect(host=&#39;服务器IP&#39;,user=&#39;用户名&#39;,password=&#39;密码&#39;,charset="utf8")    #连接服务器
with conn:
    cur = conn.cursor()
    cur.execute("SELECT * FROM xue.xueresponse WHERE id < &#39;%d&#39;" % 20000)
    rows = cur.fetchall()
</code></pre></p>
针对mac操作系统用户,软件Navicat提供了数据库管理的辅助工具。然而,该软件的安装仅限于mac系统。对于使用其他操作系统的用户,他们需要寻找适用于自身系统的管理方案。

微博的反爬虫策略与应对

<p><pre>    <code>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]])
</code></pre></p>
使用Python执行数据抓取是常规操作,但新浪微博的抗爬虫措施颇为坚固。在一场规模较大的爬虫测试中,当抓取到约2万条实时评论时,便遭遇了多道关卡。针对此问题,存在两种解决途径:一是更替IP地址,有经验的爬虫开发者曾记录过如何使用IP代理;二是更换账号,用户可在X宝购买账号进行操作。然而,这两种方法要么要求掌握复杂的代理技术,要么可能遭遇账号安全等种种挑战。

情感分析的困境

<p><pre>    <code>def snowanalysis(textlist):
    sentimentslist = []
    for li in textlist:
        s = SnowNLP(li)
        print(li)
        print(s.sentiments)
        sentimentslist.append(s.sentiments)
</code></pre></p>
在对微博评论进行情感分析时,存在诸多问题。借鉴现有情感分析算法的分析结果显示,错误率显著。以某明星事件为例,涉及该明星、李雨桐和高磊鑫,由于评论主体难以明确识别,且粉丝间的互动复杂,算法在判断评论针对对象情感时遭遇极大困难。分析表明,针对微博评论这类包含复杂人际互动和模糊话题指向的内容,现有算法尚有较大提升空间。

众多问题面前,如何高效全面地改进微博数据的抓取与解析流程?各位读者可在评论区提出见解。若本文对您有益,请勿忘点赞并转发。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则