简单的爬取B站视频评论

2019年12月20日15:14:09补充: 这篇博客为刚学爬虫的一个简单实践,主要使用到的为selenium模拟点击
补充说明的主要原因是有小伙伴问我评论提取的相关问题,这里统一回复一下

最简单的办法是直接调用B站的APIhttps://api.bilibili.com/x/v2/reply?pn=2&type=1&oid=79864024&sort=2 请求这个接口,oid是视频的av号,pn为页码,可以得到json数据
不要直接点,复制到浏览器地址栏打开

简单的爬取B站视频评论
技术不足还请大神多多包涵

说一下写这篇博客的缘由,我弄了半天终于把爬取程序写好了,把爬取的数据一部分在某个QQ群中展示一下,结果就出现了以下几个奇葩
展示的数据截图
奇葩一号
奇葩一号
奇葩一号
奇葩二号
奇葩二号

可能这就是键盘侠吧
整理一下心情我们回归正题
B站的视频评论区需要滑动窗口滚动条才能被加载出来,代码放在了js中,因此,如果直接用Requests的get方法无法获取评论区源码,如果有大佬会的可以在评论区留言。
这里我使用selenium中的webdriver方法实现组件元素交互。

import re
import requests
from selenium import webdriver
from requests.exceptions import RequestException
import time

# 获取评论第一页的源码
def get_first_page_source(url,content_list):
    browser = webdriver.Chrome()
    browser.get(url)
    browser.execute_script('window.scrollBy(0,2000)')#调用js代码实现滑动
    time.sleep(4)#等待加载完毕
    content_list.append(browser.page_source)
    return browser.page_source

# 获取评论总页数
def get_max_size_page_info(html):
    pattern = re.compile('<div.*?header-page.*?result">共(\d+)页</span>',re.S)
    return re.findall(pattern,html)[0]

# 获取其他页的源码
def get_more_page_source(url,content_list):
    browser = webdriver.Chrome()
    # browser.set_window_size(1000,30000)
    browser.get(url)
    browser.execute_script('window.scrollBy(0,2000)')#调用js代码实现滑动
    time.sleep(4)#等待加载完毕
    content_list.append(browser.page_source)
    max_size = int(get_max_size_page_info(get_first_page_source(url,content_list)))
    for i in range(max_size-1):
        next_btn = browser.find_element_by_css_selector('div.comment-header div.header-page a.next')#使用css选择器选择下一页a标签

        next_btn.click()
        time.sleep(1.5)
        content_list.append(browser.page_source)


# 获取评论信息
def get_comment(content):
    # 使用正则表达式匹配
    pattern = re.compile('<div.*?list-item.*?data-id="(\d+)".*?con.*?">.*?data-usercard-mid="(\d+)".*?name.*?">'
                             + '(.*?)</a>.*?<p.*?text">(.*?)</p>.*?</div>.*?</div>',re.S)
    for item in content:
        info = re.findall(pattern,item)
        for info_item in info:
            # 使用生成器规范化数据
            yield {
                'comment_id':info_item[0],
                'user_id':info_item[1],
                'user_name':info_item[2],
                'comment_text':info_item[3]
            }
    # return info


def main():
    url = '填写需要爬的视频页网址'
    comment_list = []
    get_more_page_source(url,comment_list)
    get_comment(comment_list)

    with open('D://comment_list.txt','a',encoding='utf-8') as f:
        for item in get_comment(comment_list):
            f.write(str(item) + '\n')
    print(len(comment_list))


if __name__ == '__main__':
    main()

部分输出数据

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页