五步帶你探究爬蟲爬取視頻彈幕背後的真相,附爬蟲實現源碼 前言 開發環境 原理講解 實現流程 代碼實現

前言

好久沒更新,不知道各位粉絲有沒有等着急,沒辦法,這不是要到年底了啊,又要開始準備一年一度的工作彙報了,咱到現在也不知道這玩意到底有什麼用,反正就是每一家公司都需要這麼個玩意,其中,最讓我頭疼的就是這個未來展望的環節,我要是能預測未來我不早就去買彩票發大財,還在這給你寫什麼規劃。但是誰讓你是老大呢,哎,所以,沒辦法,就是從網上各種找資料或者一些數據,寫未來的規劃,正好的,反正也是年底了,沒啥事幹,閒着也是閒着,就接了幾個兼職的單子,賺點錢回家給小輩發紅包啊!不知道大家有沒有遇到這樣的困境

再網上查找一些資料的時候,發現在網上對於python爬蟲的案例講解比較少,並且比較散,反正最近我從網上找資料,甚至是兼職的單子都是跟爬蟲相關,今天就給大家簡單介紹一下爬蟲的相關內容,大家沒啥事也可以自己練習着玩一下嘛

公衆號:Java架構師聯盟

開發環境

開發工具:pycharm

開發環境:python3.8.5

原理講解

其實說起來爬蟲,簡單點的理解,就是我們要去將我們在網頁上查看的內容中的某一部分保存到本地,爲什麼這麼說呢?

舉個例子,大家都知道,我們在瀏覽器上瀏覽某個網站信息的時候,其實他是去後臺請求相應的數據,然後,後臺服務器相應這個數據請求,將數據返回到我們的前端界面(也就是你能看到的業面),如果這麼說有點複雜的話,那結合一張圖我們來看一下

這個過程通俗點來說就是:

瀏覽器提交請求->下載網頁代碼->解析/渲染成頁面

而爬蟲要做的其實就很簡單了,也很好理解,既然你在瀏覽器中查看某些信息的時候,是執行的一個和服務器之間進行通信的過程,那你現在要求的不就是模擬瀏覽器的一個行爲,然後將數據存儲到本地嗎?

流程如下:

模擬瀏覽器發送請求->下載網頁代碼->只提取有用的數據->存放於數據庫或文件中

用一張圖解釋就是下面這樣的** **

實現流程

既然前面我們整理清楚了爬蟲的一個工作原理,接下來不就簡單了啊,我們就是看一下代碼實現流程,寫代碼是最沒有技術含量的

第一、獲取數據的請求地址

因爲現在是我們要模擬瀏覽器的一個行爲,那我們最起碼要知道數據的一個請求地址。也就是url,我今天提供給大家的源碼時爬取B站彈幕,那我就以此爲例進行講解

那url我們該怎麼查找,首先,前面的時候我說了,我們在前面說了,我們要先模擬一個網站發起一個request請求,那我們要去查看的應該就是一個request的url

注:什麼是request

使用http庫向目標站點發起請求,即發送一個Request
Request包含:請求頭、請求體等
​</pre>

我們按F12打開開發者模式,然後在頁面中點擊彈幕列表,在選擇要查看的彈幕日期之後,在下方控制檯中會出現一個history開頭的選項,點擊,我們會看到request url的選項

第二、模擬用戶請求

主要包括兩個方面,用戶模擬以及登陸模擬

用戶模擬

因爲我們現在是模擬瀏覽器向服務器發起請求,就好像有一個陌生人來敲你家的門一樣,這樣的情況,你會開門嗎?不會,那如果我們僞裝成親戚朋友的話,你就開門了把,在請求中,我們有一個用戶代理(user-agent)來表明我們的身份選項** **

注:

User Agent中文名爲用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。

登陸模擬

上面的問題解決了,同時也引出了下一個問題,我們在進行這個信息查看的時候,是通過一個已經登陸的賬號,當你在未登陸的情況下** **

你是無法查看這個歷史的彈幕數據的,那我們在模擬的時候如何模式登陸行爲的呢

這個時候,不得不提的就是瀏覽器的一個行爲,當我們登錄某個網站之後,再次訪問的時候,很多時候是不需要再次登錄的,那這是爲什麼呢?是因爲當你登錄之後,瀏覽器會在本地生成一個cookie的問題件,cookie與特定的 Web 文檔關聯在一起, 保存了該客戶機訪問這個Web 文檔時的信息, 當客戶機再次訪問這個 Web 文檔時這些信息可供該文檔使用。這樣一來也就完成了我們的直接訪問行爲

