有問題的朋友歡迎關注我的公衆號 拇指筆記 與我一同交流。本人一定做到知無不言
0. 本文內容
最近想寫一個爬取中國天氣網的爬蟲。所以打算寫一個關於爬蟲的系列教程,本文介紹爬蟲的基礎知識和簡單使用。
- 獲取HTML文件
- Beautiful Soup4庫安裝
- Beautiful Soup4對象類型說明
- 爬取網頁標題
- 爬取網頁圖片
1. 關於爬蟲
維基百科是這樣解釋爬蟲的。
網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱爲網頁追逐者),是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。
實現一個爬蟲,大概只需要三步
- 根據url獲取HTML數據
- 解析獲取到的HTML數據,獲取信息
- 存儲數據
1.1 獲取HTML文件
HTML是創建網頁的標記語言,其中嵌入了文本、圖像等數據,然後被瀏覽器讀取並渲染成我們看到的網頁的樣子。
使用python內置庫urllib中的urlopen函數,就可以根據url獲取HTML文件。
1.1.1 HTML標籤
在HTML中 用於標記的符號稱爲超文本標記語言標籤,HTML標籤的組成如下。
- HTML標籤以尖括號標識標籤名稱,如
<title>
- 大多數HTML標籤是成對存在的(開始標籤和結束標籤),如
<head>,</head>
- 也有極少數單獨存在的標籤,如
<br/>,<hr/>
- 標籤中還可以添加屬性值。
1.1.2 實現方法
這裏以中國天氣網爲例,使用python內置庫urllib中的urlopen函數獲取該網站的HTML文件。
from urllib.request import urlopen
#使用urlopen獲取一個網頁的內容
html = urlopen("http://www.weather.com.cn/")
#獲取一個網頁html內容,並使用decode將其轉化爲字符串
html_text = bytes.decode(html.read())
print(html_text)
獲取到的HTML文件
1.2 解析HTML文件
讀取到網頁內容後,需要在HTML文件中找到我們需要的信息。這裏使用BeautifulSoup
庫來實現這個功能。
Beautiful庫的官網介紹如下
Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔爲用戶提供需要抓取的數據,因爲簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。
1.2.1 Beautiful Soup4庫安裝
目前Beautiful Soup4已經被移植到BS4中了,所以安裝使用如下命令,我這裏使用的清華源。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs4
安裝成功後,cmd中會顯示
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1
現在在jupyter裏使用如下代碼測試一下是否成功安裝。一定要注意大寫
from bs4 import BeautifulSoup
1.2.2 Beautiful Soup4中的對象
Beautiful Soup4將HTML文檔轉換成樹形結構,每個節點都是Python對象。這些對象可以歸爲4類
-
Tag:HTML中的標籤加上標籤內的內容(例如下面的爬取標題)。
它有兩個屬性(name和attrs),name用來獲取標籤的名稱;attrs用來獲取屬性。
-
NavigableString :標籤內部文字的屬性。
使用.string可以獲得標籤內的文字內容
-
BeautifulSoup :表示一個文檔的全部內容。
-
Comment 特殊的NavigableString對象。
1.2.3 獲取網頁標題
還是以剛纔的中國天氣網爲例,現在我們來爬取它的標題。
from bs4 import BeautifulSoup as bf
from urllib.request import urlopen
html = urlopen("http://www.weather.com.cn/")
obj = bf(html.read(),'html.parser')
title = obj.head.title
print(title)
爬取到的信息如下
<title>首頁-中國天氣網</title>
1.2.4 獲取網頁圖片
獲取網頁中的一張圖片步驟如下
- 使用BeautifulSoup中的findall方法獲取網頁所有圖片的url。
- 根據圖片的地址,使用 urllib.urlretrieve函數下載圖片。
圖片信息一般都包含在’img’標籤中,所以我們通過find_all('img')
來爬取網頁的圖片信息。
from bs4 import BeautifulSoup as bf
from urllib.request import urlopen
#使用urlopen獲取一個網頁的內容
html = urlopen("http://www.weather.com.cn/")
#解析HTML文件
obj = bf(html.read(),'html.parser')
#獲取網頁中圖片文件的信息
pic = obj.find_all('img')
#輸出所有圖片信息
for i in pic:
print(i)
爬取到的圖片信息如下
可以看到,圖片的屬性有class、src和長寬等,src代表鏈接地址。
得到圖片信息後,需要提取圖片鏈接來下載(這裏我選的第五張圖片),
url = pic[4]['src']
然後使用urllib.urlretrieve函數下載圖片。
urllib.urlretrieve(url, '1.png')
完整程序如下
from bs4 import BeautifulSoup as bf
from urllib.request import urlopen
from urllib.request import urlretrieve
#使用urlopen獲取一個網頁的內容
html = urlopen("http://www.weather.com.cn/")
obj = bf(html.read(),'html.parser')
title = obj.head.title
pic = obj.find_all('img')
#print (obj.prettify())
url = pic[4]['src']
urlretrieve(url, 'pachong1.png')
print(title)
print(url)
爬取到的圖片
有問題的朋友歡迎關注我的公衆號 拇指筆記 與我一同交流。