小白如何入門(mén) Python 爬蟲(chóng)?
小白如何入門(mén) Python 爬蟲(chóng)?
本文針對(duì)初學(xué)者,我會(huì)用最簡(jiǎn)單的案例告訴你如何入門(mén)python爬蟲(chóng)!
想要入門(mén)Python 爬蟲(chóng)首先需要解決四個(gè)問(wèn)題
熟悉python編程
了解HTML
了解網(wǎng)絡(luò)爬蟲(chóng)的基本原理
學(xué)習(xí)使用python爬蟲(chóng)庫(kù)
一、你應(yīng)該知道什么是爬蟲(chóng)?
網(wǎng)絡(luò)爬蟲(chóng),其實(shí)叫作網(wǎng)絡(luò)數(shù)據(jù)采集更容易理解。
就是通過(guò)編程向網(wǎng)絡(luò)服務(wù)器請(qǐng)求數(shù)據(jù)(HTML表單),然后解析HTML,提取出自己想要的數(shù)據(jù)。
歸納為四大步:
根據(jù)url獲取HTML數(shù)據(jù)
解析HTML,獲取目標(biāo)信息
存儲(chǔ)數(shù)據(jù)
重復(fù)第一步
這會(huì)涉及到數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)服務(wù)器、HTTP協(xié)議、HTML、數(shù)據(jù)科學(xué)、網(wǎng)絡(luò)安全、圖像處理等非常多的內(nèi)容。但對(duì)于初學(xué)者而言,并不需要掌握這么多。
二、python要學(xué)習(xí)到什么程度
如果你不懂python,那么需要先學(xué)習(xí)python這門(mén)非常easy的語(yǔ)言(相對(duì)其它語(yǔ)言而言)。
編程語(yǔ)言基礎(chǔ)語(yǔ)法無(wú)非是數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、運(yùn)算符、邏輯結(jié)構(gòu)、函數(shù)、文件IO、錯(cuò)誤處理這些,學(xué)起來(lái)會(huì)顯枯燥但并不難。
剛開(kāi)始入門(mén)爬蟲(chóng),你甚至不需要去學(xué)習(xí)python的類、多線程、模塊之類的略難內(nèi)容。找一個(gè)面向初學(xué)者的教材或者網(wǎng)絡(luò)教程,花個(gè)十幾天功夫,就能對(duì)python基礎(chǔ)有個(gè)三四分的認(rèn)識(shí)了,這時(shí)候你可以玩玩爬蟲(chóng)嘍!
先說(shuō)下python入門(mén),實(shí)在是太容易了,因?yàn)檎Z(yǔ)法簡(jiǎn)單,思維與人類的思維很相近。入門(mén)的時(shí)候,別整天想著看很多資料,網(wǎng)上各種找,最后都留在了收藏夾吃灰。其實(shí)對(duì)于剛接觸編程的小白而言,最容易卡在安裝Python環(huán)境和實(shí)操代碼這一步。建議一開(kāi)始先試試一些學(xué)習(xí)網(wǎng)站的免費(fèi)課程,大概了解下Python的基礎(chǔ)知識(shí),打好扎實(shí)的基礎(chǔ)后再上手學(xué)爬蟲(chóng)。
當(dāng)然,前提是你必須在這十幾天里認(rèn)真敲代碼,反復(fù)咀嚼語(yǔ)法邏輯,比如列表、字典、字符串、if語(yǔ)句、for循環(huán)等最核心的東西都得捻熟于心、于手。
教材方面比較多選擇,我個(gè)人是比較推薦python官方文檔以及python簡(jiǎn)明教程,前者比較系統(tǒng)豐富、后者會(huì)更簡(jiǎn)練。
三、為什么要懂HTML
前面說(shuō)到過(guò)爬蟲(chóng)要爬取的數(shù)據(jù)藏在網(wǎng)頁(yè)里面的HTML里面的數(shù)據(jù),有點(diǎn)繞哈!
維基百科是這樣解釋HTML的
超文本標(biāo)記語(yǔ)言(英語(yǔ):HyperTextMarkupLanguage,簡(jiǎn)稱:HTML)是一種用于創(chuàng)建網(wǎng)頁(yè)的標(biāo)準(zhǔn)標(biāo)記語(yǔ)言。HTML是一種基礎(chǔ)技術(shù),常與CSS、JavaScript一起被眾多網(wǎng)站用于設(shè)計(jì)網(wǎng)頁(yè)、網(wǎng)頁(yè)應(yīng)用程序以及移動(dòng)應(yīng)用程序的用戶界面[3]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。HTML描述了一個(gè)網(wǎng)站的結(jié)構(gòu)語(yǔ)義隨著線索的呈現(xiàn),使之成為一種標(biāo)記語(yǔ)言而非編程語(yǔ)言。
總結(jié)一下,HTML是一種用于創(chuàng)建網(wǎng)頁(yè)的標(biāo)記語(yǔ)言,里面嵌入了文本、圖像等數(shù)據(jù),可以被瀏覽器讀取,并渲染成我們看到的網(wǎng)頁(yè)樣子。
所以我們才會(huì)從先爬取HTML,再 解析數(shù)據(jù),因?yàn)閿?shù)據(jù)藏在HTML里。
學(xué)習(xí)HTML并不難,它并不是編程語(yǔ)言,你只需要熟悉它的標(biāo)記規(guī)則,這里大致講一下。
HTML標(biāo)記包含標(biāo)簽(及其屬性)、基于字符的數(shù)據(jù)類型、字符引用和實(shí)體引用等幾個(gè)關(guān)鍵部分。
HTML標(biāo)簽是最常見(jiàn)的,通常成對(duì)出現(xiàn),比如<h1>
與</h1>
。
這些成對(duì)出現(xiàn)的標(biāo)簽中,第一個(gè)標(biāo)簽是開(kāi)始標(biāo)簽,第二個(gè)標(biāo)簽是結(jié)束標(biāo)簽。兩個(gè)標(biāo)簽之間為元素的內(nèi)容(文本、圖像等),有些標(biāo)簽沒(méi)有內(nèi)容,為空元素,如<img>
。
以下是一個(gè)經(jīng)典的Hello World程序的例子:
<!DOCTYPE html> <html> ?<head> ? ?<title>This is a title</title> ?</head> ?<body> ? ?<p>Hello world!</p> ?</body> </html>
HTML文檔由嵌套的HTML元素構(gòu)成。它們用HTML標(biāo)簽表示,包含于尖括號(hào)中,如<p>
[56]
在一般情況下,一個(gè)元素由一對(duì)標(biāo)簽表示:“開(kāi)始標(biāo)簽”<p>
與“結(jié)束標(biāo)簽”</p>
。元素如果含有文本內(nèi)容,就被放置在這些標(biāo)簽之間。
四、了解python網(wǎng)絡(luò)爬蟲(chóng)的基本原理
在編寫(xiě)python爬蟲(chóng)程序時(shí),只需要做以下兩件事:
發(fā)送GET請(qǐng)求,獲取HTML
解析HTML,獲取數(shù)據(jù)
這兩件事,python都有相應(yīng)的庫(kù)幫你去做,你只需要知道如何去用它們就可以了。
五、用python庫(kù)爬取百度首頁(yè)標(biāo)題和圖片
首先,發(fā)送HTML數(shù)據(jù)請(qǐng)求可以使用python內(nèi)置庫(kù)urllib,該庫(kù)有一個(gè)urlopen函數(shù),可以根據(jù)url獲取HTML文件,這里嘗試獲取百度首頁(yè)“https://www.baidu.com/”的HTML內(nèi)容
# 導(dǎo)入urllib庫(kù)的urlopen函數(shù) from urllib.request import urlopen # 發(fā)出請(qǐng)求,獲取html html = urlopen("https://www.baidu.com/") # 獲取的html內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串 html_text = bytes.decode(html.read()) # 打印html內(nèi)容 print(html_text)
看看效果:

