


[Python] Skrip untuk Memproses dan Menganalisis Komen Video Bilibili dan Sembang Bullet
Jan 05, 2025 pm 07:54 PMPenafian: Untuk tujuan pembelajaran dan penyelidikan peribadi sahaja. Dilarang sama sekali untuk kegunaan lain.
pengenalan
Skrip ini dibangunkan untuk tujuan akademik dalam bidang kemanusiaan: khususnya, untuk penyelidikan mengenai analisis wacana platform rangkaian. Ia membolehkan kajian menyeluruh tentang sembang dan ulasan peluru Bilibili. Tumpuan adalah pada kandungan luas yang berkaitan dengan subbudaya dan isu sosial (berdasarkan bahan yang disemak), yang memerlukan penyiasatan, analisis, tambahan dan ringkasan yang menyeluruh.
Memandangkan kandungan yang luas, hasilnya dibentangkan dalam pautan:
Penyelidikan tentang ulasan dan sembang bullet dari perspektif subkultur:
https://nbviewer.org/github/Excalibra/scripts/blob/main/d-ipynb/Semakan Perspektif Subkultur dan Penyelidikan Skrin Bullet.ipynb
Rancangannya adalah untuk menyelesaikan penyelidikan mengenai bahagian "subkultur" dan "isu sosial" sebelum mengumumkannya. Namun, memandangkan keperluan penyelidik dan pelajar dalam bidang tersebut, ia telah dikongsi sekarang.
Ciri & Prinsip
Ciri Skrip:
Mengumpul data seperti tajuk video, pengarang, tarikh penerbitan, kiraan tontonan, kegemaran, perkongsian, sembang bullet kumulatif, kiraan ulasan, penerangan video, kategori, pautan video dan pautan imej muka depan.
Mengekstrak 100 bullet chat dengan skor sentimen, analisis sebahagian daripada pertuturan, cap masa dan ID pengguna.
Mendapatkan 20 ulasan teratas, bersama dengan suka, skor sentimen, balasan topik, ID keahlian, nama dan cap masa ulasan.
Ciri yang dipertingkatkan:
Sembang peluru: Nama pengguna, hari lahir, tarikh pendaftaran, kiraan pengikut dan kiraan berikut (menggunakan kuki).
Ulasan: Memaparkan lokasi IP pengulas (melalui antara muka web).
Mengoutput data ke fail Excel dengan median sentimen, statistik kekerapan perkataan, awan perkataan dan carta bar.
Prinsip Kerja:
Menggunakan API untuk mengambil maklumat JSON, memprosesnya menjadi fail Excel dan menggunakan model bahasa seperti SnowNLP, ThuNLP dan Jieba untuk pembahagian teks, penapisan kata henti, analisis sebahagian daripada pertuturan dan statistik kekerapan perkataan. Matplotlib digunakan untuk menjana graf.
Bermula Dengan Cepat
(Pengguna Windows boleh menggunakan pip dan python. Pengguna Mac harus menggunakan pip3 dan python3 secara lalai.)
Kod Sumber Skrip: Repositori GitHub.
Perpustakaan Prasyarat:
Pasang perpustakaan yang diperlukan:
pemasangan pip3 --no-cache-dir -r https://ghproxy.com/https://github.com/Excalibra/scripts/blob/main/d-txt/requirements.txt
Kemudian jalankan skrip (dalam talian):
python3 -c "$(curl -fsSL https://ghproxy.com/https://github.com/Excalibra/scripts/blob/main/d-python/get_bv_baseinfo.py)"
import json import time import requests import os from datetime import datetime import re from bs4 import BeautifulSoup from openpyxl import Workbook from openpyxl.styles import Alignment, Font from snownlp import SnowNLP import statistics import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt import platform import thulac import matplotlib.font_manager as fm from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By ''''''''' # Reference Links ## General Regex: https://regex101.com/ Zhihu - Two ways to obtain Bilibili video bullet comments using Python: https://zhuanlan.zhihu.com/p/609154366 Juejin - Parsing Bilibili video bullet comments: https://juejin.cn/post/7137928570080329741 CSDN - Bilibili historical bullet comment crawler: https://blog.csdn.net/sinat_18665801/article/details/104519838 CSDN - How to write a Bilibili bullet comment crawler: https://blog.csdn.net/bigbigsman/article/details/78639053?utm_source=app Bilibili - Bilibili bullet comment notes: https://www.bilibili.com/read/cv5187469/ Bilibili third-party API: https://www.bookstack.cn/read/BilibiliAPIDocs/README.md ## Reverse Lookup by UID https://github.com/esterTion/BiliBili_crc2mid https://github.com/cwuom/GetDanmuSender/blob/main/main.py https://github.com/Aruelius/crc32-crack ## User Basic Information https://api.bilibili.com/x/space/acc/info?mid=298220126 https://github.com/ria-klee/bilibili-uid https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/user/space.md ## Comments https://www.bilibili.com/read/cv10120255/ https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/readme.md ## JSON https://json-schema.apifox.cn https://bbs.huaweicloud.com/blogs/279515 https://www.cnblogs.com/mashukui/p/16972826.html ## Cookie https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies ## Unpacking https://www.cnblogs.com/will-wu/p/13251545.html https://www.w3schools.com/python/python_tuples.asp ''''''''''' class BilibiliAPI: @staticmethod # Parse video link basic information JSON and return it in JSON format def get_bv_json(video_url): video_id = re.findall(r'BV\w+', video_url)[0] api_url = f'https://api.bilibili.com/x/web-interface/view?bvid={video_id}' bv_json = requests.get(api_url).json() return bv_json @staticmethod # Parse video link bullet comments XML using the 'cid' field in JSON def get_danmu_xml(bv_json): cid = bv_json['data']["cid"] api_url = f'https://comment.bilibili.com/{cid}.xml' danmu_xml = api_url return danmu_xml @staticmethod # Parse video link comments JSON using the 'aid' field in JSON def get_comment_json(bv_json): aid = bv_json['data']["aid"] api_url = f'https://api.bilibili.com/x/v2/reply/main?next=1&type=1&oid={aid}' comment_json = requests.get(api_url).json() return comment_json @staticmethod # Enhanced parsing of video link comments JSON using the 'aid' field in JSON def get_comment_json_to_webui(bv_json): aid = bv_json['data']["aid"] api_url = f'https://api.bilibili.com/x/v2/reply/main?next=1&type=1&oid={aid}' # Determine the current operating system type if platform.system() == "Windows": # Windows platform driver = webdriver.Chrome() else: # Other platforms driver = webdriver.Chrome(ChromeDriverManager().install()) # Provide login time print("Provide 45 seconds for Bilibili login") time.sleep(45) # Open the link driver.get(api_url) # Provide view effect time print("Provide 15 seconds to check the effects") time.sleep(15) # Find the <pre class="brush:php;toolbar:false"> element pre_element = driver.find_element(By.TAG_NAME, 'pre') # Get the text content of the element text_content = pre_element.text # Close WebDriver driver.quit() return text_content @staticmethod # Traverse user information and return basic parameters, preparing for XLSX write-in def get_user_card(mid, cookies): api_url = f'https://account.bilibili.com/api/member/getCardByMid?mid={mid}' try: response = requests.get(api_url, cookies=cookies) user_card_json = response.json() except json.JSONDecodeError: return {"error": "Failed to parse JSON. Ensure a good network environment. Too many API calls might trigger restrictions; try again later."} if 'message' in user_card_json: message = user_card_json['message'] if 'request blocked' in message or 'frequent requests' in message: return {"warning": "Ensure a good network environment. Too many API calls might trigger restrictions; try again later."} return user_card_json class CRC32Checker: '''''''''' # CRC32 cracking # Source: https://github.com/Aruelius/crc32-crack # Author: Aruelius # Note: This section has been slightly adjusted and encapsulated as a class for easier use. ''''''''' CRCPOLYNOMIAL = 0xEDB88320 crctable = [0 for x in range(256)] def __init__(self): self.create_table() def create_table(self): # Create a CRC table for quick CRC value computation for i in range(256): crcreg = i for _ in range(8): if (crcreg & 1) != 0: crcreg = self.CRCPOLYNOMIAL ^ (crcreg >> 1) else: crcreg = crcreg >> 1 self.crctable[i] = crcreg def crc32(self, string): # Compute the CRC32 value for the given string crcstart = 0xFFFFFFFF for i in range(len(str(string))): index = (crcstart ^ ord(str(string)[i])) & 255 crcstart = (crcstart >> 8) ^ self.crctable[index] return crcstart def crc32_last_index(self, string): # Compute the last character CRC table index for a given string crcstart = 0xFFFFFFFF for i in range(len(str(string))): index = (crcstart ^ ord(str(string)[i])) & 255 crcstart = (crcstart >> 8) ^ self.crctable[index] return index def get_crc_index(self, t): # Find the index in the CRC table corresponding to the highest byte value for i in range(256): if self.crctable[i] >> 24 == t: return i return -1 def deep_check(self, i, index): # Deep check based on index and previous CRC32 values to verify the assumption string = "" tc = 0x00 hashcode = self.crc32(i) tc = hashcode & 0xff ^ index[2] if not (tc <= 57 and tc >= 48): return [0] string += str(tc - 48) hashcode = self.crctable[index[2]] ^ (hashcode >> 8) tc = hashcode & 0xff ^ index[1] if not (tc <= 57 and tc >= 48): return [0] string += str(tc - 48) hashcode = self.crctable[index[1]] ^ (hashcode >> 8) tc = hashcode & 0xff ^ index[0] if not (tc <= 57 and tc >= 48): return [0] string += str(tc - 48) hashcode = self.crctable[index[0]] ^ (hashcode >> 8) return [1, string] def main(self, string): # Main function to compute and validate CRC32 for the given string index = [0 for x in range(4)] i = 0 ht = int(f"0x{string}", 16) ^ 0xffffffff for i in range(3, -1, -1): index[3-i] = self.get_crc_index(ht >> (i*8)) snum = self.crctable[index[3-i]] ht ^= snum >> ((3-i)*8) for i in range(100000000): lastindex = self.crc32_last_index(i) if lastindex == index[3]: deepCheckData = self.deep_check(i, index) if deepCheckData[0]: break if i == 100000000: return -1 return f"{i}{deepCheckData[1]}" class Tools: @staticmethod # Get save path and format def get_save(): return os.path.join(os.path.join(os.path.expanduser("~"), "Desktop"), "Bilibili_Video_Analysis_{}.xlsx".format(datetime.now().strftime('%Y-%m-%d'))) @staticmethod # Format timestamp def format_timestamp(timestamp): dt_object = datetime.fromtimestamp(timestamp) formatted_time = dt_object.strftime("%Y-%m-%d %H:%M:%S") return formatted_time @staticmethod # Calculate sentiment score def calculate_sentiment_score(text): s = SnowNLP(text) sentiment_score = s.sentiments return sentiment_score @staticmethod # Generate a word cloud def get_word_cloud(sheet_name: str, workbook: Workbook): sheet = workbook[sheet_name] # Read frequency data words = [] frequencies = [] for row in sheet.iter_rows(min_row=2, values_only=True): words.append(row[0]) frequencies.append(row[1]) system = platform.system() if system == 'Darwin': # macOS font_path = '/System/Library/Fonts/STHeiti Light.ttc' elif system == 'Windows': font_path = 'C:/Windows/Fonts/simhei.ttf' else: # Other OS font_path = 'simhei.ttf' wordcloud = WordCloud(background_color='white', max_words=100, font_path=font_path) word_frequency = dict(zip(words, frequencies)) wordcloud.generate_from_frequencies(word_frequency) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show() @staticmethod # Generate horizontal statistics chart def get_word_chart(sheet_name: str, workbook): sheet = workbook[sheet_name] words = [] frequencies = [] for row in sheet.iter_rows(min_row=2, values_only=True): words.append(row[0]) frequencies.append(row[1]) system = platform.system() if system == 'Darwin': font_path = '/System/Library/Fonts/STHeiti Light.ttc' elif system == 'Windows': font_path = 'C:/Windows/Fonts/simhei.ttf' else: font_path = 'simhei.ttf' custom_font = fm.FontProperties(fname=font_path) fig, ax = plt.subplots() ax.barh(words, frequencies) ax.set_xlabel("Frequency", fontproperties=custom_font) ax.set_ylabel("Words", fontproperties=custom_font) plt.yticks(fontproperties=custom_font) plt.show() @staticmethod def get_user_info_by_card(user_card_json): info = { 'name': "N/A", 'birthday': "N/A", 'regtime': "N/A", 'fans': "N/A", 'friend': "N/A" } try: info['name'] = user_card_json['card']['name'] info['birthday'] = user_card_json['card']['birthday'] info['regtime'] = Tools.format_timestamp(int(user_card_json['card']['regtime'])) info['fans'] = user_card_json['card']['fans'] info['friend'] = user_card_json['card']['friend'] except KeyError: pass return tuple(info.values()) class BilibiliExcel: @staticmethod # Write video basic information def write_base_info(workbook, bv_json): sheet = workbook.create_sheet(title="Video Info") headers = ["Video Title", "Author", "Publish Time", "Views", "Favorites", "Shares", "Total Bullet Comments", "Comments Count", "Video Description", "Category", "Video Link", "Thumbnail Link"] sheet.append(headers) data = [bv_json["data"]["title"], bv_json["data"]["owner"]["name"], Tools.format_timestamp(bv_json["data"]["pubdate"]), bv_json["data"]["stat"]["view"], bv_json["data"]["stat"]["favorite"], bv_json["data"]["stat"]["share"], bv_json["data"]["stat"]["danmaku"], bv_json["data"]["stat"]["reply"], bv_json["data"]["desc"], bv_json["data"]["tname"], video_url, bv_json["data"]["pic"]] sheet.append(data) @staticmethod def save_workbook(workbook): workbook.save(Tools.get_save()) class PrintInfo: # Print basic information @staticmethod def base_message(): if 'Windows' == platform.system(): os.system('cls') else: os.system('clear') text = ''' ************************************ Bilibili Video Analysis v2023.6.26 Author: Github.com/hoochanlon Project URL: https://github.com/hoochanlon/scripts Features: 1. Analyze and visualize Bilibili video data. Disclaimer: For research and learning purposes only. ************************************ ''' print(text.center(50, ' ')) if __name__ == '__main__': PrintInfo.base_message() while True: video_url = input("Paste the Bilibili video link: ") if re.match(r'.*BV\w+', video_url): break else: print("Invalid link format. Please re-enter.") bv_json = BilibiliAPI.get_bv_json(video_url) workbook = Workbook() workbook.remove(workbook.active) BilibiliExcel.write_base_info(workbook, bv_json) BilibiliExcel.save_workbook(workbook)
Nota Penggunaan:
- Untuk memudahkan input kuki, anda boleh menggunakan key=value; format, seperti "a=a;", untuk melangkau langkah yang tidak perlu.
- Melihat lokasi IP memerlukan log masuk ke akaun Bilibili anda melalui pemacu web.
Atas ialah kandungan terperinci [Python] Skrip untuk Memproses dan Menganalisis Komen Video Bilibili dan Sembang Bullet. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Python's Unittest and Pytest adalah dua kerangka ujian yang digunakan secara meluas yang memudahkan penulisan, penganjuran dan menjalankan ujian automatik. 1. Kedua -duanya menyokong penemuan automatik kes ujian dan menyediakan struktur ujian yang jelas: Unittest mentakrifkan ujian dengan mewarisi kelas ujian dan bermula dengan ujian \ _; Pytest lebih ringkas, hanya memerlukan fungsi bermula dengan ujian \ _. 2. Mereka semua mempunyai sokongan dakwaan terbina dalam: Unittest menyediakan kaedah AssertEqual, AssertTrue dan lain-lain, manakala PYTest menggunakan pernyataan menegaskan yang dipertingkatkan untuk memaparkan butiran kegagalan secara automatik. 3. Semua mempunyai mekanisme untuk mengendalikan penyediaan ujian dan pembersihan: un

