scrapy爬B站首页八个视频的基本信息

项目目标:爬取这八个视频的视频名称、观看人数、弹幕、弹幕位置、点赞、收藏、投币
在这里插入图片描述
有的人可能只能看到六个,缩小一下就好了。

1.打开检查 ,获取url在这里插入图片描述

使用requests库简单下载一下源码,可以发现网址就在源码当中在这里插入图片描述

2.打开其中一个视频,打开检查

再用刚才的方法,发现得到一个空列表,发现这是一个动态网页。点开network在这里插入图片描述
需要找到这个在哪个文件中,这里可以发现有各种数据在这里插入图片描述
然后发现在这个文件中。当然找起来比较麻烦,这里有一个小技巧就是点下clear,再按ctrl+R重新刷新一下,然后盯着这个地方看,当这个地方刷出具体数字的时候会出现一个文件,然后就在这个文件当中在这里插入图片描述

3.获取弹幕内容

本人使用的是谷歌浏览器,发现找不到。百度之后,发现谷歌好像看不了xml,改用火狐在这里插入图片描述
在这里插入图片描述

4.万事具备,直接上代码了
import scrapy
import json
import time
from lread_project.items import LreadProjectItem, DmItem


class LreadSpider(scrapy.Spider):
    name = 'lread'
    allowed_domains = ['bilibili.com']
    start_urls = ['https://www.bilibili.com/']

    def parse(self, response):
        hrefs = response.xpath('//div[@class="info-box"]/a')
        for href in hrefs:
            item = LreadProjectItem()
            item['title'] = href.xpath('./div/p[1]/@title').extract_first()

            # 详情链接
            av_num = href.xpath('./@href').extract_first().split('/')[-1].strip('av')
            next_href = 'https://api.bilibili.com/x/web-interface/archive/stat?aid=' + av_num

            yield scrapy.Request(next_href, callback=self.parse_detail, meta={"item": item, 'aid': av_num})

    def parse_detail(self, response):
        # item接收meta传过来的item
        item = response.meta["item"]

        info_json = json.loads(response.text)

        if info_json['code'] == 0:
            # 点赞
            item['like'] = info_json['data']['like']
            # 收藏
            item['favorite'] = info_json['data']['favorite']
            # 投币
            item['coin'] = info_json['data']['coin']
            # 视频播放量
            item['view'] = info_json['data']['view']

            next_url = 'https://api.bilibili.com/x/player/pagelist?aid={}&jsonp=jsonp'.format(response.meta["aid"])
            print(next_url)
            yield scrapy.Request(next_url, callback=self.parse_cid, meta={"item": item})

    def parse_cid(self, response):
        cid = json.loads(response.text)['data'][0]['cid']
        next_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid={}'.format(cid)
        yield scrapy.Request(next_url, callback=self.parse_dm, meta={"item": response.meta["item"]})

    def parse_dm(self, response):
        d_list = response.xpath('//d')

        # item接收meta传过来的item
        item = response.meta["item"]

        item['dm'] = []
        for d in d_list:
            p_list = d.xpath('./@p').extract_first().split(',')
            # 在视频中位置
            minutes = float(p_list[0]) // 60
            seconds = float(p_list[0]) % 60
            # 发布时间
            av_up = time.strftime("%Y-%m-%d %H:%M".format(time.localtime(int(p_list[4]))))
            # 弹幕内容
            text = d.xpath('./text()').extract_first().strip()

            dm_item = DmItem()
            dm_item['on_movie_time'] = '%02d:%02d' % (minutes, seconds)
            dm_item['text'] = text
            dm_item['up_time'] = av_up

            item['dm'].append(dm_item)
        yield item

设置pipelines.py文件,连接MongoDB库

首先需要安装pymongo模块

import pymongo


class MongoDBPipeline(object):
    """
    将item写入MongoDB
    """

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(host='127.0.0.1', port=27017)
        self.db = self.client['bl_db']

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        collection = self.db['my_bl']
        collection.insert_one(dict(item))
        return item

设置settings.py文件
ROBOTSTXT_OBEY = False

ITEM_PIPELINES = {
   'lread_project.pipelines.MongoDBPipeline': 300,
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值