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的接口信息,当让我想要的评论和弹幕都在里面可以找到。
我在找到这些接口之后发现,所有的接口都需要aid
或cid
做为接口参数。所以获取视频的这两个ID很重要。之前我是直接打开视频页面用chrome的开发者工具在页面源代码中直接查找关键词的,但是发现这样不太靠谱,由于js的执行,页面的可能相比于一开始Get后的返回页面已经发生了变化。所以,首先要做的是禁用js然后查找。
工具
urllib.request
beautifulSoup4
一个用来获取页面,一个用来解析页面。
遇到的问题
header
使用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'))
- Bilibili Spider 经验总结
- Spider
- spider
- Spider
- spider
- spider
- spider
- Spider
- Spider
- 经验总结
- 经验总结
- 经验总结
- 经验总结
- 经验总结
- 经验总结
- 经验总结
- 经验总结
- 经验总结
- hdu 1724 Ellipse(自适应Simpson积分) (模板)
- Progress of 96Board Camera MIPI Mezzanine
- SoftMax回归简介及python代码实现
- 大学生职业生涯规划
- luogu3009 [USACO11JAN]利润Profits
- Bilibili Spider 经验总结
- UVa213 Message Decoding
- qsort
- RMQ与用RMQ做LCA
- CentOS下载安装Nginx, 详情配置Nginx和对Nginx进行性能优化
- 生成树协议STP和快速生成树协议RSTP的配置及原理
- 【猫猫的Unity Shader之旅】之高斯模糊
- 1073. 多选题常见计分法(20)
- 以知乎为例试探讨一种万能模拟登陆方式