简单的爬取B站视频评论

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

最简单的办法是直接调用B站的API: 请求这个接口,oid是视频的av号,pn为页码,可以得到json数据 不要直接点,复制到浏览器地址栏打开

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

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) + 
)
    print(len(comment_list))


if __name__ == __main__:
    main()

部分输出数据

经验分享 程序员 微信小程序 职场和发展