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

Lan
Lan
2020-06-13 / 6 评论 / 1,903 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2020年06月13日,已超过1406天没有更新,若内容或图片失效,请留言反馈。

从这周开始,每周来一个爬虫小教程,希望对你们有所帮助,这次的目标是B站排行榜image.png至于爬取什么内容,目前感觉就把序号,名称以及评分爬取下来吧(因为我是边写教程边写代码的)

这次需要用到的知识:

Python基础知识

Requests模块

Xpath模块(说白了就是HTML)

有看我的博客:www.lanol.cn

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

然后改变这个投稿类型和日期网址也会改变image.png到这里我们就已经获取到想要爬取的网址了。request中的url也就确定了。

url = ‘https://www.bilibili.com/ranking/all/0/0/1’

我们按快捷键Ctrl+U,查看源代码,然后搜索一下排行第一的视频。image.png我们可以发现在源代码里面有,这样的话我们就可以直接用requests模块获取源码,再利用Xpath解析网页了。有关Xpath的时候方法可以看这篇文章Python爬虫:Xpath语法笔记

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

import requests
import parsel

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

请求头也就是这一块image.png我们一开始只放一个user-agent进去

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代码中就是这样子的。

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就构造好了

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

response = requests.get(url=url, headers=headers).text

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

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

image.png

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

然后我们回到网站,右键视频标题,点击检查。image.png我们再在源码这右键一下,点击Copy,点击Copy Xpath,这样Xpath就复制下来了,动画演示:原文地址:www.lanol.cn

复制Xpath.gif

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

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

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

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

image.png

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

image.png

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

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

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

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

image.png

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

image.png

成功获取所有分数。

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

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

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

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

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

所有代码如下:


[CommShow]

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]

0

评论 (6)

取消
  1. 头像
    访客w 作者
    Linux · Safari

    棒!

    回复
  2. 头像
    访客w 作者
    Linux · Safari

    棒!

    回复
  3. 头像
    访客w 作者
    Linux · Safari

    棒!

    回复
  4. 头像
    访客w 作者
    Linux · Safari

    棒!

    回复
  5. 头像
    访客w 作者
    Linux · Safari

    棒!

    回复
  6. 头像
    访客w 作者
    Linux · Safari

    棒!

    回复