简单的爬取B站视频评论

版权声明:所有源码仅供参考学习使用,请勿用作违法犯罪活动 https://blog.csdn.net/Tomsidi/article/details/81489871

简单的爬取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()

部分输出数据

猜你喜欢

转载自blog.csdn.net/Tomsidi/article/details/81489871