前言
好久沒更新,不知道各位粉絲有沒有等著急盅藻,沒辦法购桑,這不是要到年底了啊畅铭,又要開始準(zhǔn)備一年一度的工作匯報了,咱到現(xiàn)在也不知道這玩意到底有什么用勃蜘,反正就是每一家公司都需要這么個玩意硕噩,其中,最讓我頭疼的就是這個未來展望的環(huán)節(jié)缭贡,我要是能預(yù)測未來我不早就去買彩票發(fā)大財炉擅,還在這給你寫什么規(guī)劃。但是誰讓你是老大呢阳惹,哎谍失,所以,沒辦法莹汤,就是從網(wǎng)上各種找資料或者一些數(shù)據(jù)快鱼,寫未來的規(guī)劃,正好的体啰,反正也是年底了攒巍,沒啥事干,閑著也是閑著荒勇,就接了幾個兼職的單子,賺點錢回家給小輩發(fā)紅包拔偶帷沽翔!不知道大家有沒有遇到這樣的困境
再網(wǎng)上查找一些資料的時候,發(fā)現(xiàn)在網(wǎng)上對于python爬蟲的案例講解比較少窿凤,并且比較散仅偎,反正最近我從網(wǎng)上找資料,甚至是兼職的單子都是跟爬蟲相關(guān)雳殊,今天就給大家簡單介紹一下爬蟲的相關(guān)內(nèi)容橘沥,大家沒啥事也可以自己練習(xí)著玩一下嘛
公眾號:Java架構(gòu)師聯(lián)盟
開發(fā)環(huán)境
開發(fā)工具:pycharm
開發(fā)環(huán)境:python3.8.5
原理講解
其實說起來爬蟲,簡單點的理解夯秃,就是我們要去將我們在網(wǎng)頁上查看的內(nèi)容中的某一部分保存到本地座咆,為什么這么說呢?
舉個例子仓洼,大家都知道介陶,我們在瀏覽器上瀏覽某個網(wǎng)站信息的時候,其實他是去后臺請求相應(yīng)的數(shù)據(jù)色建,然后哺呜,后臺服務(wù)器相應(yīng)這個數(shù)據(jù)請求,將數(shù)據(jù)返回到我們的前端界面(也就是你能看到的業(yè)面)箕戳,如果這么說有點復(fù)雜的話某残,那結(jié)合一張圖我們來看一下
這個過程通俗點來說就是:
瀏覽器提交請求->下載網(wǎng)頁代碼->解析/渲染成頁面
而爬蟲要做的其實就很簡單了国撵,也很好理解,既然你在瀏覽器中查看某些信息的時候玻墅,是執(zhí)行的一個和服務(wù)器之間進(jìn)行通信的過程卸留,那你現(xiàn)在要求的不就是模擬瀏覽器的一個行為路翻,然后將數(shù)據(jù)存儲到本地嗎桑腮?
流程如下:
模擬瀏覽器發(fā)送請求->下載網(wǎng)頁代碼->只提取有用的數(shù)據(jù)->存放于數(shù)據(jù)庫或文件中
用一張圖解釋就是下面這樣的** **
實現(xiàn)流程
既然前面我們整理清楚了爬蟲的一個工作原理,接下來不就簡單了啊厦取,我們就是看一下代碼實現(xiàn)流程赏酥,寫代碼是最沒有技術(shù)含量的
第一喳整、獲取數(shù)據(jù)的請求地址
因為現(xiàn)在是我們要模擬瀏覽器的一個行為,那我們最起碼要知道數(shù)據(jù)的一個請求地址裸扶。也就是url框都,我今天提供給大家的源碼時爬取B站彈幕,那我就以此為例進(jìn)行講解
那url我們該怎么查找呵晨,首先魏保,前面的時候我說了,我們在前面說了摸屠,我們要先模擬一個網(wǎng)站發(fā)起一個request請求谓罗,那我們要去查看的應(yīng)該就是一個request的url
注:什么是request
使用http庫向目標(biāo)站點發(fā)起請求,即發(fā)送一個Request
Request包含:請求頭季二、請求體等
?</pre>
我們按F12打開開發(fā)者模式檩咱,然后在頁面中點擊彈幕列表,在選擇要查看的彈幕日期之后胯舷,在下方控制臺中會出現(xiàn)一個history開頭的選項刻蚯,點擊,我們會看到request url的選項
第二桑嘶、模擬用戶請求
主要包括兩個方面炊汹,用戶模擬以及登陸模擬
用戶模擬
因為我們現(xiàn)在是模擬瀏覽器向服務(wù)器發(fā)起請求,就好像有一個陌生人來敲你家的門一樣逃顶,這樣的情況讨便,你會開門嗎?不會口蝠,那如果我們偽裝成親戚朋友的話器钟,你就開門了把,在請求中妙蔗,我們有一個用戶代理(user-agent)來表明我們的身份選項** **
注:
User Agent中文名為用戶代理傲霸,簡稱 UA,它是一個特殊字符串頭,使得服務(wù)器能夠識別客戶使用的操作系統(tǒng)及版本昙啄、CPU 類型穆役、瀏覽器及版本、瀏覽器渲染引擎梳凛、瀏覽器語言耿币、瀏覽器插件等。
登陸模擬
上面的問題解決了韧拒,同時也引出了下一個問題淹接,我們在進(jìn)行這個信息查看的時候,是通過一個已經(jīng)登陸的賬號叛溢,當(dāng)你在未登陸的情況下** **
你是無法查看這個歷史的彈幕數(shù)據(jù)的塑悼,那我們在模擬的時候如何模式登陸行為的呢
這個時候,不得不提的就是瀏覽器的一個行為楷掉,當(dāng)我們登錄某個網(wǎng)站之后厢蒜,再次訪問的時候,很多時候是不需要再次登錄的烹植,那這是為什么呢斑鸦?是因為當(dāng)你登錄之后,瀏覽器會在本地生成一個cookie的問題件草雕,cookie與特定的 Web 文檔關(guān)聯(lián)在一起, 保存了該客戶機(jī)訪問這個Web 文檔時的信息, 當(dāng)客戶機(jī)再次訪問這個 Web 文檔時這些信息可供該文檔使用巷屿。這樣一來也就完成了我們的直接訪問行為
也就是說,只要我們獲取這個cookie促绵,我們在訪問后臺服務(wù)器的時候攒庵,也是不需要什么登陸操作的,一氣呵成
第三步:請求數(shù)據(jù)
經(jīng)歷上面的步驟败晴,我們已經(jīng)成功的向服務(wù)器發(fā)起請求,當(dāng)你執(zhí)行前面幾步得操作后栽渴,你會得到這樣的一個結(jié)果
這說明尖坤,我們成功和服務(wù)器進(jìn)行了鏈接
響應(yīng)狀態(tài)
200:代表成功
301:代表跳轉(zhuǎn)
404:文件不存在
403:權(quán)限
502:服務(wù)器錯誤</pre>
接下來我們要通過我們傳入的user-agent以及cookie來確立我需要哪些數(shù)據(jù),獲取url請求過來的數(shù)據(jù)
也就是這樣的一個結(jié)果
第四步闲擦,數(shù)據(jù)分析
到第三步慢味,我們已經(jīng)獲取完成了相應(yīng)的數(shù)據(jù)信息,但是我們只需要其中的一部分墅冷,所以要進(jìn)行解析纯路,留下的是我們自己需要的數(shù)據(jù)
第五步,數(shù)據(jù)存儲
解析完成的數(shù)據(jù)寞忿,我們保存到本地驰唬,至此,數(shù)據(jù)爬取的工作完成
好了,一個數(shù)據(jù)爬蟲的工作到這里就結(jié)束了叫编,希望大家沒啥事的時候可以自己動手實際操作一下辖佣,下面是我實現(xiàn)的代碼,大家可以自己參考
代碼實現(xiàn)
為了照顧剛接觸這個的朋友搓逾,所以這里我寫的會相對的詳細(xì)一些卷谈,其中一些細(xì)小的知識點就不展開講解了,畢竟我還要寫苦逼的年終總結(jié)
# 爬取B站彈幕
?
# 什么是模塊:模塊就是用一堆的代碼實現(xiàn)了一些功能的代碼的集合,通常一個或者多個函數(shù)寫在一個.py文件里
import requests
?
url='https://api.bilibili.com/x/v2/dm/history?type=1&oid=260575715&date=2020-12-20'
?
# 如何獲取路徑下的信息
# urllib(python自帶的) request(第三方模塊)
?
# 字典:字典是python里的一種數(shù)據(jù)類型霞篡,特點是元素的無序性世蔗,和鍵key的唯一性。字典的創(chuàng)建方法是{key:values}
?
getdata=requests.get(url)
print(getdata)
?
headers={
?
#user-agent朗兵,就好像我們?nèi)ヒ粋€人家串門污淋,但是,如果主人不認(rèn)識你矛市,肯定不會給你開門芙沥,但是,如果你偽裝成一個他認(rèn)識的人浊吏,就像易容一樣而昨,那他是不是就給你開門了啊
# 模擬瀏覽器的行為
'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:我們在登錄的時候會進(jìn)行用戶名和密碼的輸入,之后我們在登陸的時候就不需要再進(jìn)行登陸了找田,那這個地方就是因為歌憨,這個賬號和密碼信息緩存到一起
# 你要自己實現(xiàn)的時候要換成自己的哦
?
'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進(jìn)行編程墩衙,一定要注意導(dǎo)入
import re
?
data=re.findall(r'<d p=".*?">(.*?)</d>',resq.text)
# 緩存 cookie
print(data)
?
# as 起別名
import pandas as pd
# 改變格式之后的數(shù)據(jù)
test=pd.DataFrame(data=data)
test.to_csv('e:/testcsv.csv',encoding='utf-8')</pre>
剛剛接觸python的小伙伴务嫡,可以每獲取一步數(shù)據(jù)就打印一次,這樣可能對于你的理解有一定的幫助