美文网首页Python新世界
Python网页爬虫,get一种表白方式!

Python网页爬虫,get一种表白方式!

作者: 919b0c54458f | 来源:发表于2018-12-31 13:34 被阅读0次

常用库

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)

结果截图:

还是有很多地方可以优化的,不过回忆一下这段时间的学习过程,就是’看不懂‘,’不会写‘,‘不敢问’。就怕问了以后,得到这样的回复:

然后还是鼓足勇气问了大神,得到答案以后是可以得到结果,但不省事,里面的每一个小细节你都不敢改,编程还是需要一种思路清晰的感觉,不能一团浆糊。大神说要去看文档,不过我每次看完文档,就仿佛是这样:

回到自己的问题就懵了,说白了,还是害怕思考吧,容易脑壳疼。啊,不过熬过去,慢慢理解以后,真的是无敌超级开心!这段时间能感觉到自己在逃避,不过直面以后,好像问题也没那么可怕,如果你也在学习编程语言,可以留言,一起交流。

相关文章

网友评论

    本文标题:Python网页爬虫,get一种表白方式!

    本文链接:https://www.haomeiwen.com/subject/qgwilqtx.html