爬蟲基本功就這?早知道幹爬蟲了

2022-07-04 12:57:12 字數 3354 閱讀 5225

文章分三個個部分

兩個爬蟲庫requests和selenium如何使用

html解析庫beautifulsoup如何使用

動態載入的網頁資料用requests怎麼抓

假設windows下安裝好了python和pip。

下面用pip安裝爬蟲庫requests

如果提示pip版本低,不建議公升級,公升級後可能python本身版本低,導致pip指令報錯。

進入python命令列驗證requests庫是否能夠使用

看到import requests和requests.get函式都沒有報錯,說明安裝成功可以開發我們的第乙個爬蟲程式了!

將**檔案命名為test.py,用idel開啟。

最簡單的爬蟲就這麼幾行!

引入requests庫,

用get函式訪問對應位址,

判定是否抓取成功的狀態,r.text列印出抓取的資料。

selenium例子中爬取資料後使用beautifulsoup庫對html進行解析,提取了感興趣的部分。如果不解析,抓取的就是一整個html資料,有時也是xml資料,xml資料對標籤的解析和html是一樣的道理,兩者都是來區分資料的。這種格式的資料結構乙個頁面乙個樣子,解析起來很麻煩。beautifulsoup提供了強大的解析功能,可以幫助我們省去不少麻煩。

使用之前安裝beautifulsoup和lxml。

首先**要引入這個庫(參考上面selenium庫**)

from bs4 import beautifulsoup
然後,抓取

r = request.get(url)      

r.encoding='utf8'

html=r.read() #urlopen獲取的內容都在html中

mysoup=beautifulsoup(html, 'lxml') #html的資訊都在mysoup中了

假設我們對html中的如下部分資料感興趣

20200214111

張三

20200214417

李斯

首先要找到tag標籤為的資料,而這類資料不止一條,我們以兩條為例。那麼需要用到beautifulsoup的find_all函式,返回的結果應該是兩個資料。當處理每乙個資料時,裡面的等標籤都是唯一的,這時使用find函式。

mysoup=beautifulsoup(html, 'lxml')    

data_list=mysoup.find_all('data')

for data in data_list:#list應該有兩個元素

day = data.find('day').get_text() #get_text是獲取字串,可以用.string代替

id = data.find('id').get_text()

rank = data.find('rank').get_text()

name = data.find('name').get_text()

#print name 可以print測試解析結果

這是beautifulsoup最簡單的用法,find和find_all不僅可以按照標籤的名字定位元素,還可以按照class,style等各種屬性,以及文字內容text作為條件來查詢你感興趣的內容,非常強大。

還是以新冠肺炎的疫情統計網頁為例。本文開頭requests例子最後列印的結果裡面只有標題、欄目名稱之類的,沒有累計確診、累計死亡等等的資料。因為這個頁面的資料是動態載入上去的,不是靜態的html頁面。需要按照我上面寫的步驟來獲取資料,關鍵是獲得url和對應引數formdata。下面以火狐瀏覽器講講如何獲得這兩個資料。

肺炎頁面右鍵,出現的選單選擇檢查元素。

點選上圖紅色箭頭網路選項,然後重新整理頁面。如下,

這裡會出現很多網路傳輸記錄,觀察最右側紅框「大小」那列,這列表示這個http請求傳輸的資料量大小,動態載入的資料一般資料量會比其它頁面元素的傳輸大,119kb相比其它按位元組計算的算是很大的資料了,當然網頁的裝飾有的也很大,這個需要按照檔案型別那列來甄別。

然後點選網域名稱列對應那行,如下

可以在訊息頭中看見請求**,url的尾部問號後面已經把引數寫上了。

途中url解釋,name是disease_h5,callback是頁面**函式,我們不需要有**動作,所以設定為空,_對應的是時間戳(python很容易獲得時間戳的),因為查詢肺炎患者數量和時間是緊密相關的。

我們如果使用帶引數的url,那麼就用

url='**/g2/getonsinfo?name=disease_h5&callback=&_=%d'%int(stamp*1000)     

requests.get(url)

點選引數可以看見url對應的引數

如果使用引數和url分離的形式那麼

那麼就這樣

url="**/g2/getonsinfo"  

formdata =

requests.get(url, formdata)

找url和引數需要耐心分析,才能正確甄別url和引數的含義,進行正確的程式設計實現。引數是否可以空,是否可以硬編碼寫死,是否有特殊要求,比較依賴經驗。

學完本文,閱讀爬蟲**就很容易了,所有**都是為了成功get到url做的準備以及抓到資料之後的解析而已。

有的url很簡單,返回乙個.dat檔案,裡面直接就是json格式的資料。有的需要設定大量引數,才能獲得,而且獲得的是html格式的,需要解析才能提取資料。

爬到的資料可以存入資料庫,寫入檔案,也可以現抓現展示不儲存。

C C 程式設計基本功

c c 程式設計基本功 c 其內容精深博大,任何一塊都信手拈來者不多,究其精者更不多,不論何其原因,最重要一點就是其基本功之不紮實,對基礎性東西不加以精深研究。我也是一樣,經過幾輪經典的面試,讓我痛改以前的不紮實的作風,以此來磨礪自己。一 記憶體管理篇 乙個由c c 編譯的程式占用的記憶體分為以下幾...

基本功練習 2 26

型別轉換 先看下面一段程式,這段程式摘自 c專家程式設計 如果是有這樣一段程式的話,你永遠無法知道x的值到底是多少,因為這句賦值語句x array d 1 根本不會執行。原因在哪?經過除錯發現程式執行到if語句進行判斷完之後,直接跳過下面一條語句的執行。下面來分析一下原因,因為sizeof求算型別大...

機器學習基本功

1 回歸模型 重點關注xgboost 注 introduction to statistical learning的2 7章 2 分類模型 統計學習方法 3 神經網路 a 普通的ann b 處理影象的cnn c 處理文字和語音的rnn lstm 4 資料壓縮 視覺化 流行學習 manifold le...