Pythonisidealfordataanalysisysisduetonumpyandpandas.1) numpyexcelsatnumericalcomputationswithfast, multi-dimensiArarraySandvectorizedoperationsLikenp.sqrt ()

Pengaturcaraan Dinamik (DP) mengoptimumkan proses penyelesaian dengan memecahkan masalah kompleks ke dalam subproblem yang lebih mudah dan menyimpan hasilnya untuk mengelakkan pengiraan berulang. Terdapat dua kaedah utama: 1. Top-down (Hafalan): Recursif menguraikan masalah dan menggunakan cache untuk menyimpan hasil pertengahan; 2. Bottom-Up (Jadual): Bangun secara beransur-ansur dari keadaan asas. Sesuai untuk senario di mana nilai maksimum/minimum, penyelesaian optimum atau subproblem yang bertindih diperlukan, seperti urutan Fibonacci, masalah backpacking, dan lain -lain.

Untuk melaksanakan iterator tersuai, anda perlu menentukan kaedah __iter__ dan __Next__ di dalam kelas. ① Kaedah __iter__ mengembalikan objek iterator itu sendiri, biasanya diri sendiri, bersesuaian dengan persekitaran berulang seperti untuk gelung; ② Kaedah __Next__ mengawal nilai setiap lelaran, mengembalikan elemen seterusnya dalam urutan, dan apabila tidak ada lagi item, pengecualian hentian harus dibuang; ③ Status mesti dikesan dengan betul dan keadaan penamatan mesti ditetapkan untuk mengelakkan gelung tak terhingga; ④ Logik kompleks seperti penapisan talian fail, dan perhatikan pembersihan sumber dan pengurusan memori; ⑤ Untuk logik mudah, anda boleh mempertimbangkan menggunakan hasil fungsi penjana sebaliknya, tetapi anda perlu memilih kaedah yang sesuai berdasarkan senario tertentu.

