原理 弹幕获取原理
爬虫部分 一个爬虫程序大体是这个样子:
1 2 3 4 5 6 7 8 9 10 11 import requestsmyUrl = 'https://fanyi.baidu.com/sug' myHeader = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36' } myDate = { 'kw' : 'love' } response = requests.post(url = myUrl, data = myDate, headers = myHeader)
其中,爬取页面数据,只是那个requests.post()函数,其他部分都是参数,其中,post是一种请求方式,还有一种,是get,它们两个有很大区别,在我们 写爬虫时,表现为写法不同,详细了解可以去百度一下QAQ。
url参数,即为目标网址。
data参数,即为发送的数据内容(可以理解为往目标页面的某个地方输入内容, 或者点击某个部分)
header参数,这个参数记录了这个数据包是由谁发起,使用什么浏览器的等内容
假如我们用的是Chrome浏览器,我们随便打开一个网址,右键,”检查“,”Network“部分,刷新页面,随便点一个,那就是我们数据包的样子。
我们先手动进行这个操作,那么header部分就是我们手动操作产生的,但是如果我们不做修改,直接用程序发包,那么这个header部分就会不一样,就有可能会被 网站识别,其中最主要部分就是这个’User-Agent’部分。
data部分 假如我们想要一个在一个页面中显示搜索某个内容得到的结果(或者点击一些内容),那么就要修改data部分了,那么改如何获取呢?
首先我们在页面的搜索框(假设我们要搜索),搜索的时候打开”检查“部分,还是network部分,点击页面中的搜索时,就会产生很多数据包
点击与搜索相关的数据包(可能需要找一下,可以试着找带有”search“相关的数据包),往下拉,一般在下面有一个”Query String Parameters“ (会根据请求方式时get还是post而发生改变),我们可以根据里面的参数值是否有我们刚才输入的内容来判断。 里面记录的就是 data内容,把它们复制下来粘贴到自己的data参数中即可
后续处理(BeautifulSoup) 我们是把整个页面的html对象爬取下来了,那么我们改如何储存它呢?
这时我们就用到了BeautifulSoup这个库,它能很好地帮助我们去处理爬取的网站页面。(详细内容可以百度搜索或者直接查看它的文档,这里只做简单说明QAQ)
由于爬取的页面返回的是byte形式,且是以utf-8格式编码的,所以我们要把它转化为unicode格式(具体见下面代码,详细可以去百度)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 response = requests.get(url = dUrl, headers = myHeaders) response.encoding='utf-8' content = response.content.decode(response.encoding) soup = BeautifulSoup(content, 'xml' ) result = soup.find_all('d' ) f = open ("bilibili.txt" , "w" , encoding='utf-8' ) barrage = {} for i in result: if i.text in barrage: barrage[i.text] = barrage[i.text] + 1 else : barrage[i.text] = 1 num = 0 keyWords = '' for txt, sum in sorted (barrage.items(), key=lambda barrage: barrage[1 ], reverse=True ): f.write(txt + ' : ' + str (sum )) f.write('\n' ) if num > 4 : continue else : num = num + 1 keyWords = keyWords + ' ' + txt f.close()
完整代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 from bs4 import BeautifulSoupimport requestsimport jsonimport easygui as gimport snownlpmyUrl = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1No4y127Zk&jsonp=jsonp' myHeaders = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36' } bvNum = g.enterbox(msg='请输入视频的BV号(‘BV’也要输入的,例如:BV17p4y1z7hq)' , title='b站弹幕统计' ) myUrl = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bvNum + '&jsonp=jsonp' response = requests.get(url = myUrl, headers = myHeaders) d = json.loads(response.text) cid = d['data' ][0 ]['cid' ] dUrl = 'http://comment.bilibili.com/' + str (cid) +'.xml' response = requests.get(url = dUrl, headers = myHeaders) response.encoding='utf-8' content = response.content.decode(response.encoding) soup = BeautifulSoup(content, 'xml' ) result = soup.find_all('d' ) f = open ("bilibili.txt" , "w" , encoding='utf-8' ) barrage = {} for i in result: if i.text in barrage: barrage[i.text] = barrage[i.text] + 1 else : barrage[i.text] = 1 num = 0 keyWords = '' for txt, sum in sorted (barrage.items(), key=lambda barrage: barrage[1 ], reverse=True ): f.write(txt + ' : ' + str (sum )) f.write('\n' ) if num > 4 : continue else : num = num + 1 keyWords = keyWords + ' ' + txt f.close() print (keyWords)g.msgbox(msg="统计完成!结果输出在这个文件夹下的bilibili.txt里!>_<" + "\n" + "发送较多的弹幕为:" +"\n" + keyWords,title="b站弹幕统计" )