初學者、小白如何入門 Python 爬蟲?
本文針對初學者,我會用最簡單的案例告訴你如何入門python爬蟲!
想要入門Python 爬蟲首先需要解決四個問題
熟悉python程式設計
瞭解HTML
瞭解網路爬蟲的基本原理
學習使用python爬蟲庫
一、你應該知道什麼是爬蟲?
網路爬蟲,其實叫作網路資料採集更容易理解。
就是通過程式設計向網路伺服器請求資料(HTML表單),然後解析HTML,提取出自己想要的資料。
歸納為四大步:
- 根據url獲取HTML資料
- 解析HTML,獲取目標資訊
- 儲存資料
- 重複第一步
這會涉及到資料庫、網路伺服器、HTTP協議、HTML、資料科學、網路安全、影象處理等非常多的內容。但對於初學者而言,並不需要掌握這麼多。
二、python要學習到什麼程度
如果你不懂python,那麼需要先學習python這門非常easy的語言(相對其它語言而言)。
程式語言基礎語法無非是資料型別、資料結構、運算子、邏輯結構、函式、檔案IO、錯誤處理這些,學起來會顯枯燥但並不難。
剛開始入門爬蟲,你甚至不需要去學習python的類、多執行緒、模組之類的略難內容。找一個面向初學者的教材或者網路教程,花個十幾天功夫,就能對python基礎有個三四分的認識了,這時候你可以玩玩爬蟲嘍!
如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?說不定你學了可能是兩年前人家就學過的內容,我來分享一波2020最新的Python教程。加入我的學習圈子:810735403,就可以領取學習資料
三、為什麼要懂HTML
前面說到過爬蟲要爬取的資料藏在網頁裡面的HTML裡面的資料,有點繞哈!
維基百科是這樣解釋HTML的
超文字標記語言(英語:HyperTextMarkupLanguage,簡稱:HTML)是一種用於建立網頁的標準標記語言。HTML是一種基礎技術,常與CSS、JavaScript一起被眾多網站用於設計網頁、網頁應用程式以及移動應用程式的使用者介面[3]。網頁瀏覽器可以讀取HTML檔案,並將其渲染成視覺化網頁。HTML描述了一個網站的結構語義隨著線索的呈現,使之成為一種標記語言而非程式語言。
總結一下,HTML是一種用於建立網頁的標記語言,裡面嵌入了文字、影象等資料,可以被瀏覽器讀取,並渲染成我們看到的網頁樣子。
所以我們才會從先爬取HTML,再 解析資料,因為資料藏在HTML裡。
學習HTML並不難,它並不是程式語言,你只需要熟悉它的標記規則,這裡大致講一下。
HTML標記包含標籤(及其屬性)、基於字元的資料型別、字元引用和實體引用等幾個關鍵部分。
HTML標籤是最常見的,通常成對出現,比如<h1>
與</h1>
。
這些成對出現的標籤中,第一個標籤是開始標籤,第二個標籤是結束標籤。兩個標籤之間為元素的內容(文字、影象等),有些標籤沒有內容,為空元素,如。
以下是一個經典的Hello World程式的例子:
<!DOCTYPE html>
<html>
<head>
<title>This is a title</title>
</head>
<body>
<p>Hello world!</p>
</body>
</html>
很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:810735403
HTML文件由巢狀的HTML元素構成。它們用HTML標籤表示,包含於尖括號中,如<p>
[56]
在一般情況下,一個元素由一對標籤表示:“開始標籤”<p>
與“結束標籤”</p>
。元素如果含有文字內容,就被放置在這些標籤之間。
四、瞭解python網路爬蟲的基本原理
在編寫python爬蟲程式時,只需要做以下兩件事:
- 傳送GET請求,獲取HTML
- 解析HTML,獲取資料
這兩件事,python都有相應的庫幫你去做,你只需要知道如何去用它們就可以了。
五、用python庫爬取百度首頁標題和圖片
首先,傳送HTML資料請求可以使用python內建庫urllib
,該庫有一個urlopen
函式,可以根據url獲取HTML檔案,這裡嘗試獲取百度首頁“https://www.baidu.com/”的HTML內容
# 匯入urllib庫的urlopen函式 from urllib.request import urlopen # 發出請求,獲取html html = urlopen("https://www.baidu.com/") # 獲取的html內容是位元組,將其轉化為字串 html_text = bytes.decode(html.read()) # 列印html內容 print(html_text)
我們看一下真正百度首頁html是什麼樣的,如果你用的是谷歌瀏覽器,在百度主頁開啟設定>更多工具>開發者工具,點選element,就可以看到了:
對比一下你就會知道,剛才通過python程式獲取到的HTML和網頁中的一樣!
獲取了HTML之後,接下就要解析HTML了,因為你想要的文字、圖片、視訊都藏在HTML裡,你需要通過某種手段提取需要的資料。
python同樣提供了非常多且強大的庫來幫助你解析HTML,這裡以著名的python庫BeautifulSoup為工具來解析上面已經獲取的HTML。
BeautifulSoup是第三方庫,需要安裝使用。在命令列用pip安裝就可以了:
pip install bs4
BeautifulSoup會將HTML內容轉換成結構化內容,你只要從結構化標籤裡面提取資料就OK了:
比如,我想獲取百度首頁的標題“百度一下,我就知道”,怎麼辦呢?
這個標題是被兩個標籤套住的,一個是一級標籤<head><head>
,另一個是二級標籤<title><title>
,所以只要從標籤中取出資訊就可以了
# 匯入urlopen函式 from urllib.request import urlopen # 匯入BeautifulSoup from bs4 import BeautifulSoup as bf # 請求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標籤head、title裡提取標題 title = obj.head.title # 列印標題 print(title)
看看結果:
這樣就搞定了,成功提取出百度首頁的標題。
如果我想要下載百度首頁logo圖片呢?
第一步先獲取該網頁所有圖片標籤和url,這個可以使用BeautifulSoup的findAll方法,它可以提取包含在標籤裡的資訊。
一般來說,HTML裡所有圖片資訊會在“img”標籤裡,所以我們通過findAll(“img”)就可以獲取到所有圖片的資訊了。
# 匯入urlopen from urllib.request import urlopen # 匯入BeautifulSoup from bs4 import BeautifulSoup as bf # 請求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標籤head、title裡提取標題 title = obj.head.title # 使用find_all函式獲取所有圖片的資訊 pic_info = obj.find_all('img') # 分別列印每個圖片的資訊 for i in pic_info: print(i)
看看結果:
打印出了所有圖片的屬性,包括class(元素類名)、src(連結地址)、長寬高等。
其中有百度首頁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="到百度首頁" class="index-logo-src" src="//www.baidu.com/img/baidu_jgylogo3.gif" title="到百度首頁"/>]
可以看到圖片的連結地址在src這個屬性裡,我們要獲取圖片連結地址:
# 匯入urlopen from urllib.request import urlopen # 匯入BeautifulSoup from bs4 import BeautifulSoup as bf # 請求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標籤head、title裡提取標題 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)
結果:
獲取地址後,就可以用urllib.urlretrieve函式下載logo圖片了
# 匯入urlopen from urllib.request import urlopen # 匯入BeautifulSoup from bs4 import BeautifulSoup as bf # 匯入urlretrieve函式,用於下載圖片 from urllib.request import urlretrieve # 請求獲取HTML html = urlopen("https://www.baidu.com/") # 用BeautifulSoup解析html obj = bf(html.read(),'html.parser') # 從標籤head、title裡提取標題 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圖片的案例,講解了python爬蟲的基本原理以及相關python庫的使用,這是比較初級的爬蟲知識,還有很多優秀的python爬蟲庫和框架等待後續去學習。
在這裡還是要推薦下我自己建的Python開發交流學習(qq)群:810735403,群裡都是學Python開發的,如果你正在學習Python ,歡迎你
加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2021最新的Python進階資料和高階
開發教程,歡迎進階中和想深入Python的小夥伴!