零基础爬取bilibili数据

零基础爬取哔哩哔哩信息

该博客将我爬取哔哩哔哩网站数据的过程中遇到的问题及整体爬取思路做详细阐述,希望能帮助到有需要的码农们,有问题可私信问我。



源代码

话不多说直接上代码:

import requests
from lxml import etree
import xlwt
import time
import random

data = []

def get_info():
    i=0
    while(i<=50):
        i+=1
        time.sleep(1)
        #获取html页面
        if(i==1):
           url = 'https://search.bilibili.com/all?keyword=%E7%96%AB%E8%8B%97%E7%A7%91%E6%99%AE&from_source=nav_search&spm_id_from=333.851.b_696e7465726e6174696f6e616c486561646572.9'
        else:
            url='https://search.bilibili.com/all?keyword=%E7%96%AB%E8%8B%97%E7%A7%91%E6%99%AE&from_source=nav_search&spm_id_from=333.851.b_696e7465726e6174696f6e616c486561646572.9&page='+str(i)
        head=[
    "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
    "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
    "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
]
        headers={
    'user-agent':random.choice(head),
    'Referer':'https://www.bilibili.com/',
    'cookie':"_uuid=38505D66-5836-7006-B441-D8A7F44B081255211infoc; buvid3=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; sid=jtgdj478; LIVE_BUVID=AUTO5015857997467736; rpdid=|(~u|RmYY)J0J'ul)l~mm~R~; LIVE_PLAYER_TYPE=2; blackside_state=1; fingerprint=b7046ad02d6444e63a99648735729cdc; buvid_fp=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; buvid_fp_plain=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; DedeUserID=319136001; DedeUserID__ckMd5=c2fd54a2f5fbb92c; SESSDATA=edc55d5a%2C1629375534%2Caf07a*21; bili_jct=fcc932e20010531a42957e154977371f; CURRENT_FNVAL=80; bsource=search_google; finger=-166317360; arrange=list; PVID=1"
}
        res = requests.get(url=url,headers=headers)
        res.encoding = 'utf-8'
        html = res.text
        
        #解析页面,提取目标信息
        
        tree = etree.HTML(html)
        lis = tree.xpath('/html/body/div[3]/div/div[2]/div/div[1]/ul/li')
        print(lis)
        for li in lis:
            info = []
            #提取视频名
            name = li.xpath('./a/@title')[0]
            info.append(name)
            #提取链接
            link = li.xpath('./a/@href')[0]
            info.append(link)
            #提取播放量
            play_num = li.xpath('./div/div[3]/span[1]/text()')[0]
            info.append(play_num)
            #提取弹幕数
            discuss = li.xpath('./div/div[3]/span[2]/text()')[0]
            info.append(discuss)
            #提取时间
            up_time = li.xpath('./div/div[3]/span[3]/text()')[0]
            info.append(up_time)
            #提取up主
            up = li.xpath('./div/div[3]/span[4]/a/text()')[0]
            info.append(up)
            #汇总到data列表中
            data.append(info)

def main():
    get_info()
    #保存数据
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('sheet1')
    #写表头
    col_name = ('视频名','视频链接','播放量','弹幕量','上传时间','up主')
    for i in range(6):
        ws.write(0,i,col_name[i])
    for r in range(len(data)):
        case = data[r]
        for c in range(6):
            ws.write(r+1,c,case[c])
    wb.save('爬取结果.xls')




if __name__ == "__main__":
    # execute only if run as a script
    main()


爬取思路

这段代码可以直接跑起来运行,改正链接和头部以及想爬取的内容就行。


从网页爬取数据的思路如下:
首先从网页获得网页的链接url和其他header信息,然后requests到整个页面的数据,用etree生成树,定位到想要的信息,然后append 到给定的数组中,最后合成到lxls文件中。
在这里插入图片描述
如上图找到相关网站,点击F12按键,检查页面。
在这里插入图片描述
选择Network,从这里查找到我们想要的信息,点击Name列第一行,
这样就能找到我们所需要的url和useragent等信息,如下图标红的信息
在这里插入图片描述
在这里插入图片描述
这里要注意requestMethod是get,所以在用requests请求网页信息的时候不要用post。
url肯定是要用网页给出来的url,这里因为我爬取的数据有五十页,而查看不同页的url可以发现他们的区别只是在第一页的url后面加了&page=页码,因此爬取多页时候用for循环就能改变url。
referes和cookie我的建议是直接加到headers里面就行。

   i=0
    while(i<=50):
        i+=1
        time.sleep(1)
        #获取html页面
        if(i==1):
           url = 'https://search.bilibili.com/all?keyword=%E7%96%AB%E8%8B%97%E7%A7%91%E6%99%AE&from_source=nav_search&spm_id_from=333.851.b_696e7465726e6174696f6e616c486561646572.9'
        else:
            url='https://search.bilibili.com/all?keyword=%E7%96%AB%E8%8B%97%E7%A7%91%E6%99%AE&from_source=nav_search&spm_id_from=333.851.b_696e7465726e6174696f6e616c486561646572.9&page='+str(i)
        head=[
    "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
    "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
    "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
]
        headers={
    'user-agent':random.choice(head),
    'Referer':'https://www.bilibili.com/',
    'cookie':"_uuid=38505D66-5836-7006-B441-D8A7F44B081255211infoc; buvid3=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; sid=jtgdj478; LIVE_BUVID=AUTO5015857997467736; rpdid=|(~u|RmYY)J0J'ul)l~mm~R~; LIVE_PLAYER_TYPE=2; blackside_state=1; fingerprint=b7046ad02d6444e63a99648735729cdc; buvid_fp=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; buvid_fp_plain=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; DedeUserID=319136001; DedeUserID__ckMd5=c2fd54a2f5fbb92c; SESSDATA=edc55d5a%2C1629375534%2Caf07a*21; bili_jct=fcc932e20010531a42957e154977371f; CURRENT_FNVAL=80; bsource=search_google; finger=-166317360; arrange=list; PVID=1"
}

