1. 程式人生 > 實用技巧 >Python 爬蟲--urllib 和 re 模組(第一篇)

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 版本驗證。