常用库
Requests
BeautifulSoup
Re 正则表达式
基础知识
HTTP协议
Hypertext Transfer Protocol,超文本传输协议。
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议,采用URL(http://host[:port][path])作为定位网络资源的标识。
信息标记的表达形式
进群:960410445 即可获取数十套PDF!
XML格式,类似HTML格式标签形式来标记信息。
JSON(JavaScript Object Notation) 格式,由有类型的键值对将信息组织起来。
YAML(YAML Ain’t Markup Language)格式,由无类型的键值对,缩进形式区别, - 表达并列关系, | 表达整块数据,# 表示注释。
实战准备
我使用编辑器pycharm,利用anaconda安装第三方库。之前讲svg制作时的编辑器Sublime Text也是可以的。
爬取网易云音乐评论
输入:歌曲网址的url链接
输出:comments.txt文件
思路:step1 查看网页内容
step2 解析网页结构
step3 获取评论文件
就拿打字当前的歌曲为例,谭维维的《如果有来生》,歌曲的网址为:
https://music.163.com/#/song?id=293948
当你跳转到其他歌曲的时候,会发现只有Id后的数字变化,这时候alt+com+I打开开发者模式界面,点击network,刷新界面,慢速暂停,找到评论所在位置(网易云的评论文件格式google也能找到)。
记得私信菜鸟007哟
点击获得网址:
https://music.163.com/weapi/v1/resource/comments/R_SO_4_293948?csrf_token=
诶,发现里面的数字293948和之前音乐播放页面的编号一样,那么只要读取任意歌曲网址id后的数值,就可以得到任意歌曲的评论网址了。
开始!
import requests
import json
#定义函数获取评论网址
def get_comments(url):
name_id = url.split("=")[1] #歌曲id,等号分割后的第一个元素
#以下数据在红框的header中,作为url参数,发送Request
headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
'referer':'https://music.163.com/song?id=139774'}
params="t01CMznp4J6rYaxzDvAeMxLOnEvMOG8ktOqWqVvYe9dC8cHqv7BatxZffrCffE8uM4/GqPuMt20LVOXRcJoxMQ9rl3maJWU7m3rWGQUAfZ4YLQOUNYN8ixQuMtracLKsxX/3yE0G1wQXvxfgsAq7zn+tuzHdPa2K1iaMGAiamyM01hVmNPOnemxaJsmnGS6d"
encSecKey="65c7c4fe80ba0f56a9ac7dec690637ff7d3110c47eda387a4fb2d9a16d2df15c74c643ffad3398d6692f03df9e0d72b91382a573a4fda5b57e0d31a777b167bf8b9fdcf856cf586242c0a4552484a7ff37d8603b3f13cd2b04d73f7122f7cf005aa3a45495d405664419cf86d3fb35907bd4158e5f202eb861ec3dc856ecbc02"
data ={"params":params,"encSecKey":encSecKey}
# 歌曲评论网页
target_url="https://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token=".format(name_id)
# 变量res来表示request.post()方法获得的Response对象
res = requests.post(target_url,headers=headers,data=data)
return res
# 定义函数获取评论内容
def get_hot_comments(res):
comments_json = json.loads(res.text)
all_comments = int(comments_json["total"])
if (all_comments % 20 == 0): # 每页显示20个评论
page = all_comments / 20
else:
page = int(all_comments/ 20) + 1
print("共有%d页评论!" % page)
print("共有%d条评论!" % all_comments)
# 另存为评论文件
with open("comments.txt",'w',encoding='utf-8') as file:
for i in range(int(page)):
for each in comments_json["comments"]:
file.write(each['user']['nickname']+':')
file.write(each['content']+"")
file.write("--------------------")
#定义主函数
def main():
url = input("请输入链接地址:")
res = get_comments(url)
get_hot_comments(res)
# 运行
if __name__=="__main__":
main()
截图结果:
嗯?居然还有一句表白的,这是以最新评论顺序爬取的,那是不是可以在某一首歌曲下面评论你的心情,然后叫小姐姐去爬取,emmmmm...
存着,后续会学习数据分析内容,分词进行词云制作。
爬取B站弹幕、分析
思路同上,在写这篇笔记的时候,我把困惑了很久的问题解决了,并且完善了原始代码,突然觉得,为什么要丧半个月,冷静下来动动你的小脑筋,不就搞定了嘛!!!好生气!!!
B站弹幕的url也有固定的格式,这里是想爬取整一季的弹幕,当然也可以用来爬取单个视频的。(现在想想爬一个视频真简单啊hhh)
po上代码:
import requests
import re
from bs4 import BeautifulSoup
# 直接分析
def get_commend(url):
r = requests.get(url)
# 正则表达式,r为忽略转义符的使用,匹配cid后的数字
cids = re.findall(re.compile(r'"cid":d+'), r.text)
# 建一个列表存放网页cid,可以运行print查看
xml_url_list = []
for cid in cids:
xml_url_list.append("http://comment.bilibili.com/" + cid.split(':')[1] + '.xml')
xml_url_list.remove(xml_url_list[0]) # 首个会出现两次,所以移除一个
# 以列表形式存放弹幕,方便分析出现次数
commend = []
for xml_url in xml_url_list:
res = requests.get(xml_url)
soup = BeautifulSoup(res.content,'xml')
for d in soup.find_all('d'):
commend.append(d.get_text())
# 让结果以字典键值对:("评论内容":频数)形式展示
comment_list= {}
for i in commend:
if commend.count(i) > 1:
comment_list[i] = commend.count(i)
# sort排序
print(sorted(comment_list.items(), key=lambda item: item[1], reverse=True))
url = input("请输入链接地址:")
get_commend(url)
结果截图:
还是有很多地方可以优化的,不过回忆一下这段时间的学习过程,就是’看不懂‘,’不会写‘,‘不敢问’。就怕问了以后,得到这样的回复:
然后还是鼓足勇气问了大神,得到答案以后是可以得到结果,但不省事,里面的每一个小细节你都不敢改,编程还是需要一种思路清晰的感觉,不能一团浆糊。大神说要去看文档,不过我每次看完文档,就仿佛是这样:
回到自己的问题就懵了,说白了,还是害怕思考吧,容易脑壳疼。啊,不过熬过去,慢慢理解以后,真的是无敌超级开心!这段时间能感觉到自己在逃避,不过直面以后,好像问题也没那么可怕,如果你也在学习编程语言,可以留言,一起交流。
网友评论