Trend masa depan dalam Python termasuk pengoptimuman prestasi, jenis yang lebih kuat, peningkatan runtime alternatif, dan pertumbuhan berterusan bidang AI/ML. Pertama, Cpython terus mengoptimumkan, meningkatkan prestasi melalui masa permulaan yang lebih cepat, pengoptimuman panggilan fungsi dan operasi integer yang dicadangkan; Kedua, jenis petikan sangat terintegrasi ke dalam bahasa dan alat untuk meningkatkan pengalaman keselamatan dan pembangunan kod; Ketiga, runtime alternatif seperti Pyscript dan Nuitka menyediakan fungsi baru dan kelebihan prestasi; Akhirnya, bidang AI dan Sains Data terus berkembang, dan perpustakaan yang muncul mempromosikan pembangunan dan integrasi yang lebih cekap. Trend ini menunjukkan bahawa Python sentiasa menyesuaikan diri dengan perubahan teknologi dan mengekalkan kedudukan utama.

Modul soket Python adalah asas pengaturcaraan rangkaian, menyediakan fungsi komunikasi rangkaian peringkat rendah, sesuai untuk membina aplikasi klien dan pelayan. Untuk menyediakan pelayan TCP asas, anda perlu menggunakan socket.socket () untuk membuat objek, mengikat alamat dan port, panggilan. Listen () untuk mendengar sambungan, dan menerima sambungan klien melalui .accept (). Untuk membina klien TCP, anda perlu membuat objek soket dan panggilan .Connect () untuk menyambung ke pelayan, kemudian gunakan .sendall () untuk menghantar data dan .recv () untuk menerima respons. Untuk mengendalikan pelbagai pelanggan, anda boleh menggunakan 1. Threads: Mulakan benang baru setiap kali anda menyambung; 2. Asynchronous I/O: Sebagai contoh, Perpustakaan Asyncio dapat mencapai komunikasi yang tidak menyekat. Perkara yang perlu diperhatikan

