python抓取网页数据(学习一门新语言必要的两个步骤。(一) )
优采云 发布时间: 2022-03-21 09:16python抓取网页数据(学习一门新语言必要的两个步骤。(一)
)
首先,这不是教程文章,我才学了三天。把这三天学习中的收获分享给大家,为了启发他人,仅此而已,如有错误,请指出,我会认真观察并改正。
跟进:
首先,在我学习爬虫之前,我所有的编程经验都来自于我本科时学习的C语言以及后来从事的项目(本科和硕士)中低级编程的经验。所以在此之前我从来没有接触过C以外的高级语言和web编程的相关知识(我分不清Http和HTML的区别)。
我这样做有三个原因:
先说主要目的,就是解决问题。我想要实现的是获取特定up主的所有视频信息。为了完整记录我的学习过程,我在手机上的备忘录中写了我每天所做的工作总结,所以我接下来就以此为大纲。
第一天
第一天我做了什么?第一天的备忘录如下:
稍微想了一下python,就在B站写了一个爬取某up的所有视频数据的小工具。B站提供了api,所以很方便,只需要找所有视频的帮助即可。统计的结果很有意思,回来整理一下,写成文章,尝试使用requests,bs4和selenium这三个包。他们爬出来的html源码不一样。难道是因为requests只能爬取静态数据,selenium可以爬取动态数据吗?我觉得后者效率很低。我总结了一天的工作,深夜在床上睡觉。
稍微思考了一下python之后,我先搭建了一个python开发环境,用一些简单的程序尝试了python的语法规范。这是学习一门新语言所必需的两个步骤。搭建开发环境,可以参考王叔一老师的文章和视频:
/blog-377709-1102168.html
B站提供api。这里解释一下api是什么意思程序接口。api是为方便第三方程序开发者快速获取网站或程序的必要信息而建立的接口。进入B站的api界面,只需要访问以下链接
视频 av170001 的 api
进入视频av170001的api链接后,可以看到视频的一些基本信息如下:
{
"code":0,
"data":
{
"aid":170001,
"view":11748705,
"danmaku":556419,
"reply":69672,
"favorite":340343,
"coin":61905,
"share":297281,
"now_rank":0,
"his_rank":13,
"like":22064,
"no_reprint":0,
"copyright":2
},"
message":"0","ttl":1
}
比如播放数:11748705,评论数:69672,弹幕数:556419等。但是没有上传时间,这个我后面再说。也就是说,当知道视频的辅助时,可以通过api获取视频的各种信息。那么如果你得到了up主的所有视频的帮助,它就成为了问题的关键。当然,在第一天,先尝试解决一个简单的问题,然后是已知援助获得的视频评论数。
要解决这个简单的问题,需要用到两个python库,requests和BeautifulSoup。Requests 用于向网页发送请求,并获取网页的 html 源代码。先说一下什么是html源代码。如果现在按键盘的F12(*敏*感*词*键盘上按Fn再按F12),跳出来的一系列代码就是html源码。BeautifulSoup的主要作用是获取html的源码被整合成可读的形式,BeautifulSoup 会帮助转换编码格式,让可能的汉字不会被识别为乱码,下面四个短句可以实现可读的html源码:
DOWNLOAD_URL = 'http://api.bilibili.com/archive_stat/stat?aid=' + str
data = requests.get(DOWNLOAD_URL).content
soup = BeautifulSoup(data, "html.parser", from_encoding='utf-8')
text = soup.get_text()
此刻得到的文字就是打开的api链接中看到的文字。运行这四句话,我们可以看看结果:
下一个问题就变成了,如果你在文本中回复后得到一串数字。这里我使用 python 中的 find() 函数。如果键入 text.find('reply'),则函数的返回值是回复的第一个字符 r 的位置。text是一个字符串结构,在python中也可以理解为一个字符列表,输入text[0],你会发现输出的是文本字符串的第一个字符:'{'。如果'r'的位置是num_r,那么text[num_r] = 'r',对应的text[num_r + 7] = '6',也就是我们想要的数字的最高位。回复后号码的位置从 num_r + 7 开始,以逗号 ',' 结束。要查找逗号的位置,请使用 text.find(',"favorite"') 的返回值 num_f。在这种情况下,
字符串位置与字符的关系