我們看一下真正百度首頁(yè)html是什么樣的,如果你用的是谷歌瀏覽器,在百度主頁(yè)打開(kāi)設(shè)置>更多工具>開(kāi)發(fā)者工具,點(diǎn)擊element,就可以看到了:

對(duì)比一下你就會(huì)知道,剛才通過(guò)python程序獲取到的HTML和網(wǎng)頁(yè)中的一樣!
獲取了HTML之后,接下就要解析HTML了,因?yàn)槟阆胍奈谋?、圖片、視頻都藏在HTML里,你需要通過(guò)某種手段提取需要的數(shù)據(jù)。
python同樣提供了非常多且強(qiáng)大的庫(kù)來(lái)幫助你解析HTML,這里以著名的python庫(kù)BeautifulSoup為工具來(lái)解析上面已經(jīng)獲取的HTML。
BeautifulSoup是第三方庫(kù),需要安裝使用。在命令行用pip安裝就可以了:
pip install bs4
BeautifulSoup會(huì)將HTML內(nèi)容轉(zhuǎn)換成結(jié)構(gòu)化內(nèi)容,你只要從結(jié)構(gòu)化標(biāo)簽里面提取數(shù)據(jù)就OK了:

比如,我想獲取百度首頁(yè)的標(biāo)題“百度一下,我就知道”,怎么辦呢?
這個(gè)標(biāo)題是被兩個(gè)標(biāo)簽套住的,一個(gè)是一級(jí)標(biāo)簽<head><head>,另一個(gè)是二級(jí)標(biāo)簽<title><title>,所以只要從標(biāo)簽中取出信息就可以了

