作為數(shù)據(jù)科學(xué)家,收集數(shù)據(jù)的最有效方法之一是借助Web抓取。網(wǎng)頁(yè)抓取是一種將數(shù)據(jù)從Web捕獲到我們本地計(jì)算機(jī)中的技術(shù),以對(duì)它執(zhí)行某些數(shù)據(jù)分析或數(shù)據(jù)可視化操作,以從該數(shù)據(jù)中獲得有用的見(jiàn)解,也稱(chēng)為Web收集或數(shù)據(jù)提取。在本文中,將借助于兩個(gè)名為Requests和bs4(Beautiful Soup)的金色庫(kù)來(lái)抓取網(wǎng)絡(luò)上的信息。選擇這兩個(gè)庫(kù)的原因是它們比其他可用庫(kù)更強(qiáng)大和靈活。
先決條件
HTML標(biāo)簽和CSS選擇器的基礎(chǔ)知識(shí)是必需的。
從Web捕獲數(shù)據(jù)始于向Web發(fā)送請(qǐng)求要從哪個(gè)網(wǎng)站捕獲數(shù)據(jù)。該任務(wù)是在“請(qǐng)求”模塊的幫助下完成的。
要向網(wǎng)站提出請(qǐng)求,首先我們需要在python中導(dǎo)入請(qǐng)求模塊。它不是python中的預(yù)內(nèi)置模塊。我們需要在pip的幫助下安裝該軟件包。
>>>導(dǎo)入請(qǐng)求#模塊成功導(dǎo)入。
#提出要求
>>>響應(yīng)= request.get
#響應(yīng)變量將包含該請(qǐng)求對(duì)象的響應(yīng)。
要檢查請(qǐng)求對(duì)象的狀態(tài),我們需要在請(qǐng)求模塊中使用status_code屬性。
>>> response.status_code
如果狀態(tài)代碼值的結(jié)果為200,則您從網(wǎng)站獲得了成功的響應(yīng)。否則,您將從網(wǎng)頁(yè)中得到不好的響應(yīng)。問(wèn)題可能出在Web URL或服務(wù)器問(wèn)題上。
請(qǐng)求類(lèi)型
借助請(qǐng)求模塊,主要有六種類(lèi)型的請(qǐng)求是可能的。
1. get()請(qǐng)求
2. post()請(qǐng)求
3. put()請(qǐng)求
4. 刪除請(qǐng)求
5. head()請(qǐng)求
6. options()請(qǐng)求
向網(wǎng)頁(yè)發(fā)出任何形式的請(qǐng)求的語(yǔ)法是-
requests.methodName('url')
但是,最流行的向網(wǎng)頁(yè)發(fā)出請(qǐng)求的方法僅使用get()和post()方法。
要發(fā)送任何類(lèi)型的敏感數(shù)據(jù)以及諸如登錄憑據(jù)等URL之類(lèi)的URL,則post()請(qǐng)求是更可取的,因?yàn)镠TTP get()請(qǐng)求不會(huì)為已發(fā)送到網(wǎng)頁(yè)的請(qǐng)求提供任何安全性。
R = requests.post
回應(yīng)結(jié)果
我們的請(qǐng)求的響應(yīng)內(nèi)容是通過(guò)text屬性獲得的。
>>> response.text
由此可以得出結(jié)論,我們將網(wǎng)頁(yè)內(nèi)容下載到了本地計(jì)算機(jī)上。為了使內(nèi)容更加靈活和有用,我們需要借助Beautiful Soup庫(kù)。該庫(kù)可幫助我們從可用數(shù)據(jù)中獲得有用的見(jiàn)解。
#導(dǎo)入漂亮的湯庫(kù)
>>> import bs4
為了使原始HTML數(shù)據(jù)更加美觀,我們需要在某些解析器的幫助下解析內(nèi)容。經(jīng)常使用的解析器是-
1. xml文件
2. HTML5lib
3. XML解析器
4. HTML.parser
但是最靈活和最受歡迎的是lxml解析器。它可以非常快速有效地解析數(shù)據(jù)。
>>> soup_obj = bs4.BeautifulSoup(response.text,'lxml')
#soup_obj將使我們獲取所需的結(jié)果
#為了使我們之前的數(shù)據(jù)更容易理解,我們將在湯匙上使用prettify()
>>> soup_obj.prettify()
因此,最后,我們又向前邁了一步。數(shù)據(jù)提取從此處開(kāi)始-
要提取網(wǎng)頁(yè)的名稱(chēng),我們需要使用選擇器以及適當(dāng)?shù)腍TML標(biāo)簽來(lái)獲得結(jié)果
>>> soup_obj.select('title')[0] .getText()
要從該網(wǎng)頁(yè)提取所有鏈接,您需要找到該頁(yè)面中的所有錨標(biāo)記并將結(jié)果存儲(chǔ)到變量中。借助for循環(huán)迭代,它完全可以打印結(jié)果
>>> links = soup_obj.find_all('a')
#find_all()將有助于獲取所選標(biāo)簽的所有詳細(xì)信息。
>>>對(duì)于鏈接中的鏈接:
... print(link.get('href'))
...
#get()用于從標(biāo)記中提取特定內(nèi)容
這是一個(gè)從網(wǎng)頁(yè)獲取鏈接的簡(jiǎn)單示例。如果您想從網(wǎng)頁(yè)中提取其他數(shù)據(jù),請(qǐng)選擇與您的內(nèi)容相關(guān)的適當(dāng)標(biāo)簽,并在湯對(duì)象的幫助下獲取結(jié)果。最初,這感覺(jué)很困難,但是當(dāng)您在使用它時(shí),絕對(duì)可以在一分鐘內(nèi)爬出任何類(lèi)型的網(wǎng)站。
免責(zé)聲明
未經(jīng)管理員許可,請(qǐng)勿執(zhí)行網(wǎng)站網(wǎng)頁(yè)抓取。可能導(dǎo)致非法活動(dòng)。公司中的數(shù)據(jù)科學(xué)家通常會(huì)在自己的網(wǎng)頁(yè)和業(yè)務(wù)上進(jìn)行網(wǎng)絡(luò)抓取,而他們并未在其他公司網(wǎng)站上執(zhí)行任何非法操作。所以要小心如果有任何原因造成您損壞,如果發(fā)生違法活動(dòng)概不負(fù)責(zé)。
我在本教程中使用的網(wǎng)頁(yè)可以隨意刮取,因此完全沒(méi)有問(wèn)題。使用此類(lèi)網(wǎng)站來(lái)學(xué)習(xí)或提高您的技能。
通過(guò)上述介紹,如何使用Python進(jìn)行Web爬網(wǎng)相信大家已經(jīng)清楚了吧,想了解更多關(guān)于Python的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。