Bilibili Spider 经验总结

来源:互联网 发布:nginx wiki 编辑:程序博客网 时间:2024/05/16 15:37

前些天一朋友让我帮忙写个脚本爬一下Bilibili的数据,说是大数据的课程需要做一个小项目,自己打算用bilibili的评论弹幕数据做一下分析。其实写爬虫这个我之前也不是很了解,不过想想B站的数据应该是很多人都感兴趣的,各种数据接口什么的估计早就有人找过,再加上朋友说这事也不是很紧急,我就答应下来了,就当是复习复习python,了解一下写爬虫的基本方法,说不定以后就用得上。

国庆第二天,上海这边的天气不太好,看起来总像是就要下大雨,所以干脆就待在家里了,反正闲着也是闲着就想到之前这个脚本的事,乘着这回儿没事干脆就把他写了。

需求分析

按照之前朋友给我的要求,他需要主要信息是视频的评论和弹幕数据。不过想一想做数据分析也得有个边界啊,B站这么多视频到底需要哪些视频的数据呢?最好就是能够提供一个关键词搜索这个关键词相关的视频,同时也能够根据需要取合适数量的数据。获取数据后将数据存储到文件中

以上,这个脚本需要的就是接受一个关键词参数和视频数量参数。根据这个关键词所有给定数量的视频,将视频的基本信息和评论弹幕信息输出到文件中。

数据接口

首先我们需要从关键字找到视频地址,显然这需要视频搜索接口。这个很简单直接打开Bilibili,尝试搜索一下,浏览器上的URL就是搜索接口。如下:
search.bilibili.com/all?keyword=

其他的接口可以自己分析视频页面或者直接google一下就可以找到。比如
https://zhuanlan.zhihu.com/p/24599052
就分析了各种Bilibili的接口信息,当让我想要的评论和弹幕都在里面可以找到。

我在找到这些接口之后发现,所有的接口都需要aidcid做为接口参数。所以获取视频的这两个ID很重要。之前我是直接打开视频页面用chrome的开发者工具在页面源代码中直接查找关键词的,但是发现这样不太靠谱,由于js的执行,页面的可能相比于一开始Get后的返回页面已经发生了变化。所以,首先要做的是禁用js然后查找。

工具

urllib.request
beautifulSoup4
一个用来获取页面,一个用来解析页面。

遇到的问题

使用request构造请求的时候可以指定一个请求头,可以用来说明客户端的一些信息:

headers = {    'User-Agent' : r'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '\            r'(KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',    'Accept-Encoding' : r'gzip, deflate'}

指定User-Agent字段是为了将爬虫伪装成浏览器,有些网站在没有指定User-Agent的时候会认为该请求来自爬虫而不返回任何信息;Accept-Encoding字段说明客户端接收的压缩算法类型,这可以避免服务器使用一些我们不方便解析的压缩方法。

压缩

在发送请求的时候我们指定了客户端可以接受的编码类型。返回时,服务器将有可能使用其中的某一个算法压缩返回报文,具体的压缩方法将会在返回报文的header中指出(Content-Encoding字段)。以下代码从返回报文的header中获取压缩算法,使用指定的算法解压并解码返回报文成字符串。

def getPage(url):    """    从url获取解码后的页面    """    req = request.Request(url, headers=headers)    rsp = request.urlopen(req)    encoding = rsp.info()['Content-Encoding']    if encoding == 'gzip':        page = gzip.decompress(rsp.read())    elif encoding == 'deflate':        try:            page = zlib.decompress(rsp.read(), -zlib.MAX_WBITS)        except zlib.error:            page = zlib.decompress(rsp.read())    else:        page = rsp.read()    return page.decode('utf-8')

本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

请求URL中的中文编码

视频搜索是GET请求,搜索关键子在URL中。当关键字中有中文时,拼接URL首先需要将中文编码,如下:

url = searchBaseUrl % {"keyword": urllib.parse.quote(subject), "pn":pagenum}

其中subject代表的字串可能包含中文字符,urllib.parse.quote()方法实现中文字符的编码。

中文字符写入文件

某些中文字符直接写入文件会报编码错误,我也不知道为啥,解决方案是以二进制方式打开文件并写入UTF-8编码后的二进制数据:

file = open(fileName, 'wb')file.write((stri + '\r\n').encode('utf-8'))
原创粉丝点击