爬蟲基本功就這纲仍?早知道干爬蟲了

文章分三個個部分

  1. 兩個爬蟲庫requests和selenium如何使用
  2. html解析庫BeautifulSoup如何使用
  3. 動態(tài)加載的網(wǎng)頁數(shù)據(jù)用requests怎么抓

兩個爬蟲庫

requests

假設windows下安裝好了python和pip等孵。
下面用pip安裝爬蟲庫requests

image

如果提示pip版本低辈赋,不建議升級袋哼,升級后可能python本身版本低炫乓,導致pip指令報錯刚夺。

進入Python命令行驗證requests庫是否能夠使用

image

看到import requests和requests.get函數(shù)都沒有報錯,說明安裝成功可以開發(fā)我們的第一個爬蟲程序了末捣!
將代碼文件命名為test.py侠姑,用IDEL打開。
image

最簡單的爬蟲就這么幾行箩做!

  1. 引入requests庫莽红,
  2. 用get函數(shù)訪問對應地址,
  3. 判定是否抓取成功的狀態(tài)邦邦,r.text打印出抓取的數(shù)據(jù)安吁。

然后菜單欄點擊Run->Run Module 會彈出Python的命令行窗口醉蚁,并且返回結果。我們訪問的是騰訊發(fā)布新冠肺炎疫情的地址

image

如果沒有IDEL柳畔,直接cmd命令行運行按照下面執(zhí)行
image

selenium

selenium庫會啟動瀏覽器馍管,用瀏覽器訪問地址獲取數(shù)據(jù)。下面我們演示用selenium抓取網(wǎng)頁薪韩,并解析爬取的html數(shù)據(jù)中的信息确沸。先安裝selenium

image

接下來安裝解析html需要的bs4和lxml。
安裝bs4
image

安裝lxml
image

要確保windows環(huán)境變量path的目錄下有chromedriver
image

我d盤的instantclient_12_2已經(jīng)加到path里了俘陷。所以chromedriver解壓到這個目錄罗捎。chromedriver不同的版本對應Chrome瀏覽器的不同版本,開始我下載的chromedriver對應Chrome瀏覽器的版本是71-75(圖中最下面的)拉盾,我的瀏覽器版本是80所以重新下載了一個才好使桨菜。
代碼如下
image

Python執(zhí)行過程中會彈出
image

瀏覽器也自動啟動,訪問目標地址
image

IDEL打印結果如下
image

HTML解析庫BeautifulSoup

selenium例子中爬取數(shù)據(jù)后使用BeautifulSoup庫對html進行解析捉偏,提取了感興趣的部分倒得。如果不解析,抓取的就是一整個html數(shù)據(jù)夭禽,有時也是xml數(shù)據(jù)霞掺,xml數(shù)據(jù)對標簽的解析和html是一樣的道理,兩者都是<tag>來區(qū)分數(shù)據(jù)的讹躯。這種格式的數(shù)據(jù)結構一個頁面一個樣子菩彬,解析起來很麻煩。BeautifulSoup提供了強大的解析功能潮梯,可以幫助我們省去不少麻煩骗灶。
使用之前安裝BeautifulSoup和lxml。
首先代碼要引入這個庫(參考上面selenium庫代碼)

from bs4 import BeautifulSoup  

然后秉馏,抓取

r = request.get(url)      
r.encoding='utf8'  
html=r.read() #urlopen獲取的內(nèi)容都在html中  
mysoup=BeautifulSoup(html, 'lxml') #html的信息都在mysoup中了   

假設我們對html中的如下部分數(shù)據(jù)感興趣

<data>  
        <day>20200214</day>  
        <id>1</id>  
        <rank>11</rank>  
        <name>張三</name>  
    </data>  
    <data>  
        <day>20200214</day>  
        <id>4</id>  
        <rank>17</rank>  
        <name>李斯</name>  
    </data>  

首先要找到tag標簽為<data>的數(shù)據(jù)耙旦,而這類數(shù)據(jù)不止一條,我們以兩條為例萝究。那么需要用到beautifulsoup的find_all函數(shù)免都,返回的結果應該是兩個<data>數(shù)據(jù)。當處理每一個<data>數(shù)據(jù)時糊肤,里面的<id><name>等標簽都是唯一的,這時使用find函數(shù)氓鄙。

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等各種屬性舷暮,以及文本內(nèi)容text作為條件來查找你感興趣的內(nèi)容,非常強大噩茄。

requests庫如何抓取網(wǎng)頁的動態(tài)加載數(shù)據(jù)