# 導(dǎo)入urlopen函數(shù) from urllib.request import urlopen # 導(dǎo)入BeautifulSoup from bs4 import BeautifulSoup as bf # 請(qǐng)求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標(biāo)簽head、title里提取標(biāo)題 title = obj.head.title # 打印標(biāo)題 print(title)
看看結(jié)果:

這樣就搞定了,成功提取出百度首頁(yè)的標(biāo)題。
如果我想要下載百度首頁(yè)logo圖片呢?
第一步先獲取該網(wǎng)頁(yè)所有圖片標(biāo)簽和url,這個(gè)可以使用BeautifulSoup的findAll方法,它可以提取包含在標(biāo)簽里的信息。
一般來(lái)說(shuō),HTML里所有圖片信息會(huì)在“img”標(biāo)簽里,所以我們通過(guò)findAll("img")就可以獲取到所有圖片的信息了。
# 導(dǎo)入urlopen from urllib.request import urlopen # 導(dǎo)入BeautifulSoup from bs4 import BeautifulSoup as bf # 請(qǐng)求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標(biāo)簽head、title里提取標(biāo)題 title = obj.head.title # 使用find_all函數(shù)獲取所有圖片的信息 pic_info = obj.find_all('img') # 分別打印每個(gè)圖片的信息 for i in pic_info: ? ?print(i)
看看結(jié)果:

打印出了所有圖片的屬性,包括class(元素類名)、src(鏈接地址)、長(zhǎng)寬高等。
其中有百度首頁(yè)logo的圖片,該圖片的class(元素類名)是index-logo-src。

[<img class="index-logo-src" height="129" hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" usemap="#mp" width="270"/>, <img alt="到百度首頁(yè)" class="index-logo-src" src="//www.baidu.com/img/baidu_jgylogo3.gif" title="到百度首頁(yè)"/>]
可以看到圖片的鏈接地址在src這個(gè)屬性里,我們要獲取圖片鏈接地址:
# 導(dǎo)入urlopen from urllib.request import urlopen # 導(dǎo)入BeautifulSoup from bs4 import BeautifulSoup as bf # 請(qǐng)求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標(biāo)簽head、title里提取標(biāo)題 title = obj.head.title # 只提取logo圖片的信息 logo_pic_info = obj.find_all('img',class_="index-logo-src") # 提取logo圖片的鏈接 logo_url = "https:"+logo_pic_info[0]['src'] # 打印鏈接 print(logo_url)
結(jié)果:

獲取地址后,就可以用urllib.urlretrieve函數(shù)下載logo圖片了
# 導(dǎo)入urlopen from urllib.request import urlopen # 導(dǎo)入BeautifulSoup from bs4 import BeautifulSoup as bf # 導(dǎo)入urlretrieve函數(shù),用于下載圖片 from urllib.request import urlretrieve # 請(qǐng)求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標(biāo)簽head、title里提取標(biāo)題 title = obj.head.title # 只提取logo圖片的信息 logo_pic_info = obj.find_all('img',class_="index-logo-src") # 提取logo圖片的鏈接 logo_url = "https:"+logo_pic_info[0]['src'] # 使用urlretrieve下載圖片 urlretrieve(logo_url, 'logo.png')
最終圖片保存在'logo.png'

六、結(jié)語(yǔ)
本文用爬取百度首頁(yè)標(biāo)題和logo圖片的案例,講解了python爬蟲(chóng)的基本原理以及相關(guān)python庫(kù)的使用,這是比較初級(jí)的爬蟲(chóng)知識(shí),還有很多優(yōu)秀的python爬蟲(chóng)庫(kù)和框架等待后續(xù)去學(xué)習(xí)。
房子一層一層蓋,知識(shí)一點(diǎn)一點(diǎn)學(xué)。
剛接觸Python的同學(xué)還是要打好基礎(chǔ),自己上手實(shí)操↓ 話不多說(shuō),上干貨!最近發(fā)現(xiàn)了一個(gè)接近免費(fèi)的Python課程,在裙上教學(xué)基礎(chǔ)知識(shí)+實(shí)操代碼,比較適合小白學(xué)習(xí),比找資料自學(xué)高效多了。最后分享給你們,在評(píng)論區(qū)下留言“拿來(lái)吧“就可以領(lǐng)??!