从这周开始,每周来一个爬虫小教程,希望对你们有所帮助,这次的目标是B站排行榜至于爬取什么内容,目前感觉就把序号,名称以及评分爬取下来吧(因为我是边写教程边写代码的)
这次需要用到的知识:Requests模块
Xpath模块(说白了就是Html)
有看我的博客:www.lanol.cn
首先来到这个页面https://www.bilibili.com/ranking/all/0/0/1,目前是全站榜,我们尝试切换到原创榜,就会发现网址栏对应的网址改变了,所以我们只需要修改网址就可以获取想要的榜单(我不确定会不会每天都变,没观察)
然后改变这个投稿类型和日期网址也会改变到这里我们就已经获取到想要爬取的网址了。request中的url也就确定了。url = ‘https://www.bilibili.com/ranking/all/0/0/1’
我们按快捷键Ctrl+U,查看源代码,然后搜索一下排行第一的视频。我们可以发现在源代码里面有,这样的话我们就可以直接用requests模块获取源码,再利用Xpath解析网页了。有关Xpath的时候方法可以看这篇文章Python爬虫:Xpath语法笔记。
然后来开始写代码,第一步永远都不会变的,先导入Requests模块和将网页源码转换为可以Xpath的模块(这两个模块如果没有可以pip一下,博客内也有教程,搜索即可)import requests
import parsel
然后就是做一个请求头(伪装成普通浏览器去访问),一般来说刚开始只加一个user-agent就可以了,如果有反爬机制,再去加。
请求头也就是这一块我们一开始只放一个user-agent进去
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。
我们来执行看一下,不要忘记输出一下哦。
这样子我们的页面源码就获取到了,而且里面可以看到我们之前搜索的排行第一的视频:【官方MV】Mojito - 周杰伦。
然后我们回到网站,右键视频标题,点击检查。我们再在源码这右键一下,点击Copy,点击Copy Xpath,这样Xpath就复制下来了,动画演示:原文地址:www.lanol.cn
//*[@id="app"]/div[1]/div/div[1]/div[2]/div[3]/ul/li[1]/div[2]/div[2]/a
我们将这句Xpath粘贴到浏览器插件里面测试一下。
可以看见我们已经可以选中这句标题了,然后我们再利用HTML知识修改一下这句话,就可以获取到所有标题了。//div[2]/div[2]/a
我们放到Python里面执行一下。
发现获取的内容似乎有点多,这里不仅把标题弄出来了,而且还将这句代码弄出来了,我们在后面加一个text()只获取文本内容。
这样就可以了,我们再来试一下获取分数。一如之前的操作,右键分数,点击检查,再在代码处右键,点击Copy,点击Copy Xpath。//*[@id="app"]/div[1]/div/div[1]/div[2]/div[3]/ul/li[20]/div[2]/div[2]/div[2]/div
再修改一下这句话,以获取我们想要的全部内容。//div[2]/div[2]/div[2]/div/text()
然后放到Python里面执行一下。
成功获取所有分数。
综上我们想要获取的信息都已经取到了。
然后就是写到表格之中,这里为了方便直接写到csv即可。直接贴代码了。with open('B站排行榜www.lanol.cn.csv', 'w') as f:
f.write('标题,分数\n')
for index, i in enumerate(titles):
f.write(f'{i},{grades[index]}\n')
这样子,就可以了,这个只是一个思路,获取更多信息你可以自由发挥。
所有代码一共才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('标题,分数\n')
for index, i in enumerate(titles):
f.write(f'{i},{grades[index]}\n')
print(grades)
[/CommShow]