接下来就是问题最大的useragent,每个浏览器访问网页的时候是有自己的ip 的,这个ip就是useragent,爬虫的时候短时间重复多次访问数据库容易让网站判定成机器人,从而封禁你的浏览器ip,这样你不仅爬不了数据,浏览器也打不开相关网页。为了避免被封,我找了一堆useragent,列成了一个数组

 head=[
    "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
    "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
    "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
]

然后在每次访问的时候就用random函数随机挑选一个useranget,伪装成不同浏览器去申请页面信息

        headers={
    'user-agent':random.choice(head),
    'Referer':'https://www.bilibili.com/',
    'cookie':"_uuid=38505D66-5836-7006-B441-D8A7F44B081255211infoc; buvid3=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; sid=jtgdj478; LIVE_BUVID=AUTO5015857997467736; rpdid=|(~u|RmYY)J0J'ul)l~mm~R~; LIVE_PLAYER_TYPE=2; blackside_state=1; fingerprint=b7046ad02d6444e63a99648735729cdc; buvid_fp=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; buvid_fp_plain=2FA7C975-1F6B-47FC-961D-B998597045C953923infoc; DedeUserID=319136001; DedeUserID__ckMd5=c2fd54a2f5fbb92c; SESSDATA=edc55d5a%2C1629375534%2Caf07a*21; bili_jct=fcc932e20010531a42957e154977371f; CURRENT_FNVAL=80; bsource=search_google; finger=-166317360; arrange=list; PVID=1"
}
申请网页

上面我们准备好了申请网页所需要的各种信息,然后就用request获得页面数据

       res = requests.get(url=url,headers=headers)
        res.encoding = 'utf-8'
        html = res.text

申请到网页数据以后赋值给res,utf-8编码,再用.text将res变成文本数据赋值给html。

tree = etree.HTML(html)

然后用etree函数将html的文本信息变成树状列表信息,这样就实现了网页数据的下载和格式变换

定位想要的数据

这里我每个页面有二十多个视频,每个视频就是一个li,首先获得所有视频的整个列表

lis = tree.xpath('/html/body/div[3]/div/div[2]/div/div[1]/ul/li')

lis是我们定义的一个数组,通过xpath找到所有的视频信息赋值给lis
括号里面是每个视频的路径,获取方式如下:
在这里插入图片描述
任选一个视频然后右键,点击检查就能在源代码中定位到相应的位置
在这里插入图片描述
可以看到这里有一列li,每一个li就是一个视频信息,选中其中一个li,右键,copy,选择copy fullxpath,这样就能复制到完整的路径了,填入括号中即可。
得到了所有视频的数据后就开始一个个分析,从里面获得想要的信息

for li in lis:
            info = []
            #提取视频名
            name = li.xpath('./a/@title')[0]
            info.append(name)
            #提取链接
            link = li.xpath('./a/@href')[0]
            info.append(link)
            #提取播放量
            play_num = li.xpath('./div/div[3]/span[1]/text()')[0]
            info.append(play_num)
            #提取弹幕数
            discuss = li.xpath('./div/div[3]/span[2]/text()')[0]
            info.append(discuss)
            #提取时间
            up_time = li.xpath('./div/div[3]/span[3]/text()')[0]
            info.append(up_time)
            #提取up主
            up = li.xpath('./div/div[3]/span[4]/a/text()')[0]
            info.append(up)

这里如果获取的是文本信息就在完整的路径后面加/text,其他的像链接或者标题等加相应内容即可。这里路径的获取方式同上,在网页上某个视频的想要的信息如作者处右击检查,然后代码中定位到想获取的信息右键copy,得到相应的路径,前面相同的路径可用li.xpath()来简写,具体见代码。
得到具体信息后用append赋值给临时变量info,再append给全局变量data。

            #汇总到data列表中
            data.append(info)
数据保存

最后得到的data数组里面包含着我们想要的信息

    get_info()
    #保存数据
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('sheet1')
    #写表头
    col_name = ('视频名','视频链接','播放量','弹幕量','上传时间','up主')
    for i in range(6):
        ws.write(0,i,col_name[i])
    for r in range(len(data)):
        case = data[r]
        for c in range(6):
            ws.write(r+1,c,case[c])
    wb.save('爬取结果.xls')

这里用xlwt库生成一个excel表,写上表头,把data里面数据写入到表里面
保存生成xls表格,这样爬取就完成了。最后结果如图:
在这里插入图片描述

写在最后

爬虫其实是挺简单的一件事,方式有很多很多种,我比较优柔寡断,两天时间里换了十几篇博客一个个试想找最简单的,这样其实很浪费时间,找一个确定能跑出来的案例,在这个基础上直接改就行了。调代码最怕的不是解决问题而是逃避问题,往往约逃避问题就会越多。

  • 15
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
包括标题、up主、up主id、精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、发布时间、视频时长、视频简介、作者简介和标签 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值