也就是說,只要我們獲取這個cookie,我們在訪問後臺服務器的時候,也是不需要什麼登陸操作的,一氣呵成

第三步:請求數據

經歷上面的步驟,我們已經成功的向服務器發起請求,當你執行前面幾步得操作後,你會得到這樣的一個結果

這說明,我們成功和服務器進行了鏈接

響應狀態
200:代表成功
301:代表跳轉
404:文件不存在
403:權限
502:服務器錯誤</pre>

接下來我們要通過我們傳入的user-agent以及cookie來確立我需要哪些數據,獲取url請求過來的數據

也就是這樣的一個結果

第四步,數據分析

到第三步,我們已經獲取完成了相應的數據信息,但是我們只需要其中的一部分,所以要進行解析,留下的是我們自己需要的數據

第五步,數據存儲

解析完成的數據,我們保存到本地,至此,數據爬取的工作完成

好了,一個數據爬蟲的工作到這裏就結束了,希望大家沒啥事的時候可以自己動手實際操作一下,下面是我實現的代碼,大家可以自己參考

代碼實現

爲了照顧剛接觸這個的朋友,所以這裏我寫的會相對的詳細一些,其中一些細小的知識點就不展開講解了,畢竟我還要寫苦逼的年終總結

# 爬取B站彈幕
​
# 什麼是模塊:模塊就是用一堆的代碼實現了一些功能的代碼的集合,通常一個或者多個函數寫在一個.py文件裏
import requests
​
url='https://api.bilibili.com/x/v2/dm/history?type=1&oid=260575715&date=2020-12-20'
​
# 如何獲取路徑下的信息
#  urllib(python自帶的)  request(第三方模塊)
​
# 字典:字典是python裏的一種數據類型,特點是元素的無序性,和鍵key的唯一性。字典的創建方法是{key:values}
​
getdata=requests.get(url)
print(getdata)
​
headers={
​
 #user-agent,就好像我們去一個人家串門,但是,如果主人不認識你,肯定不會給你開門,但是,如果你僞裝成一個他認識的人,就像易容一樣,那他是不是就給你開門了啊
 # 模擬瀏覽器的行爲
 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
 #cookie:我們在登錄的時候會進行用戶名和密碼的輸入,之後我們在登陸的時候就不需要再進行登陸了,那這個地方就是因爲,這個賬號和密碼信息緩存到一起
 # 你要自己實現的時候要換成自己的哦
​
 'cookie': "_uuid=326F06D1-FE8D-9191-42CE-DD309D14353C67633infoc; buvid3=33D869DB-6F2F-4BB0-B607-1B7B34F07CFD53925infoc; sid=4lmxv7lu; rpdid=|(u)Y|l|uJRk0J'ulmJY|kRR|; dy_spec_agreed=1; LIVE_BUVID=AUTO2815973097085458; blackside_state=1; CURRENT_FNVAL=80; bp_video_offset_26390853=467157764523510086; bp_t_offset_26390853=467157764523510086; fingerprint=073aaf7f9d22ae55cfafd954c7f31b26; buivd_fp=33D869DB-6F2F-4BB0-B607-1B7B34F07CFD53925infoc; buvid_fp_plain=BCE2280A-DF5C-4872-98E2-4002159A716F143082infoc; PVID=3; bfe_id=fdfaf33a01b88dd4692ca80f00c2de7f; buvid_fp=33D869DB-6F2F-4BB0-B607-1B7B34F07CFD53925infoc; DedeUserID=26390853; DedeUserID__ckMd5=8d24b1d50476c5e5; SESSDATA=c6386003%2C1624877887%2Ca501d*c1; bili_jct=704cf795ee7a134f74dd244b80c5107d"
}
​
resq = requests.get(url,headers=headers)
​
resq.encoding='utf-8'
​
print(resq.text)
​
​
#<d p="25.25400,1,25,16777215,1608370925,0,aded156e,42587259146338307">別啊,我的快樂啊</d>
​
​
# 使用python進行編程,一定要注意導入
import re
​
data=re.findall(r'<d p=".*?">(.*?)</d>',resq.text)
# 緩存 cookie
print(data)
​
# as 起別名
import pandas as pd
# 改變格式之後的數據
test=pd.DataFrame(data=data)
test.to_csv('e:/testcsv.csv',encoding='utf-8')</pre>

剛剛接觸python的小夥伴,可以每獲取一步數據就打印一次,這樣可能對於你的理解有一定的幫助

分享自己的碼雲地址,除了資料之外,還有我分享的學習代碼,可以自行下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章