日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二次元属性被稀释,B站还剩什么?| 数据获取

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二次元属性被稀释,B站还剩什么?| 数据获取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文為HeoiJin原創投稿文章,歡迎更多讀者投稿!

作者簡介

HeoiJin:立志透過數據看清世界的產品策劃、數據分析、產品策劃領域。
萬物皆營銷 | 資本永不眠 | 數據恒真理
CSDN:https://me.csdn.net/weixin_40679090

由于篇幅過大原因,文章將分為上篇與下篇:上篇為數據獲取,下篇為數據分析。今天為大家帶來的是上篇:獲取B站數據!

本篇目錄

一、項目背景

最近看了一篇對B站2019年數據解讀的文章,文章最后得出結論:B站的二次元屬性已被稀釋,逐漸走向大眾。

那么走過2020年的春節后,二次元屬性的稀釋情況如何?什么分區是B站的龍頭?b站的主流用戶喜歡什么標簽的視頻?各分區的情況能帶來什么社會價值?本項目將通過數據帶你一起窺探B站的變化。

項目特色:

  • 利用Scrapy框架進行網頁獲取

  • 利用pandas、numpy進行數據分析

  • 利用pyecharts進行數據可視化

  • 利用scipy進行相關性分析

  • 二、工具和環境

    • 語言:python 3.7

    • IDE:Pycharm

    • 瀏覽器:Chrome

    • 框架:Scrapy 1.8.0

    三、需求分析

    B站是我們熟悉的彈幕視頻分享網站,根據百度百科的資料顯示,B站的主要業務包括直播、游戲、廣告、電商、漫畫、電競。

    在這么多項的業務當中,我們不難看到一個共同點,B站的主要盈利模式是高度依賴用戶,其次是主播和UP主。

    因此要分析B站的變化,就要從用戶喜愛變化情況切入分析,本次項目將采集以下數據:

  • 排行榜的分區名

  • 排行頁:視頻的標題、作者、綜合評分、排名、視頻鏈接

  • 詳情頁:視頻的播放量、三連量、評論量、彈幕量、轉發量、熱門標簽

  • 四、頁面分析

    4.1 排行榜頁解析

    首先從排行榜頁面進行過分析。禁用Javascript后,發現要提取的信息都是在靜態網頁當中,那么在編寫代碼的時候通過xpath定位抓取信息即可。

    完成單個分區排行榜頁面的分析后,只需找到各排行榜對應的url即可實現爬取多個分區。通過檢查網頁源碼,發現每一個分區都只有文字描述,并沒有相關的url,因此通過分析url變化再自行構造請求的url。

    url規則即對應編號:https://www.bilibili.com/ranking/all/編號/0/30

    以下是各分類對應的編號:

    我們創建一個編號的列表,并用循環拼接url即可完成url的批量生成

    from pprint import pprintlabels_num=[0,1,168,3,129,4,36,188,160,119,155,5,181] url_list=[f'https://www.bilibili.com/ranking/all/{i}/0/30' for i in labels_num]#利用pprint方法,我們能夠在輸出時實現一個url一行pprint(url_list)

    4.2 詳細信息頁面api解析

    我們還需要獲取視頻的播放量、三連量、評論量、彈幕量、轉發量、熱門標簽,但在排行榜頁中并沒有體現,因此要進一步請求視頻的詳情頁。

    進入視頻詳情頁,同樣禁用Javascript后,可以發現要找的信息都是ajax異步加載的,在這里考慮抓取api文件來獲取信息,這樣能夠大大提升解析網頁的效率,也不容易被封ip
    ?

    通過一輪的分析之后,找到了視頻的播放量、三連量、評論量、彈幕量、轉發量數據在stat?aid=文件當中,url末端的數字即視頻的id,后續對視頻鏈接進行切片獲取id再拼接Request URL即可。

    訪問該Request URL,是標準的json數據。

    對數據頁面進行json解析,后續只需獲得鍵:[‘data ‘]下的數據即可
    ?

    到這里還缺少了熱門標簽的數據,繼續抓包找到另外一個api的url,同樣需要通過視頻的id進行url構造。

    ?但直接訪問這個url,會顯示要找的頁面不存在。觀察url發現,?后包含了很多參數,嘗試僅保留關鍵的視頻id參數再次訪問后,能夠獲取需要的信息。也是非常工整的json數據。
    ?
    ?解析json后,只需要獲取鍵[“data”]下的所有[‘tag_name ‘]即可。
    ?

    至此所有需要的url及相關定位信息都基本找到,下面就可以開始編寫文件了。

    五、分析

    5.1 Scrapy框架概述

    Scrapy是一個為了獲取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。

    Scrapy架構圖(綠色箭頭為數據流向)

    本次項目涉及的組件介紹

    Scrapy Engine
    引擎負責控制數據流在系統中所有組件中流動,并在相應動作發生時觸發事件。

    調度器(Scheduler)
    調度器從引擎接收request并將他們入隊,以便之后引擎請求他們時提供給引擎。

    下載器(Downloader)
    下載器負責獲取頁面數據并提供給引擎,而后提供給spider。

    Spiders
    Spider是Scrapy用戶編寫用于分析response并提取item(即獲取到的item)或額外跟進的URL的類。每個spider負責處理一個特定(或一些)網站。

    Item Pipeline
    Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到數據庫中)

    5.2 為什么用Scrapy框架

    Scrapy 使用了異步網絡框架來處理網絡通訊。相比于普通的Request或者多線程,Scrapy在獲取頁面上具有更高的效率(詳細的效率比較可以看這篇《Python x蟲的N種姿勢》:https://www.cnblogs.com/jclian91/p/9799697.html)

    同時完善的框架意味著只需要定制開發其中的模塊就能輕松實現,有清晰的邏輯路徑。

    六、編寫

    如果之前還沒有安裝Scrapy,可在cmd中使用pip語句進行安裝

    pip3 install Scrapy

    6.1 新建項目

    去到要新建文件的文件夾中,在地址欄輸入cmd,進入cmd模式。

    scrapy startproject blbl cd blbl scrapy genspider bl "bilibili.com"

    命令解讀:

    • scrapy startproject blbl:創建項目,項目文件命名為blbl

    • sd blbl :進入項目文件

    • scrapy genspider bl “bilibili.com” :創建文件,名為bl(注意名應有別于項目文件名,且在該項目中是唯一的),限定獲取的url范圍”bilibili.com”

    到這里我們創建就完成了,目錄結構如下:

    簡單介紹下本項目所需文件的作用:

    • scrapy.cfg :項目的配置文件

    • blbl/blbl :項目的Python模塊,將會從這里引用代碼

    • items.py :項目的目標文件

    • pipelines.py :項目的管道文件

    • settings.py :項目的設置文件

    • spiders/ :存儲獲取代碼目錄

    • bl.py :我們通過命令新建的文件

    6.2 創建并編寫start.py

    通常啟動Scrapy都是在shell或者cmd命令中進行。為了方便啟動或者進行debug測試,創建一個start.py用來控制啟動

    目標:

    • 在py文件中執行cmd命令

    from scrapy import cmdlinecmdline.execute('scrapy crawl bl'.split())

    創建完成后,我們每次運行或者debug測試時,只需要執行這個文件即可。

    6.3 編寫settings.py

    目標:

    • 關閉遵循君子協議

    • 設置延遲(好的程序不應對別人服務器造成過大壓力)

    • 構造請求頭

    • 打開Pipeline(用于儲存數據,取消注釋即可)

    ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 1 DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'} ITEM_PIPELINES = { 'bilibili.pipelines.BlblPipeline': 300, }

    6.4 編寫bl.py

    bl.py是我們通過cmd的命令符創建的文件,主要用于解析網站內容,并將解析后的數據傳給items pipeline。

    目標:

    • 獲得排名、視頻標題、作者、得分

    • 獲得視頻id,構造api鏈接

    • 向api鏈接發送請求

    • 獲得三連、彈幕、評論和熱門標簽等數據

    import scrapy from blbl.items import BlblItem import json class BlSpider(scrapy.Spider):name = 'bl'allowed_domains = ['bilibili.com']#start_urls默認為'http://'+allowed_domains[0]#所以這里我們要重寫start_urls,把排行榜頁面的url列表賦值給start_urlsstart_urls = ['https://www.bilibili.com/ranking/all/0/0/30','https://www.bilibili.com/ranking/all/1/0/30','https://www.bilibili.com/ranking/all/168/0/30','https://www.bilibili.com/ranking/all/3/0/30','https://www.bilibili.com/ranking/all/129/0/30','https://www.bilibili.com/ranking/all/4/0/30','https://www.bilibili.com/ranking/all/36/0/30','https://www.bilibili.com/ranking/all/188/0/30','https://www.bilibili.com/ranking/all/160/0/30','https://www.bilibili.com/ranking/all/119/0/30','https://www.bilibili.com/ranking/all/155/0/30','https://www.bilibili.com/ranking/all/5/0/30','https://www.bilibili.com/ranking/all/181/0/30']def parse(self, response):#獲取當前爬取的榜單rank_tab=response.xpath('//ul[@class="rank-tab"]/li[@class="active"]/text()').getall()[0]print('='*50,'當前爬取榜單為:',rank_tab,'='*50)#視頻的信息都放在li標簽中,這里先獲取所有的li標簽#之后遍歷rank_lists獲取每個視頻的信息rank_lists=response.xpath('//ul[@class="rank-list"]/li')for rank_list in rank_lists:rank_num=rank_list.xpath('div[@class="num"]/text()').get()title=rank_list.xpath('div/div[@class="info"]/a/text()').get()# 抓取視頻的url,切片后獲得視頻的idid=rank_list.xpath('div/div[@class="info"]/a/@href').get().split('/av')[-1]# 拼接詳情頁api的urlDetail_link=f'https://api.bilibili.com/x/web-interface/archive/stat?aid={id}'Labels_link=f'https://api.bilibili.com/x/tag/archive/tags?aid={id}'author=rank_list.xpath('div/div[@class="info"]/div[@class="detail"]/a/span/text()').get()score=rank_list.xpath('div/div[@class="info"]/div[@class="pts"]/div/text()').get()#如用requests庫發送請求,要再寫多一次請求頭# 因此我們繼續使用Scrapy向api發送請求# 這里創建一個字典去儲存我們已經抓到的數據# 這樣能保證我們的詳細數據和排行數據能一 一對應無需進一步合并# 如果這里直接給到Scrapy的Item的話,最后排行頁的數據會有缺失items={'rank_tab':rank_tab,'rank_num' : rank_num ,'title' :title ,'id' : id ,'author' : author ,'score' : score ,'Detail_link':Detail_link}# 將api發送給調度器進行詳情頁的請求,通過meta傳遞排行頁數據yield scrapy.Request(url=Labels_link,callback=self.Get_labels,meta={'item':items},dont_filter=True)def Get_labels(self,response):#獲取熱門標簽數據items=response.meta['item']Detail_link=items['Detail_link']# 解析json數據html=json.loads(response.body)Tags=html['data'] #視頻標簽數據#利用逗號分割列表,返回字符串tag_name=','.join([i['tag_name'] for i in Tags])items['tag_name']=tag_nameyield scrapy.Request(url=Detail_link,callback=self.Get_detail,meta={'item':items},dont_filter=True)def Get_detail(self,response):# 獲取排行頁數據items=response.meta['item']rank_tab=items['rank_tab']rank_num=items['rank_num']title=items['title']id=items['id']author=items['author']score=items['score']tag_name=items['tag_name']# 解析json數據html=json.loads(response.body)# 獲取詳細播放信息stat=html['data']view=stat['view']danmaku =stat['danmaku']reply =stat['reply']favorite =stat['favorite']coin =stat['coin']share =stat['share']like =stat['like']# 把所有爬取的信息傳遞給Itemitem=BlblItem(rank_tab=rank_tab,rank_num = rank_num ,title = title ,id = id ,author = author ,score = score ,view = view ,danmaku = danmaku ,reply = reply ,favorite = favorite ,coin = coin ,share = share ,like = like ,tag_name = tag_name)yield item

    6.5 編寫Items.py

    將爬取到的數據名稱按照Scrapy的模板填寫好即可

    目標:

    • 收集爬取到數據

    import scrapyclass BlblItem(scrapy.Item): rank_tab=scrapy.Field() rank_num =scrapy.Field() id=scrapy.Field() title =scrapy.Field() author =scrapy.Field() score =scrapy.Field() view=scrapy.Field() danmaku=scrapy.Field() reply=scrapy.Field() favorite=scrapy.Field() coin=scrapy.Field() share=scrapy.Field() like=scrapy.Field() tag_name=scrapy.Field()?

    6.6 編寫pipeline.py

    運用scrapy原生的CsvItemExporter能夠讓我們從編寫表頭以及寫writerow語句中解放出來,比傳統寫入csv的方法更簡便。

    目標:

    • 利用CsvItemExporter把數據寫入csv文件

    from scrapy.exporters import CsvItemExporter class BlblPipeline(object): def __init__(self): # a為追加寫入模式,這里要用二進制的方式打開 self.fp=open('bilibili.csv','ab') #include_headers_line默認為True # 能夠幫我們自動寫入表頭,并且在追加寫入數據的時候不會造成表頭重復 self.exportre=CsvItemExporter( self.fp, include_headers_line=True, encoding='utf-8-sig' ) def open_spider(self,spider): pass# 向csv文件中寫入數據 def process_item(self,item,spider): self.exportre.export_item(item) return itemdef close_spider(self,spider): self.fp.close()

    最后打開bilibili.csv,可以看到數據都完整爬取下來了!

    七、本篇小結

    最后回顧下本次的重點內容:

    • 對ajax異步加載的網頁進行抓包,通過抓取Request URL訪問異步加載數據

    • 使用Scrapy框架進行數據采集

    • 利用scrapy.Request向api發送請求并通過meta傳遞已獲取的排行頁數據

    • 利用Scrapy內置的CsvItemExporter將數據存儲到csv中

    下周二將推出本篇文章的下部分:數據分析實戰環節,敬請期待吧~

    源碼地址(或閱讀原文):https://github.com/heoijin/Bilibili-Rnak

    鄭重聲明:本項目及所有相關文章,僅用于經驗技術交流,禁止將相關技術應用到不正當途徑,因為濫用技術產生的風險與本人無關


    熱門文章

    直戳淚點!數據從業者權威嘲諷指南!

    數據分析師做成了提數工程師,該如何破局?

    全棧型VS專精型,團隊到底需要什么樣的人?

    數據驅動業務,比技術更重要的是思維的轉變

    最近面了十多個數據分析師,聊一聊我發現的一些問題

    總結

    以上是生活随笔為你收集整理的二次元属性被稀释,B站还剩什么?| 数据获取的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲六月丁香色婷婷综合久久 | 波多野结衣免费看 | 欧美你懂的| 日韩深夜在线 | 国产精品极品白嫩 | 亚洲一区二区中文字幕 | 精品人伦一区二区三区蜜桃免费 | 日本不卡高字幕在线2019 | 狠狠躁日日躁 | 午夜整容室 | 337p粉嫩大胆噜噜噜噜69影视 | 欧美日韩视频免费 | 婷婷激情网站 | 视频精品一区二区 | 日韩在线高清 | 国产人妻精品久久久久野外 | 国产精品极品 | 在线色综合| 狠狠的日 | 亚洲最大色网站 | 国产精品免费久久久 | av在线大全 | 国产精品免费视频观看 | 岛国av中文字幕 | 免费在线一区二区三区 | 男女考妣视频 | 黄色成人免费观看 | 国产精品区一区二区三 | 国产欧美一区二区三区在线 | 国产伦精品一区二区三区照片 | 新红楼梦2005锦江版高清在线观看 | 性少妇videosexfreexxx片 | 深夜精品视频 | 午夜av网址| 国产精品久久久久久人 | 干操网| 人人妻人人澡人人爽欧美一区双 | 粉嫩av懂色av蜜臀av分享 | 欧美在线一区二区 | 成人av高清在线 | 欧美极品少妇xxxxⅹ免费视频 | 久久爱一区二区 | 色窝在线 | 美国一级片网站 | 日日摸日日碰夜夜爽无码 | 色97色| 精品婷婷色一区二区三区蜜桃 | 一级片免费| 日本黄色成人 | 欧美午夜免费 | 天天操国产 | 超薄肉色丝袜一区二区 | 天天噜夜夜噜 | 欧美一区三区三区高中清蜜桃 | 可以在线观看的黄色 | 一道本不卡视频 | 日韩精品欧美 | 亚洲精品1234 | 极品av在线 | 欧美综合亚洲图片综合区 | 成人av免费播放 | a视频 | 天天插插 | www.555国产精品免费 | 自拍偷拍国产 | 欧美国产日韩一区二区 | 免费看欧美黄色片 | 国产馆av| 天天操天天操天天操天天操 | 亚洲网站免费看 | 亚洲黄v | 欧美精品久久久久性色 | www.日日日| 久久久7777| 91自啪| 成人羞羞在线观看网站 | 在线观看va | 调教一区二区 | 激情综合网五月 | 华人在线视频 | 亚洲毛片网 | 北条麻纪在线观看aⅴ | 欧洲人妻丰满av无码久久不卡 | 欧美另类videosbestsex日本 | 亚洲另类视频 | 日韩在线电影一区 | 91精品国产综合久久国产大片 | 国产一区二区三区在线免费观看 | 银娇在线观看 | 激情亚洲| 一本色道久久88综合日韩精品 | 欧美精品一区三区 | 蜜桃91丨九色丨蝌蚪91桃色 | 日本久久久久久 | 国产精品伦一区二区 | 亚洲精品aaa | 麻豆一区二区三区四区 | 国产老女人乱淫免费 | 十大污视频 |