使用python编写的爬虫给X站视频增加一个播放量

这篇具有很好参考价值的文章主要介绍了使用python编写的爬虫给X站视频增加一个播放量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、增加播放量的请求分析

1.请求网址:

 2.请求分析:

 3.对cookie分析:

4. 对荷载分析:

二、代码实现

总结拓展


前言

在平时观看X站视频的过程中,一个视频的播放量需要点击播放来增加,而在代码中如何实现播放量的增加呢,本篇文章就带你实现在代码中增加一个播放量。


提示:以下是本篇文章正文内容,下面案例可供参考

一、增加播放量的请求分析

1.请求网址:

video_url = b'aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMXZNNHkxQzdGUS8='

 2.请求分析:

经过多次验证X站中视频播放量增加的请求为h5这个请求,其截图如图:

使用python编写的爬虫给X站视频增加一个播放量,爬虫,python,开发语言

使用python编写的爬虫给X站视频增加一个播放量,爬虫,python,开发语言

 3.对cookie分析:

使用python编写的爬虫给X站视频增加一个播放量,爬虫,python,开发语言

4. 对荷载分析:

使用python编写的爬虫给X站视频增加一个播放量,爬虫,python,开发语言

二、代码实现

代码如下(示例):

python代码:

import os
import re
import time
import json
import datetime

import uuid
import execjs
import shutil
import requests
import subprocess
from loguru import logger
from functools import partial


class generated_parameter():

    def __init__(self, video_url):
        self.video_url = video_url
        self.my_log()

    def my_log(self):
        """
        日志模块
        :return:
        """
        logger.add("logs/{time:YYYY-MM-DD}.log",
                   format="{time:YYYY-MM-DD HH:mm:ss.SSS} |{level:8}| {name} : {module}:{line:4} | - {message} |({file}:{line})",
                   rotation="00:00", compression="zip")
        # 超过七天自动压缩
        logs_dir = "../bilibili/logs"
        for filename in os.listdir(logs_dir):
            filepath = os.path.join(logs_dir, filename)
            if os.path.isfile(filepath):
                creation_time = datetime.datetime.fromtimestamp(os.path.getctime(filepath))
                if (datetime.datetime.now() - creation_time).days > 7:
                    shutil.make_archive(filepath, "zip", logs_dir, filename)
                    os.remove(filepath)

    def get_a(self):
        """
        aid、cid提取
        :return: 包含aid、cid的字典
        """
        url = self.video_url
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
        }
        req = requests.get(url=url, headers=headers)

        data_list = re.findall(r'__INITIAL_STATE__=(.+);\(function', req.text)
        data_dict = json.loads(data_list[0])

        return data_dict

    def gen_uuid(self):
        """
        uuid生成
        """
        uuid_sec = str(uuid.uuid4())
        time_sec = str(int(time.time() * 1000 % 1e5))
        time_sec = time_sec.rjust(5, "0")
        return "{}{}infoc".format(uuid_sec, time_sec)

    def open_js(self, method_names):
        """
        js调用
        :param method_names: 要调用的js方法名
        :return: js调用的结果
        """
        subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
        with open("bili.js", mode="r", encoding="utf-8") as f:
            ex_js = execjs.compile(f.read())
        return ex_js.call(f"{method_names}")

    def get_bt34(self):
        """
        b_nut、buvid3、buvid4三个参数提取
        :return: 包含b_nut、buvid3、buvid4三个的列表
        """
        url = self.video_url
        session = requests.Session()
        session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"})
        req = session.get(url=url)

        spi_url = 'https://api.bilibili.com/x/frontend/finger/spi'
        spi_rep = session.get(spi_url)

        b_nut = dict(req.cookies)['b_nut']
        buvid3 = dict(req.cookies)['buvid3']
        buvid4 = spi_rep.json()['data']['b_4'].replace('/', '%2F').replace('=', '%3D%3D')

        return [b_nut, buvid3, buvid4]


