前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列

实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列

作者头像
SingYi
发布2022-07-14 15:08:42
7970
发布2022-07-14 15:08:42
举报
文章被收录于专栏:Lan小站Lan小站

从这周开始,每周来一个爬虫小教程,希望对你们有所帮助,这次的目标是B站排行榜

image.png
image.png

至于爬取什么内容,目前感觉就把序号,名称以及评分爬取下来吧(因为我是边写教程边写代码的)

这次需要用到的知识:

Python基础知识 Requests模块 Xpath模块(说白了就是HTML) 有看我的博客:www.lanol.cn

首先来到这个页面https://www.bilibili.com/ranking/all/0/0/1,目前是全站榜,我们尝试切换到原创榜,就会发现网址栏对应的网址改变了,所以我们只需要修改网址就可以获取想要的榜单(我不确定会不会每天都变,没观察)

image.png
image.png
image.png
image.png

然后改变这个投稿类型和日期网址也会改变

image.png
image.png

到这里我们就已经获取到想要爬取的网址了。request中的url也就确定了。

代码语言:javascript
复制
url = ‘https://www.bilibili.com/ranking/all/0/0/1’

我们按快捷键Ctrl+U,查看源代码,然后搜索一下排行第一的视频。

image.png
image.png

我们可以发现在源代码里面有,这样的话我们就可以直接用requests模块获取源码,再利用Xpath解析网页了。有关Xpath的时候方法可以看这篇文章Python爬虫:Xpath语法笔记

然后来开始写代码,第一步永远都不会变的,先导入Requests模块和将网页源码转换为可以Xpath的模块(这两个模块如果没有可以pip一下,博客内也有教程,搜索即可)

代码语言:javascript
复制
import requests
import parsel

然后就是做一个请求头(伪装成普通浏览器去访问),一般来说刚开始只加一个user-agent就可以了,如果有反爬机制,再去加。

请求头也就是这一块

image.png
image.png

我们一开始只放一个user-agent进去

image.png
image.png

user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36

我们复制下来之后是上面这样的,然后我们要转换成Python里面字典的格式。也就是加个引号就行了。

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'

然后放到Python代码中就是这样子的。

代码语言:javascript
复制
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}

这样requests模块中的headers就构造好了

然后就是写上这一句就可以获取到源码了。

代码语言:javascript
复制
response = requests.get(url=url, headers=headers).text

这句话的意思就是调用requests模块,然后get请求这个url,最后将获取到的内容取text格式然后赋值给response。

我们来执行看一下,不要忘记输出一下哦。

image.png
image.png

这样子我们的页面源码就获取到了,而且里面可以看到我们之前搜索的排行第一的视频:【官方MV】Mojito - 周杰伦。

然后我们回到网站,右键视频标题,点击检查。

image.png
image.png

我们再在源码这右键一下,点击Copy,点击Copy Xpath,这样Xpath就复制下来了,动画演示:原文地址:www.lanol.cn

复制Xpath.gif
复制Xpath.gif

//*[@id="app"]/div[1]/div/div[1]/div[2]/div[3]/ul/li[1]/div[2]/div[2]/a

我们将这句Xpath粘贴到浏览器插件里面测试一下。

image.png
image.png

可以看见我们已经可以选中这句标题了,然后我们再利用HTML知识修改一下这句话,就可以获取到所有标题了。

//div[2]/div[2]/a

image.png
image.png

我们放到Python里面执行一下。

image.png
image.png

发现获取的内容似乎有点多,这里不仅把标题弄出来了,而且还将这句代码弄出来了,我们在后面加一个text()只获取文本内容。

image.png
image.png

这样就可以了,我们再来试一下获取分数。一如之前的操作,右键分数,点击检查,再在代码处右键,点击Copy,点击Copy Xpath。

//*[@id="app"]/div[1]/div/div[1]/div[2]/div[3]/ul/li[20]/div[2]/div[2]/div[2]/div

image.png
image.png

再修改一下这句话,以获取我们想要的全部内容。

//div[2]/div[2]/div[2]/div/text()

image.png
image.png

然后放到Python里面执行一下。

image.png
image.png

成功获取所有分数。

综上我们想要获取的信息都已经取到了。

然后就是写到表格之中,这里为了方便直接写到csv即可。直接贴代码了。

代码语言:javascript
复制
with open('B站排行榜www.lanol.cn.csv', 'w') as f:
    f.write('标题,分数
')
    for index, i in enumerate(titles):
        f.write(f'{i},{grades[index]}
')
image.png
image.png

这样子,就可以了,这个只是一个思路,获取更多信息你可以自由发挥。

所有代码一共才17行,人生苦短,Python当歌,其实其他语言也可以,只是麻烦了一点而已。

所有代码如下:

[CommShow]

代码语言:javascript
复制
import parsel
import requests

url = 'https://www.bilibili.com/ranking/all/0/0/1'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response = requests.get(url=url, headers=headers).text
response = parsel.Selector(response)
# www.lanol.cn Lan的小站
titles = response.xpath('//div[2]/div[2]/a/text()').extract()
grades = response.xpath('//div[2]/div[2]/div[2]/div/text()').extract()
with open('B站排行榜www.lanol.cn.csv', 'w') as f:
    f.write('标题,分数
')
    for index, i in enumerate(titles):
        f.write(f'{i},{grades[index]}
')
print(grades)

[/CommShow]

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档