美文网首页Python学习程序员
Python 爬虫第一篇(urllib+regex)

Python 爬虫第一篇(urllib+regex)

作者: keinYe | 来源:发表于2019-03-14 17:42 被阅读0次

    爬虫的主要用途即从网站上获取网页,并将网页中的有用信息解析出来。从网站上获取网页内容可以通过 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 版本验证。

    相关文章

      网友评论

        本文标题:Python 爬虫第一篇(urllib+regex)

        本文链接:https://www.haomeiwen.com/subject/bymcmqtx.html