python爬虫中requests库和正则表达式之淘宝爬虫实战

#python版本基于2.7

使用requests库是需要安装的,requests库相比urllib 库来说更高级方便一点,同时与scrapy相比较还是不够强大,本文主要介绍利用requests库和正则表达式完成一项简单的爬虫小项目----淘宝商品爬虫。

有关于更多requests库的使用方法请参考:官方文档

第一步:我们先打开淘宝网页














然后搜索你想爬取的商品信息,比如:“手机”。然后可以看到各个商品的“商品名称”、“商品价格”。我们可以爬取手机的名称和价格,从而达到“货比三家”的功能。












第二步:鼠标右键点击网页的空白处,选中“查看页面源代码”,从页面源代码中获取商品名称和商品价格对应的字典中的key值,从而利用正则表达式来爬取所有商品的信息。
















鼠标选中“查看页面源代码”后,会出现以下页面:



HTML格式的源代码,为了查找商品名称和商品价格对应的标签,也就是字典中的key,我们可以直接复制淘宝某一个商品的名称或者价格信息,在页面源代码中查找相对应的信息。不同的浏览器中,按Ctrl+F键可进入查找模式。

现在复制粘贴其中一个商品的名称信息“荣耀 荣耀9青春版”,得到如下结果:


可以发现其中的键值对,“title”是“荣耀 荣耀9青春版”的key,现在我们就得到了商品名称所对应的标签,同样的方法可以查找出商品价格对应的标签,这里就不过多阐述,直接给出:


现在得到了商品名称和价格对应的标签:“title”和“price”。

如果这样进行爬虫的话,只能爬取一个网页中的商品,如果我们还想爬第二页,第三页就要寻找其中每翻一次页中的网址对应的变化信息。

先来看看淘宝“手机”商品中第二页和第三页中的网址变化信息。

第二页:

第三页:


我们看到,无论是第二页第三页,只有最后的“&s=**”部分不一致,同时第二页对应的s=48,第三页对应的s=96,可以推测出第i页的s=48*(i-1),我们只需要把这个url添加到我们的爬取程序上,用for循环实现这个url的更新即可。

第三步:进入编写实例

这里用python语言编写程序实现爬虫功能。

由于需要用到正则表达式和requests库,所以先引入。

import requests
import re


先定义好一个主函数main,把各个功能模块化,然后再去编写各个模块的具体代码。

def main():
    goods = '手机'
    depth = 3 #爬取3页
    start_url = 'http://s.taobao.com/search?q=' + goods   #爬取商品的url
    infoList = []  #初始化一个列表,方便把爬取的键值对添加到里面,然后读取
    for i in range(depth):  #for循环更新url
        try:   #处理异常
            url = start_url + '&s=' + str(48*i) #每页的url
            html = getHTMLText(url) #获取页面信息
            parsePage(infoList, html) #解析获取的信息,捕捉商品信息的键值对并且添加到列表中
        except:
            continue
    printGoodsList(infoList)  #打印列表中的键值对信息
主函数写完了,我们把各功能的模块具体化。

首先是getHTMLText()函数,获取url页面的信息文本:

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30) #get方法请求url链接,如果超过30秒没有响应就退出
        r.raise_for_status() #状态码,如果是200则请求成功
        r.encoding = r.apparent_encoding #将编码方式更改为捕捉到的内容的编码方式,中文网页一般utf-8
        return r.text
    except:
        return ""
然后是 parsePage( )函数,解析页面信息,将商品名称和商品价格组合成一对键值对,然后添加到列表里。需要用到正则表达式。

def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html) #finfall功能将所有的value数字整合在plt列表
        tlt = re.findall(r'\"title\"\:\".*?\"',html) #将所有title的value整合在tlt列表
        for i in range(len(plt)): #基于列表plt的长度使用for循环
            price = eval(plt[i].split(':')[1]) #split用“:”切割key和value;eval可以转化格式
            title = eval(tlt[i].split(':')[1])
            ilt.append([price , title]) #将商品的价格和名称作为键值对添加到ilt列表
            
    except:
        print("")

最后是打印函数printGoodsList( ),输出爬取的结果:

def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    tplt2 = "{:8}\t{:16}\t{:14}"
    print(tplt2.format("序号", "价格", "商品名称")) #格式化输出函数
    count = 0 #序号
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1])) #依次输出序号,价格,商品名称
最后执行主函数:main(),查看结果

以上代码中的eval,split,format方法都很简单,下面给出这三个方法的介绍链接:

eval

python eval方法

split

python split方法

format

python format方法

文章到此结束,请各位自行尝试。







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>