爬虫练习010-爬取B站视频榜单信息写入MongoDB

项目说明

项目时间:2020.03.31
目标网址:https://www.bilibili.com/ranking/all/0/0/3

今天刚学了pymongo模块,爬个B站练练手吧!
爬取的是这三个榜单:

另外两个结构不太一样,没有一起爬,稍微改一下提取信息的部分也是可以的。

项目源码:

getheaders()是我自己定义的一个方法,可以换成自己的headers。

# encoding: utf-8
"""
@author: @wen
@contact:
@time: 2020/3/31 0031 20:48
@file: 爬取b站视频信息存入mongodb.py
@desc: 
"""
import requests
from MySipderInit import getheaders
from lxml import etree
import pymongo


def gethtml(url):
    """只负责获取网页内容"""
    try:
        response = requests.get(url, headers=getheaders())
        if response.status_code == 200:
            # print(response.text)  # 测试成功
            html = etree.HTML(response.text)
            return html
    except Exception as ex:
        print(ex)


def get_video_info(html):
    """解析页面,获取视频信息"""
    li_list = html.xpath(r'//ul[@class="rank-list"]/li')  # 外层<li>标签
    video_info_list = []
    for li in li_list:
        """提取视频信息"""
        video_info_dict = {}
        rank = li.xpath(r'./div/text()')[0]  # 排名
        score = li.xpath(r'.//div[@class="pts"]/div/text()')[0]  # 分数
        title = li.xpath(r'./div/div[2]/a/text()')[0]  # 标题
        author = li.xpath(r'.//div[@class="detail"]/a/span/text()')[0].strip()  # 作者
        playnum = li.xpath(r'.//div[@class="detail"]/span/text()')[0].strip()  # 播放量
        commentnum = li.xpath(r'.//div[@class="detail"]/span[2]/text()')[0].strip()  # 弹幕量
        videolink = li.xpath(r'.//div[@class="info"]/a/@href')[0]  # 视频链接

        """将视频信息放进字典"""
        video_info_dict['rank'] = rank
        video_info_dict['score'] = score
        video_info_dict['title'] = title
        video_info_dict['author'] = author
        video_info_dict['playnum'] = playnum
        video_info_dict['commentnum'] = commentnum
        video_info_dict['videolink'] = videolink
        """将字典追加进列表"""
        video_info_list.append(video_info_dict)
    # 返回的列表装的是一个个字典,每个字典里装的是一条视频的信息
    return video_info_list


def send_to_mongo(cat, video_info_list):
    """将数据保存到mongo"""
    col = db[cat]  # 连接到集合,将该栏目的标签作为集合的名称
    res = col.insert_many(video_info_list)  # 一次性多条写入
    print(res)


def main():
    """主要执行逻辑"""
    for i in range(0, len(cat_list)):
        html = gethtml(base_url % cat_list[i])  # 打开连接,获取网页内容
        video_info_list = get_video_info(html)  # 解析网页内容,获取视频榜单中视频信息
        send_to_mongo(cat_list[i], video_info_list)  # 保存到mongo中


if __name__ == '__main__':
    cat_list = ['all', 'origin', 'rookie']  # 要爬取的三个榜单
    base_url = r'https://www.bilibili.com/ranking/%s/0/0/7'
    client = pymongo.MongoClient()  # 创建mongo客户端
    db = client['bilibili']  # 连接到数据库
    main()

运行结果

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值