def post_h5(bvid, buvid4, buvid3, b_nut, b_lsid, my_uuid, buvid_fp, aid, cid, now_time):
    """
    请求h5网址
    """
    url = 'https://api.bilibili.com/x/click-interface/click/web/h5'
    headers = {
        "Referer": f"https://www.bilibili.com/video/{bvid}/",
        "Cookie": f"buvid4={buvid4}; buvid3={buvid3}; b_nut={b_nut}; CURRENT_FNVAL=4048; sid=g6e519i7; b_lsid={b_lsid}; _uuid={my_uuid}; buvid_fp={buvid_fp}",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
    }
    params = {
        "aid": aid,
        "cid": cid,
        "part": "1",
        "lv": "0",
        "ftime": now_time,
        "stime": now_time,
        "type": "3",
        "sub_type": "0",
        "refer_url": '',
        "spmid": "333.788.0.0",
        "from_spmid": "",
        "csrf": "",
    }
    req = requests.post(url=url, headers=headers, params=params)

    return req


def task(video_url):
    """
    生成参数,调用视频播放量增加的网址
    :return:
    """

    bvid = video_url.rsplit("/")

    if not bvid[-1]:
        bvid = bvid[-2]
    else:
        bvid = bvid[-1]

    gen_par = generated_parameter(video_url)

    data_dict = gen_par.get_a()
    aid = data_dict['aid']
    cid = data_dict['videoData']['cid']
    now_time = int(time.time())

    my_uuid = gen_par.gen_uuid()
    b_lsid = gen_par.open_js("b_lsid")
    buvid_fp = gen_par.open_js("buvid_fp")

    b_nut = gen_par.get_bt34()[0]
    buvid3 = gen_par.get_bt34()[1]
    buvid4 = gen_par.get_bt34()[2]

    post_h5(bvid, buvid4, buvid3, b_nut, b_lsid, my_uuid, buvid_fp, aid, cid, now_time)
    # 运行成功网址写进日志
    logger.info(f"Info 视频网址:{video_url}")


if __name__ == '__main__':
    video_url = ""
    task(video_url)

 js代码:

function b_lsid() {
    function splitDate(e) {
        var t = new Date(e || Date.now())
            , r = t.getDate()
            , n = t.getHours()
            , e = t.getMinutes()
            , t = t.getTime();
        return {
            day: r,
            hour: n,
            minute: e,
            second: Math.floor(t / 1e3),
            millisecond: t
        }
    }

    function hr(e) {
        return Math.ceil(e).toString(16).toUpperCase()
    }

    function s(e, t) {
        var r = "";
        if (e.length < t)
            for (var n = 0; n < t - e.length; n++)
                r += "0";
        return r + e
    }

    function l(e) {
        for (var t = "", r = 0; r < e; r++)
            t += hr(16 * Math.random());
        return s(t, e)
    }

    var e = splitDate()
        , t = hr(e.millisecond)
    return "".concat(l(8), "_").concat(t)

}

