微博爬虫系列之博文评论爬取

前言

之前写的微博爬虫系列还没写完,想起来继续写下去。近期看了下爬取微信公众号文章的方法,也写了相关的代码,之后再看看写成博客吧~
本篇主要针对怎么对指定博文下的评论进行爬取。
准备写的内容:

微博热门内容及榜单的博文爬取 微博爬虫系列之微博榜单博文爬取
定向关键词及指定用户博文爬取 微博爬虫系列之关键词及指定用户博文爬取
博文评论爬取 微博爬虫系列之博文评论爬取
微博用户信息爬取

针对博文评论的爬取,采用的仍然是微博网页版https://weibo.cn,在爬取时仍然需要cookies,获取方式可参照微博爬虫系列之关键词及指定用户博文爬取

这里随便选用一个人民日报的微博博文进行评论的爬取。首先需要获取博文的评论页数,由于微博的一些反爬措施,并不能完全爬取到所有页面。为了尽可能地爬取多一些评论,这里将评论热门页面与默认页面都爬取下来。

import re
from urllib import request
cookies = '你的cookies'
headers = {
      "user-agent": get_random_ua(),
      'Cookie' : cookies,
    }
page_res = requests.get(url, headers = headers)

查看网页源代码,可以看到点击查看更多热门的地方以及写着有多少页评论的地方:


在这里插入图片描述
hot_rank = re.search(r'查看更多热门', page_res.text)
all_page = re.search(r'/>&nbsp;1/(\d+)页</div>', page_res.text)

if all_page:
    all_page = all_page.group(1)
    all_page = int(all_page)
    all_page = all_page if all_page <= 50 else 50
    if hot_rank:
        hot_url = url.replace('comment', 'comment/hot')
        page_urls.append(hot_url)
        for page_num in range(2, all_page + 1):
            page_url = hot_url.replace('page=1', 'page={}'.format(page_num))
            page_urls.append(page_url)
            
    for page_num in range(2, all_page + 1):
        page_url = url.replace('page=1', 'page={}'.format(page_num))
        page_urls.append(page_url)

通过这样的方式,尽可能多地爬取评论数据。当然这样也会出现重复评论的情况,并且也不能完全爬取所有评论。目前想到的方法就只能尽可能地多爬一些,爬取后去重。

在获取了所有页面后,开始爬取每一页的评论内容。分析网页源代码可以看到每一个评论的标记是<div class = "c" id = ""></div>

在这里插入图片描述

对上面获取到的url进行循环爬取评论页面内容,下面用第一页作为例子,用lxml.etree进行解析与定位。

from lxml import etree
res = requests.get(url, headers = headers)    
tree_node = etree.HTML(res.text.encode('utf-8'))
comment_nodes = tree_node.xpath('//div[@class="c" and contains(@id,"C_")]')

通过这样子就可以定位到评论部分,返回的comment_nodes是一个列表,每个元素是一个评论的元素,每个评论内的内容可以看源代码:

在这里插入图片描述

这里假设只爬取评论用户id、评论用户名、评论id、评论内容、点赞数,其他项来源这些也是一样的(在上面就是来自网页)。

## 评论用户id
comment_user_url = comment_node.xpath('.//a[contains(@href,"/u/")]/@href')
## 这里是因为有的用户id貌似没有/u/,还有的不是数字
if comment_user_url:
    comment_user_id = re.search(r'/u/(\d+)', comment_user_url[0]).group(1)
else:
    comment_user_url = comment_node.xpath('.//a[contains(@href,"/")]/@href')
    if comment_user_url:
        comment_user_id = re.search(r'/(.*)', comment_user_url[0]).group(1)

## 评论用户名
comment_user_name = str(comment_node.xpath('./a/text()')[0])
## 评论id
comment_id = str(comment_node.xpath('./@id')[0])
## 评论内容
content = extract_comment_content(etree.tostring(comment_node, encoding='unicode'))
## 点赞数
like_num = comment_node.xpath('.//a[contains(text(),"赞[")]/text()')[-1]
comment_item['like_num'] = int(re.search('\d+', like_num).group())

这里还会涉及到可能有的评论会有评论配图的情况,可以对应的下载图片。假设出现评论配图时,会有评论配图的字眼:

##### 保存照片
def savePics(picUrl, filename , path):
    headers = {
      "user-agent": get_random_ua(),
    }
    
    # 目录不存在,就新建一个
    if not os.path.exists(path):
        os.makedirs(path)
    picID = picUrl.split('/')[-1].split('?')[0].split('.')[0]
    Suffix = picUrl.split('/')[-1].split('?')[0].split('.')[-1]
    pic_path = ''.join([path, '/', filename, '.', Suffix])
    req = request.Request(picUrl, headers = headers)
    data = request.urlopen(req, timeout=30).read()
    f = open(pic_path, 'wb')
    f.write(data)
    f.close()
    
if '评论配图' in content:
    comment_pic_url = etree.tostring(comment_node, encoding='unicode').split('class="ctt">', maxsplit=1)[1].split('举报', maxsplit=1)[0]
    comment_pic_url = re.search(r'<a href="(.*)">评论配图', comment_pic).group(1)
    savePics(comment_pic_url , filename  = 'filename', path = 'your_path')

到这里爬取微博博文评论数据的操作就结束啦~ 其他的看自己的需求写完整的代码即可。在爬取过程中可能会出现爬不到的情况,可以用一些判断语句跳过这些爬不到的情况,爬取的时候也需要稍微停一下不然会被封号。之后再接着写爬取微博博文系列的最后一篇吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352