Polimorfisme adalah konsep teras dalam pengaturcaraan berorientasikan objek Python, merujuk kepada "satu antara muka, pelbagai pelaksanaan", yang membolehkan pemprosesan bersatu pelbagai jenis objek. 1. Polimorfisme dilaksanakan melalui penulisan semula kaedah. Subkelas boleh mentakrifkan semula kaedah kelas induk. Sebagai contoh, kaedah bercakap () kelas haiwan mempunyai pelaksanaan yang berbeza dalam subkelas anjing dan kucing. 2. Penggunaan praktikal polimorfisme termasuk memudahkan struktur kod dan meningkatkan skalabilitas, seperti memanggil kaedah cabutan () secara seragam dalam program lukisan grafik, atau mengendalikan tingkah laku umum watak -watak yang berbeza dalam pembangunan permainan. 3. Polimorfisme pelaksanaan Python perlu memenuhi: Kelas induk mentakrifkan kaedah, dan kelas kanak -kanak mengatasi kaedah, tetapi tidak memerlukan warisan kelas induk yang sama. Selagi objek melaksanakan kaedah yang sama, ini dipanggil "jenis itik". 4. Perkara yang perlu diperhatikan termasuk penyelenggaraan

Jawapan teras kepada pengirim senarai Python adalah menguasai sintaks [Start: End: Step] dan memahami kelakuannya. 1. Format asas pengirim senarai adalah senarai [Mula: akhir: langkah], di mana permulaan adalah indeks permulaan (termasuk), akhir adalah indeks akhir (tidak termasuk), dan langkah adalah saiz langkah; 2. Omit Mula secara lalai bermula dari 0, endek akhir secara lalai hingga akhir, omite langkah secara lalai kepada 1; 3. Gunakan my_list [: n] untuk mendapatkan item n pertama, dan gunakan my_list [-n:] untuk mendapatkan item n yang terakhir; 4. Gunakan langkah untuk melangkau unsur -unsur, seperti my_list [:: 2] untuk mendapatkan angka, dan nilai langkah negatif dapat membalikkan senarai; 5. Kesalahpahaman biasa termasuk indeks akhir tidak