function buvid_fp() {
    var e = [
        {
            "key": "userAgent",
            "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
        },
        {
            "key": "webdriver",
            "value": false
        },
        {
            "key": "language",
            "value": "zh-CN"
        },
        {
            "key": "colorDepth",
            "value": 24
        },
        {
            "key": "deviceMemory",
            "value": 8
        },
        {
            "key": "hardwareConcurrency",
            "value": 12
        },
        {
            "key": "screenResolution",
            "value": [
                2048,
                1152
            ]
        },
        {
            "key": "availableScreenResolution",
            "value": [
                2048,
                1112
            ]
        },
        {
            "key": "timezoneOffset",
            "value": -480
        },
        {
            "key": "timezone",
            "value": "Asia/Shanghai"
        },
        {
            "key": "sessionStorage",
            "value": true
        },
        {
            "key": "localStorage",
            "value": true
        },
        {
            "key": "indexedDb",
            "value": true
        },
        {
            "key": "addBehavior",
            "value": false
        },
        {
            "key": "openDatabase",
            "value": true
        },
        {
            "key": "cpuClass",
            "value": "not available"
        },
        {
            "key": "platform",
            "value": "Win32"
        },
        {
            "key": "plugins",
            "value": [
                [
                    "PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "Chrome PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "Chromium PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "Microsoft Edge PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "WebKit built-in PDF",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ]
            ]
        },
        {
            "key": "canvas",
            "value": [
                "canvas winding:yes",
                "canvas fp:data:image/png;base64,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CCCAQNcJdChAt2W7crPbD/37k1/Vfyw/oetuvRtc+T8nvarvLsvUuEqStW63XxkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAtxHocIBuUrEQfV1Gaj3ffE/7p2ZaGZ3RJbr9wWWL31NdxpX+7Hve7b84ACCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCDQPQVyEqBnHaJffNobeuiFY7snfZ7v+pJT39Avn8/UlvA8z4+F6RFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoHAFchagx0L0GbE90dO745ItG7Rq+EE6NFKR3gkclZbAu6Fajd1SIQ1K6/DYQYTnmWhxLAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIHHACOQ3QTceVO0fS3LSlpn7jdf31p8elfTwHti8w5obVqvre+PYPjB8x05GzIIPjORQBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBA44ARyHqCbUMYh+u+GLNZnt0494HS74oZ+P3ixzt2SieVcR84NXbFUrokAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggUkkBeAnS7wYxC9B5LN2nlRwdrjMKFhFOEa2lSz79vUf2U4WmunfA8TSgOQwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBA18gbwG60WUUoo/60SpV/fuEA588j3c4+oertP7b6RrStj2Pj4KpEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECg+ATyGqDHQvQZkuanRTNj+puav+jotI7loJYCM095UwvStpvuyFkEIQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAs0DeA3S7lCt3tKR1acBX6X8G7NZndkxO41gO8QX+t/8y/dP2dM0Iz/nmIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAkkEOiVAt+vGQvSFkixMTz3CazfqnYmOxjWmu493936wa8KbNH7NcGlUew5VkqxtO5Xn7UnxOQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIdEuBTgvQTTcWols792ltape9uFnvnDK0nai9Wz6wFjdtkfjhf96s/ScPbQfDjrTKc/uVgQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQRKBTA3S7fixEv0TS3DafSPmTW7XnM4N5am0IDH58md7/1/Zat8915NyAIwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBA2wKdHqD7y0mrpXv5b7dqzz8Toid7hkMeXq6tF0xq4/HSsp2//QgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAGAl0WoNsa06pGt0r0tz8zmHbusadqsfhx7VaeL3LkTM/ge8ChCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQLcX6NIA3dd35c5ps6W77Ym+/NSIxjUO79ZPbE14kya9EGpnz3NatnfrLwk3jwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAC2QoURIBui2+3Gj28dqN+c+wOfWZHe3t+Z2tR2Of9b/9l+qclk6VRqda5SNJMR47VqDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBDIUKJgA3V93O3ujV2nGtO2a/+ejM7zP4j585rQ3tWBhqntmr/PifrqsHgEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEECkSg4AJ0c2m3Gn3Uj1Zp0b+P1WiVFIhjfpaxTo2a/sN3tf7bE5JcwILzBY6cG/JzcWZFAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEupdAQQbo/iNoM0jvsXSTfvBPO3Xd+o8ckI/s94MX69w/TZWOSHZ77HN+QD50bgoBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBLpSoKAD9LSC9KnfeF2P3XKkDo1UdCVkzq79bqhWX7n8RT11z1kJc1JxnjNkJkIAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRaCxRFgO4vO1aRPk3SHEmj47dTsmWDLrhwsx564diifsiXnPqGfvnrY6VBwdsgOC/qh8riEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgWASKKkD3UQNB+iWSLFCPjp5vvqeLvlyj+16bXCwPwFvn5ccv069+MVB1Rw8LrNuC8xscOQuK6l5YLAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFCkAkUZoAetk4bpPZe8py98/T0tWDS1YJ+LxeNzpy3WQ7dPlSb5y6TavGAfGAtDAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEDXaDoA/QkYbpflT5N/7+9u3eJOgADOP78ejGhwkUcQiocKmhpOISIajNsaHALagqaGuvmWsOlPyFwDGlqjLoammqKCjujll6QoES4ttAcLHK75+rRj9NNz+/x89z25e52fPkQF9qv4+q9YzG9cvC/OObCUDfaF7txf3YqYnR1pbVoHhF3m2hWX/sjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgX8gsKUC+ka/DZ9MP7v2e+nDnaMxM7sYlx6Ox/TKoYFaLwy9jZvnPsf89YnonfmxHsyjiebWQPfwMAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYVGDLBvQ//+PfgvrY05GYnNsTJzuj0Xp3OKZ6Y319j3R3fYzbJ77GzokXMXfjSCy3HkTE4yaaR319jmEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0DeBbRPQ/ya2HtUjTs+34tqdvfEpJuPUq30x3BuP48sj8es71jf7tPr7iFiKl/u/xfMD3+Pym060r+yOZ+cX48nMkljet/eoQQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBiIwLYO6AMR9hACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKCEgoJc4kyUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIFtAQM8WNp8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESggI6CXOZEkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQyBYQ0LOFzSdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEgICeokzWZIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEsgUE9Gxh8wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECghICAXuJMliRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbAEBPVvYfAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoISCglziTJQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgW0BAzxY2nwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKCAjoJc5kSQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDIFhDQs4XNJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIESAgJ6iTNZkgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSyBQT0bGHzCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCEgIBe4kyWJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFsAQE9W9h8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECghIKCXOJMlCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCBbQEDPFjafAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEoICOglzmRJAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEMgWENCzhc0nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRICAnqJM1mSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLIFBPRsYfMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoISAgF7iTJYkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWwBAT1b2HwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKCEgoJc4kyUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIFtAQM8WNp8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESggI6CXOZEkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQyBYQ0LOFzSdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEgICeokzWZIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEsgUE9Gxh8wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECghICAXuJMliRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbAEBPVvYfAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoISCglziTJQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgW0BAzxY2nwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKCAjoJc5kSQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDIFhDQs4XNJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIESAgJ6iTNZkgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSyBQT0bGHzCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCEgIBe4kyWJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFsAQE9W9h8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECghIKCXOJMlCRAgQIAAl5luwwAAAVhJREFUAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCBbQEDPFjafAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEoICOglzmRJAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEMgWENCzhc0nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRICAnqJM1mSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLIFBPRsYfMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoISAgF7iTJYkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWwBAT1b2HwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKCEgoJc4kyUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIFvgJwYnKW33zz8fAAAAAElFTkSuQmCC"
            ]
        },
        {
            "key": "webgl",
            "value": [
                "data:image/png;base64,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",
                "extensions:ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw",
                "webgl aliased line width range:[1, 1]",
                "webgl aliased point size range:[1, 1024]",
                "webgl alpha bits:8",
                "webgl antialiasing:yes",
                "webgl blue bits:8",
                "webgl depth bits:24",
                "webgl green bits:8",
                "webgl max anisotropy:16",
                "webgl max combined texture image units:32",
                "webgl max cube map texture size:16384",
                "webgl max fragment uniform vectors:1024",
                "webgl max render buffer size:16384",
                "webgl max texture image units:16",
                "webgl max texture size:16384",
                "webgl max varying vectors:30",
                "webgl max vertex attribs:16",
                "webgl max vertex texture image units:16",
                "webgl max vertex uniform vectors:4095",
                "webgl max viewport dims:[32767, 32767]",
                "webgl red bits:8",
                "webgl renderer:WebKit WebGL",
                "webgl shading language version:WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)",
                "webgl stencil bits:0",
                "webgl vendor:WebKit",
                "webgl version:WebGL 1.0 (OpenGL ES 2.0 Chromium)",
                "webgl unmasked vendor:Google Inc. (NVIDIA)",
                "webgl unmasked renderer:ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)",
                "webgl vertex shader high float precision:23",
                "webgl vertex shader high float precision rangeMin:127",
                "webgl vertex shader high float precision rangeMax:127",
                "webgl vertex shader medium float precision:23",
                "webgl vertex shader medium float precision rangeMin:127",
                "webgl vertex shader medium float precision rangeMax:127",
                "webgl vertex shader low float precision:23",
                "webgl vertex shader low float precision rangeMin:127",
                "webgl vertex shader low float precision rangeMax:127",
                "webgl fragment shader high float precision:23",
                "webgl fragment shader high float precision rangeMin:127",
                "webgl fragment shader high float precision rangeMax:127",
                "webgl fragment shader medium float precision:23",
                "webgl fragment shader medium float precision rangeMin:127",
                "webgl fragment shader medium float precision rangeMax:127",
                "webgl fragment shader low float precision:23",
                "webgl fragment shader low float precision rangeMin:127",
                "webgl fragment shader low float precision rangeMax:127",
                "webgl vertex shader high int precision:0",
                "webgl vertex shader high int precision rangeMin:31",
                "webgl vertex shader high int precision rangeMax:30",
                "webgl vertex shader medium int precision:0",
                "webgl vertex shader medium int precision rangeMin:31",
                "webgl vertex shader medium int precision rangeMax:30",
                "webgl vertex shader low int precision:0",
                "webgl vertex shader low int precision rangeMin:31",
                "webgl vertex shader low int precision rangeMax:30",
                "webgl fragment shader high int precision:0",
                "webgl fragment shader high int precision rangeMin:31",
                "webgl fragment shader high int precision rangeMax:30",
                "webgl fragment shader medium int precision:0",
                "webgl fragment shader medium int precision rangeMin:31",
                "webgl fragment shader medium int precision rangeMax:30",
                "webgl fragment shader low int precision:0",
                "webgl fragment shader low int precision rangeMin:31",
                "webgl fragment shader low int precision rangeMax:30"
            ]
        },
        {
            "key": "webglVendorAndRenderer",
            "value": "Google Inc. (NVIDIA)~ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)"
        },
        {
            "key": "hasLiedLanguages",
            "value": false
        },
        {
            "key": "hasLiedResolution",
            "value": false
        },
        {
            "key": "hasLiedOs",
            "value": false
        },
        {
            "key": "hasLiedBrowser",
            "value": false
        },
        {
            "key": "touchSupport",
            "value": [
                0,
                false,
                false
            ]
        },
        {
            "key": "fonts",
            "value": [
                "Arial",
                "Arial Black",
                "Arial Narrow",
                "Book Antiqua",
                "Bookman Old Style",
                "Calibri",
                "Cambria",
                "Cambria Math",
                "Century",
                "Century Gothic",
                "Century Schoolbook",
                "Comic Sans MS",
                "Consolas",
                "Courier",
                "Courier New",
                "Georgia",
                "Helvetica",
                "Impact",
                "Lucida Bright",
                "Lucida Calligraphy",
                "Lucida Console",
                "Lucida Fax",
                "Lucida Handwriting",
                "Lucida Sans",
                "Lucida Sans Typewriter",
                "Lucida Sans Unicode",
                "Microsoft Sans Serif",
                "Monotype Corsiva",
                "MS Gothic",
                "MS PGothic",
                "MS Reference Sans Serif",
                "MS Sans Serif",
                "MS Serif",
                "Palatino Linotype",
                "Segoe Print",
                "Segoe Script",
                "Segoe UI",
                "Segoe UI Light",
                "Segoe UI Semibold",
                "Segoe UI Symbol",
                "Tahoma",
                "Times",
                "Times New Roman",
                "Trebuchet MS",
                "Verdana",
                "Wingdings",
                "Wingdings 2",
                "Wingdings 3"
            ]
        },
        {
            "key": "audio",
            "value": "124.04347527516074"
        }
    ]

    var t = e.map(function (e) {
        return e.value
    }).join("")

    var g = function (e, t) {
        e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]],
            t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]];
        var r = [0, 0, 0, 0];
        return r[3] += e[3] * t[3],
            r[2] += r[3] >>> 16,
            r[3] &= 65535,
            r[2] += e[2] * t[3],
            r[1] += r[2] >>> 16,
            r[2] &= 65535,
            r[2] += e[3] * t[2],
            r[1] += r[2] >>> 16,
            r[2] &= 65535,
            r[1] += e[1] * t[3],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[1] += e[2] * t[2],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[1] += e[3] * t[1],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[0] += e[0] * t[3] + e[1] * t[2] + e[2] * t[1] + e[3] * t[0],
            r[0] &= 65535,
            [r[0] << 16 | r[1], r[2] << 16 | r[3]]
    }
        , v = function (e, t) {
        return [e[0] ^ t[0], e[1] ^ t[1]]
    }
        , e = {
        preprocessor: null,
        audio: {
            timeout: 1e3,
            excludeIOS11: !0
        },
        fonts: {
            swfContainerId: "fingerprintjs2",
            swfPath: "flash/compiled/FontList.swf",
            userDefinedFonts: [],
            extendedJsFonts: !1
        },
        screen: {
            detectScreenOrientation: !0
        },
        plugins: {
            sortPluginsFor: [/palemoon/i],
            excludeIE: !1
        },
        extraComponents: [],
        excludes: {
            enumerateDevices: !0,
            pixelRatio: !0,
            doNotTrack: !0,
            fontsFlash: !0,
            adBlock: !0
        },
        NOT_AVAILABLE: "not available",
        ERROR: "error",
        EXCLUDED: "excluded"
    }
        , m = function (e, t) {
        if (Array.prototype.forEach && e.forEach === Array.prototype.forEach)
            e.forEach(t);
        else if (e.length === +e.length)
            for (var r = 0, n = e.length; r < n; r++)
                t(e[r], r, e);
        else
            for (var o in e)
                e.hasOwnProperty(o) && t(e[o], o, e)
    }
        , i = function (e) {
        for (var t = !1, r = 0, n = e.plugins.sortPluginsFor.length; r < n; r++) {
            var o = e.plugins.sortPluginsFor[r];
            if (navigator.userAgent.match(o)) {
                t = !0;
                break
            }
        }
        return t
    }
        , a = function () {
        var e = document.createElement("canvas");
        return !(!e.getContext || !e.getContext("2d"))
    }
        , f = function (e) {
        var t = document.createElement("div");
        t.setAttribute("id", e.fonts.swfContainerId),
            document.body.appendChild(t)
    }
        , y = function () {
        var e = document.createElement("canvas")
            , t = null;
        try {
            t = e.getContext("webgl") || e.getContext("experimental-webgl")
        } catch (e) {
        }
        return t = t || null
    }
        , b = function (e) {
        e = e.getExtension("WEBGL_lose_context");
        null != e && e.loseContext()
    }

    function d(e, t) {
        return 32 === (t %= 64) ? [e[1], e[0]] : t < 32 ? [e[0] << t | e[1] >>> 32 - t, e[1] << t | e[0] >>> 32 - t] : [e[1] << (t -= 32) | e[0] >>> 32 - t, e[0] << t | e[1] >>> 32 - t]
    }

    function l(e, t) {
        e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]],
            t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]];
        var r = [0, 0, 0, 0];
        return r[3] += e[3] + t[3],
            r[2] += r[3] >>> 16,
            r[3] &= 65535,
            r[2] += e[2] + t[2],
            r[1] += r[2] >>> 16,
            r[2] &= 65535,
            r[1] += e[1] + t[1],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[0] += e[0] + t[0],
            r[0] &= 65535,
            [r[0] << 16 | r[1], r[2] << 16 | r[3]]
    }

    function p(e, t) {
        return 0 === (t %= 64) ? e : t < 32 ? [e[0] << t | e[1] >>> 32 - t, e[1] << t] : [e[1] << t - 32, 0]
    }

    function h(e) {
        return e = v(e, [0, e[0] >>> 1]),
            e = g(e, [4283543511, 3981806797]),
            e = v(e, [0, e[0] >>> 1]),
            e = g(e, [3301882366, 444984403]),
            e = v(e, [0, e[0] >>> 1])
    }

    function s(e, t) {
        for (var r = (e = e || "").length % 16, n = e.length - r, o = [0, t = t || 0], i = [0, t], a = [0, 0], s = [0, 0], u = [2277735313, 289559509], c = [1291169091, 658871167], f = 0; f < n; f += 16)
            a = [255 & e.charCodeAt(f + 4) | (255 & e.charCodeAt(f + 5)) << 8 | (255 & e.charCodeAt(f + 6)) << 16 | (255 & e.charCodeAt(f + 7)) << 24, 255 & e.charCodeAt(f) | (255 & e.charCodeAt(f + 1)) << 8 | (255 & e.charCodeAt(f + 2)) << 16 | (255 & e.charCodeAt(f + 3)) << 24],
                s = [255 & e.charCodeAt(f + 12) | (255 & e.charCodeAt(f + 13)) << 8 | (255 & e.charCodeAt(f + 14)) << 16 | (255 & e.charCodeAt(f + 15)) << 24, 255 & e.charCodeAt(f + 8) | (255 & e.charCodeAt(f + 9)) << 8 | (255 & e.charCodeAt(f + 10)) << 16 | (255 & e.charCodeAt(f + 11)) << 24],
                a = g(a, u),
                a = d(a, 31),
                a = g(a, c),
                o = v(o, a),
                o = d(o, 27),
                o = l(o, i),
                o = l(g(o, [0, 5]), [0, 1390208809]),
                s = g(s, c),
                s = d(s, 33),
                s = g(s, u),
                i = v(i, s),
                i = d(i, 31),
                i = l(i, o),
                i = l(g(i, [0, 5]), [0, 944331445]);
        switch (a = [0, 0],
            s = [0, 0],
            r) {
            case 15:
                s = v(s, p([0, e.charCodeAt(f + 14)], 48));
            case 14:
                s = v(s, p([0, e.charCodeAt(f + 13)], 40));
            case 13:
                s = v(s, p([0, e.charCodeAt(f + 12)], 32));
            case 12:
                s = v(s, p([0, e.charCodeAt(f + 11)], 24));
            case 11:
                s = v(s, p([0, e.charCodeAt(f + 10)], 16));
            case 10:
                s = v(s, p([0, e.charCodeAt(f + 9)], 8));
            case 9:
                s = v(s, [0, e.charCodeAt(f + 8)]),
                    s = g(s, c),
                    s = d(s, 33),
                    s = g(s, u),
                    i = v(i, s);
            case 8:
                a = v(a, p([0, e.charCodeAt(f + 7)], 56));
            case 7:
                a = v(a, p([0, e.charCodeAt(f + 6)], 48));
            case 6:
                a = v(a, p([0, e.charCodeAt(f + 5)], 40));
            case 5:
                a = v(a, p([0, e.charCodeAt(f + 4)], 32));
            case 4:
                a = v(a, p([0, e.charCodeAt(f + 3)], 24));
            case 3:
                a = v(a, p([0, e.charCodeAt(f + 2)], 16));
            case 2:
                a = v(a, p([0, e.charCodeAt(f + 1)], 8));
            case 1:
                a = v(a, [0, e.charCodeAt(f)]),
                    a = g(a, u),
                    a = d(a, 31),
                    a = g(a, c),
                    o = v(o, a)
        }
        return o = v(o, [0, e.length]),
            i = v(i, [0, e.length]),
            o = l(o, i),
            i = l(i, o),
            o = h(o),
            i = h(i),
            o = l(o, i),
            i = l(i, o),
        ("00000000" + (o[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (o[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (i[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (i[1] >>> 0).toString(16)).slice(-8)
    }

    return s(t, 31)
}

总结拓展

1.总结

cookie中的参数uuid使用第三方库生成,b_lsid、buvid_fp使用js生成。在程序运行的过程中运行的运行过网址会保存在日志中,超过七天的日志则自动打包压缩。

2.拓展

本文只增加了视频的播放量,与之相应的还有完播率,完播率的请求为heartbeat请求实现。

要给一个视频增加多个播放量需要使用代理ip实现,同一个ip只能给一个视频增加极少的播放量。

3.源码下载

码云:bilibili: bilibili播放量增加爬虫文章来源地址https://www.toymoban.com/news/detail-755238.html

到了这里,关于使用python编写的爬虫给X站视频增加一个播放量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web前端开发技术课程实验一——制作一个视频播放页面(可控制播放/暂停)

    学习Web前端中的视频网页制作 学会html和js相结合 学会视频播放/暂停/放缩大小的功能 掌握 html 基本语法 掌握javascript基本语法 掌握条件语句 周一至周五晚上 7 点—晚上9点

    2024年02月16日
    浏览(56)
  • <Python>PyQt5+ffmpeg,简单视频播放器的编写(解码器:K-lite)

    更新日志: 202211251640:第一版,基本功能:视频导入,播放、暂停、播放时间显示、音量控制 概述:本文是利用PyQt5加上ffmpeg来编写一个具备基本功能的视频播放器(播放、暂停、进度调整、音量调整、视频播放列表、文件夹导入视频等) 实现步骤设想:PyQt制作UI界面,利

    2024年02月16日
    浏览(54)
  • Python爬虫:给我一个链接,西瓜视频随便下载

    1.实现原理 首先,我们需要来到西瓜视频的官网,链接为:西瓜视频,随便点击其中一个视频进入,点击电脑键盘的F12来到开发者模式,按ctrl+F进行搜索,输入video,如下: 我们可以发现,这里有一个视频链接,我们点击这个链接进入,依旧按电脑F12键来到开发者模式,继续

    2024年02月14日
    浏览(81)
  • 使用Python开发一个自动给抖音视频点赞的功能

    目录 1、解释说明: 2、使用示例: 3、注意事项: Python是一种高级编程语言,广泛应用于软件开发、数据分析、人工智能等领域。在抖音这样的短视频平台上,用户可以对喜欢的视频进行点赞。本模块将介绍如何使用Python开发一个自动给抖音视频点赞的功能。 首先,需要安

    2024年02月04日
    浏览(62)
  • kotlin 编写一个简单的天气预报app(二)增加搜索城市功能

    在activity_main.xml里增加输入框来输入城市,在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 增加搜索按钮 使用broadcast的方式把收到的天气信息发送到界面显示。 Android的广播机制是一种用于在应用程序内和应用程序之间传递消息和事件的

    2024年02月14日
    浏览(45)
  • 使用Python编写搜索引擎关键词排名监测爬虫

    目录 1. 了解排名监测的重要性 2. 选择合适的搜索引擎 3. 构建排名监测爬虫

    2024年02月09日
    浏览(58)
  • 测试C#调用Aplayer播放视频(3:编写简易播放器)

      学习了参考文献1中的示例代码,也找出了前一篇文章中自己测试控件但无法播放视频的问题(没有将解码库文件复制到可执行程序所在的codecs文件夹内),本文基于APlayer组件编写简单的视频播放器,主要实现以下功能: 序号 功能 说明 1 自定义logo 调用SetCustomLogo函数设

    2024年02月05日
    浏览(67)
  • 使用Python编写一个渗透测试探测工具

    本篇将会涉及: 资源探测 一个有用的字典资源 第一个暴力探测器 资源探测 资源探测在渗透测试中还是属于资源的映射和信息的收集阶段。 主要有以下三个类型: 字典攻击 暴力破解 模糊测试 字典攻击,在破解密码或密钥的时候,通过自定义的字典文件,有针对性地尝试字

    2024年01月16日
    浏览(44)
  • 求助 爬虫视频无法播放,显示文件已损坏

    import requests import json #数据抓取 base_url=\\\"https://haokan.baidu.com/haokan/ui-search/pc/search/video?pn=1rn=10type=videoquery=%E9%93%81%E8%BD%A8%E4%B8%8B%E9%9B%A8sign=d0fa20768e3d07642df1ae7734d1793cversion=1timestamp=1688716281831\\\" headers={ \\\'user-agent\\\':\\\'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.

    2024年02月08日
    浏览(60)
  • 音视频开发:ffplay使用ffmpeg滤镜实现倍速播放

    曾经为实现倍速播放使用过ffmpeg,对音频使用atempo滤镜即可实现变速不变调。但是当时效果并不是特别好,和soundtouch相比处理后的音质有明显的区别。最近用新版本的ffmpeg滤镜重新实现了倍速播放,发现效果变好,已经达到可接受的程度,所以在此分享具体实现。 ffmpeg倍速

    2024年02月03日
    浏览(110)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包