Python 爬蟲--urllib 和 re 模組(第一篇)
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:keinYe
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
爬蟲的主要用途即從網站上獲取網頁,並將網頁中的有用資訊解析出來。從網站上獲取網頁內容可以通過 python 內建的 urllib 模組來實現,至於資訊的解析說起來比較複雜,python 中可以使用的模組也有很多,今天我們主要使用正則表示式「python 內建的 re 模組」來實現資料的解析。
今天我們準備使用 urllib 和 re 模組來實現爬蟲的功能將網頁中的資料資料讀取出來。
確定目標
我們的目標是獲取立創商城上元器件的階梯價格「不同的採購數量對應的價格不同」。先來看下網頁的圖
我們想要的資料在這裡
實施方案
首先我們可以後去到該網頁的網址 ‘https://item.szlcsc.com/213095.html’。可以使用 urllib.urlopen 方法讀取網頁內容
url = 'https://item.szlcsc.com/213095.html' response = urllib2.urlopen(url) html_text = response.read().decode('utf-8')
要獲取階梯價格的資訊,我們先來看一下這段所對應的 html 內容:
從圖上可以看出每個階梯價格有 tr 標籤進行分割,而每行的中的數量和對應的價格使用 td 標籤進行顯示。我們可以使用以下正則表示式來提取數量和價格內容。
# 提取每個階梯價格的正則表示式 '<tr class="sample_list_tr">(.*?)</tr>' # 提取一行中的數量 '<td width="40%" align="right">(.*?)</td>' # 提取一行中的價格 "<p class='goldenrod'>(.*?)</p>"
現在我們來看一下完整的程式
# -*- coding:utf-8 -*- import urllib2 import re def find_number(str): ''' 獲取每一行中的數量範圍''' res = r'<td width="40%" align="right">(.*?)</td>' find_str = re.findall(res, str, re.S)[0] # 去除單位 res_2 = '[1-9]{1}[\\d ~\\s]*\\d' find_str = re.findall(res_2, find_str, re.S)[0] # 去除字串中的空格 strinfo = re.compile('[\\s]') return re.sub(strinfo, '', find_str) def find_price(str): ''' 獲取每一行中的價格資訊 ''' res = r"<p class='goldenrod'>(.*?)</p>" find_str = re.findall(res, str, re.S) # 若無對應的價格是顯示 None if len(find_str): # 去除價格中的單位 res_2 = '[1-9]{1}[\\d\\.]*' find_str = re.findall(res_2, find_str[0], re.S) return find_str[0] else: return 'None' url = 'https://item.szlcsc.com/213095.html' # 讀取網頁內容,並解碼相關內容 response = urllib2.urlopen(url) html_text = response.read().decode('utf-8') res_tr = r'<tr class="sample_list_tr">(.*?)</tr>' m_tr = re.findall(res_tr, html_text, re.S) print '%4s | %10s | %5s' %('序號', '數量', '單價') print "-------------------------" for n, value in enumerate(m_tr): print '%4d | %10s | %5s' %(n + 1, find_number(value), find_price(value)) print "-------------------------"
檢驗結果
程式碼已經編寫完成,現在我們來驗證一下執行的效果,以上程式碼的執行結果如下:
序號 | 數量 | 單價
-------------------------
1 | 1~9 | 9.21
-------------------------
2 | 10~29 | 6.81
-------------------------
3 | 30~99 | 6.37
-------------------------
4 | 100~499 | 5.93
-------------------------
5 | 500~999 | 5.73
-------------------------
6 | 1000 | 5.64
-------------------------
對比執行結果與前面我們看到的網頁資訊,可以看到程式正常執行且得到正確的結果。
想在我們將網址更換為 ‘https://item.szlcsc.com/8796.html’,網頁顯示如下:
此時我們再次執行程式,得到以下結果:
序號 | 數量 | 單價 ------------------------- 1 | 1~9 | 13.82 ------------------------- 2 | 10~29 | 11.75 ------------------------- 3 | 30~99 | 11.37 ------------------------- 4 | 100~499 | 10.99 ------------------------- 5 | 500~999 | 10.82 ------------------------- 6 | 1000~1999 | 10.61 ------------------------- 7 | 2000 | None -------------------------
可以看到以上結果與網頁中的內容完全相同,程式碼完成了我們的預定功能。
注意:此程式碼在 python 2.7.10 版本驗證。