Python 爬虫第一篇(urllib+regex)

爬虫的主要用途即从网站上获取网页,并将网页中的有用信息解析出来。从网站上获取网页内容可以通过 python 内置的 urllib 模块来实现,至于信息的解析说起来比较复杂,python 中可以使用的模块也有很多,今天我们主要使用正则表达式「python 内置的 re 模块」来实现数据的解析。

前面有对 python 内置的 urllib 模块和 re 模块做过简单的介绍有兴趣的朋友可以了解一下

  1. 初识 Python 网络请求库 urllib
  2. Python 正则表达式

今天我们准备使用 urllib 和 re 模块来实现爬虫的功能将网页中的数据数据读取出来。

确定目标

我们的目标是获取立创商城上元器件的阶梯价格「不同的采购数量对应的价格不同」。先来看下网页的图片


image

我们想要的数据在这里


image

实施方案

首先我们可以后去到该网页的网址 '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 内容:


image

从图上可以看出每个阶梯价格有 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',网页显示如下:

image

此时我们再次执行程序,得到以下结果:

序号 |       数量 |  单价
-------------------------
   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 版本验证。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容