還是以新冠肺炎的疫情統(tǒng)計網(wǎng)頁為例下面。本文開頭requests例子最后打印的結果里面只有標題、欄目名稱之類的绩聘,沒有累計確診沥割、累計死亡等等的數(shù)據(jù)。因為這個頁面的數(shù)據(jù)是動態(tài)加載上去的凿菩,不是靜態(tài)的html頁面机杜。需要按照我上面寫的步驟來獲取數(shù)據(jù),關鍵是獲得URL和對應參數(shù)formdata衅谷。下面以火狐瀏覽器講講如何獲得這兩個數(shù)據(jù)椒拗。
肺炎頁面右鍵,出現(xiàn)的菜單選擇檢查元素获黔。

image

點擊上圖紅色箭頭網(wǎng)絡選項,然后刷新頁面。如下彩倚,
image

這里會出現(xiàn)很多網(wǎng)絡傳輸記錄摔蓝,觀察最右側紅框“大小”那列,這列表示這個http請求傳輸?shù)臄?shù)據(jù)量大小预茄,動態(tài)加載的數(shù)據(jù)一般數(shù)據(jù)量會比其它頁面元素的傳輸大兴溜,119kb相比其它按字節(jié)計算的算是很大的數(shù)據(jù)了,當然網(wǎng)頁的裝飾圖片有的也很大耻陕,這個需要按照文件類型那列來甄別拙徽。

url帶參數(shù)

然后點擊域名列對應那行,如下

image

可以在消息頭中看見請求網(wǎng)址诗宣,url的尾部問號后面已經(jīng)把參數(shù)寫上了膘怕。
途中url解釋,name是disease_h5召庞,callback是頁面回調(diào)函數(shù)岛心,我們不需要有回調(diào)動作,所以設置為空篮灼,_對應的是時間戳(Python很容易獲得時間戳的)忘古,因為查詢肺炎患者數(shù)量和時間是緊密相關的。
我們?nèi)绻褂脦?shù)的URL诅诱,那么就用

url='網(wǎng)址/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(stamp*1000)     
requests.get(url)   

url和參數(shù)分離

點擊參數(shù)可以看見url對應的參數(shù)

image

如果使用參數(shù)和url分離的形式那么
那么就這樣

url="網(wǎng)址/g2/getOnsInfo"  

formdata = {'name': 'disease_h5',   
'callback': '',   
'_': 當前時間戳    
}    

requests.get(url, formdata)  

找url和參數(shù)需要耐心分析髓堪,才能正確甄別url和參數(shù)的含義,進行正確的編程實現(xiàn)。參數(shù)是否可以空干旁,是否可以硬編碼寫死驶沼,是否有特殊要求,比較依賴經(jīng)驗争群。

總結

學完本文回怜,閱讀爬蟲代碼就很容易了,所有代碼都是為了成功get到url做的準備以及抓到數(shù)據(jù)之后的解析而已换薄。
有的url很簡單玉雾,返回一個.dat文件,里面直接就是json格式的數(shù)據(jù)专控。有的需要設置大量參數(shù)抹凳,才能獲得,而且獲得的是html格式的伦腐,需要解析才能提取數(shù)據(jù)赢底。
爬到的數(shù)據(jù)可以存入數(shù)據(jù)庫,寫入文件柏蘑,也可以現(xiàn)抓現(xiàn)展示不存儲幸冻。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咳焚,隨后出現(xiàn)的幾起案子洽损,更是在濱河造成了極大的恐慌,老刑警劉巖革半,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碑定,死亡現(xiàn)場離奇詭異,居然都是意外死亡又官,警方通過查閱死者的電腦和手機延刘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來六敬,“玉大人碘赖,你說我怎么就攤上這事⊥夤梗” “怎么了普泡?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長审编。 經(jīng)常有香客問我撼班,道長,這世上最難降的妖魔是什么垒酬? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任砰嘁,我火速辦了婚禮眯亦,結果婚禮上,老公的妹妹穿的比我還像新娘般码。我一直安慰自己,他們只是感情好乱顾,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布板祝。 她就那樣靜靜地躺著,像睡著了一般走净。 火紅的嫁衣襯著肌膚如雪券时。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天伏伯,我揣著相機與錄音橘洞,去河邊找鬼。 笑死说搅,一個胖子當著我的面吹牛炸枣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弄唧,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼适肠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了候引?” 一聲冷哼從身側響起侯养,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澄干,沒想到半個月后逛揩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡麸俘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年辩稽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾掰。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搂誉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出静檬,到底是詐尸還是另有隱情炭懊,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布拂檩,位于F島的核電站侮腹,受9級特大地震影響,放射性物質發(fā)生泄漏稻励。R本人自食惡果不足惜父阻,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一愈涩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧加矛,春花似錦履婉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苛茂,卻和暖如春已烤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妓羊。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工胯究, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躁绸。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓裕循,卻偏偏與公主長得像,于是被迫代替她去往敵國和親净刮。 傳聞我的和親對象是個殘疾皇子费韭,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容