Python爬虫入门实例五之淘宝商品信息定向爬取(优化版)

写在前面

  这个例子是笔者今天在中国大学MOOC(嵩天 北京理工大学)上学习的时候写下来的。但是很快写完之后我就发现不对劲,因为照着老师的代码写完后运行并不能爬取到信息,经过我的一番折腾,基本解决了问题,并且做了一些优化,写这篇博客记录一下,下图是最终的爬取结果。

在这里插入图片描述

一、爬取原页面

  爬取页面为淘宝网站,以女装为例,原图如下,由于淘宝商品排名实时更新,所以爬取结果顺序与网站顺序可能会存在不同。本实例爬取的内容为商品的价格和名称,并为其添加序号。

在这里插入图片描述

二、编程思路

  这一部分嵩天老师在课中给出了讲解,这里我整理分享给大家。

1.功能描述

目标:获取淘宝搜索页面的信息,提取其中的名称和价格。

理解:
(1).获得淘宝的搜索接口
(2).对翻页的处理

技术路线:requests-re

2.程序的结构设计

步骤一:提交商品搜索请求,循环获取页面
步骤二:对于每个页面,提取商品名称和价格信息
步骤三:将信息输出到屏幕上

扫描二维码关注公众号,回复: 12083208 查看本文章

对应上述三个步骤分别定义三个函数:

(1)getHTMLText()获得页面
(2)parsePage()对每一个获得的页面进行解析
(3)printGoodsList()将商品的信息输出到屏幕上

三、编程过程

1.解决翻页问题

  首先我们来看一下前三页分别的URL

在这里插入图片描述
  对淘宝每一页商品数量的观察我们可以发现,每一页有44个商品,结合上面的结果我们可以猜测,变量s表示的是第二页,第三页…页的起始商品的编号。基于这种规则,我们就可以构建不同页的URL链接。

代码如下:

for i in range(depth):#对每次翻页后的URL链接进行设计
    url = start_url + '&s='+str(44*i)
    html = getHTMLText(url)
    parsePage(infoList,html)

2.编写getHTMLText()函数

def getHTMLText(url):#获得页面
    try:
        kv = {
    
    'user-agent': 'Mozilla/5.0',
              'cookie':' '#请自行获取
              }
        r = requests.get(url,headers=kv,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("获取页面失败")

关于cookie的获取方法,可以参考我的这篇博客
链接: https://blog.csdn.net/weixin_44578172/article/details/109353017.

3.编写parsePage()函数

(1).内容解析编程思路

  首先查看女装搜索结果页面的源代码
在这里插入图片描述
  通过对源代码的观察我们发现,淘宝中所有商品的价格和名称是存在相应的键值对中的即:“view_price”:“价格”,“view_title”:“名称”。所以我们想要获得这两个信息,只需要在获得的文本中检索到view_price和view_title并把后续的相关内容提取出来即可,这里采用正则表达式的方法。

(2).函数代码

def parsePage(ilt,html):#对每一个获得的页面进行解析
#两个变量分别是结果的列表类型和相关的HTML页面的信息
    try:
        re1 = re.compile(r'\"view_price\"\:\"[\d\.]*\"')#编译商品价格正则表达式
        re2 = re.compile(r'\"raw_title\"\:\".*?\"')#编译商品名称正则表达式
        plt = re1.findall(html)
        tlt = re2.findall(html)
        #plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        #tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])#去掉view_price字段,只要价格部分,eval将获取到的最外层/内层的单引号或双引号去掉
            title = eval(tlt[i].split(':')[1])#去掉raw_title字段,只要名称部分
            ilt.append([price,title])
    except:
        print("网页解析失败")

4.编写printGoodsList()

def printGoodsList(ilt):#将商品的信息输出到屏幕上
    try:
        tplt = "{:4}\t{:8}\t{:16}" #定义打印模板
        print(tplt.format("序号","价格","商品名称"))
        count = 0
        for s in ilt:
            count = count + 1
            print(tplt.format(count,s[0],s[1]))
    except:
        print("输出失败")

四、完整代码

'''
功能描述

目标:获取淘宝搜索页面的信息,提取其中的名称和价格。

理解:
1.获得淘宝的搜索接口
2.对翻页的处理

技术路线:requests-re

程序的结构设计
步骤1:提交商品搜索请求,循环获取页面
步骤2:对于每个页面,提取商品名称和价格信息
步骤3:将信息输出到屏幕上
'''
import requests
import re

def getHTMLText(url):#获得页面
    try:
        kv = {
    
    'user-agent': 'Mozilla/5.0',
              'cookie':' '#请自行获取
              }
        r = requests.get(url,headers=kv,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("获取页面失败")

def parsePage(ilt,html):#对每一个获得的页面进行解析
#两个变量分别是结果的列表类型和相关的HTML页面的信息
    try:
        re1 = re.compile(r'\"view_price\"\:\"[\d\.]*\"')#编译商品价格正则表达式
        re2 = re.compile(r'\"raw_title\"\:\".*?\"')#编译商品名称正则表达式
        plt = re1.findall(html)
        tlt = re2.findall(html)
        #plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        #tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])#去掉view_price字段,只要价格部分,eval将获取到的最外层/内层的单引号或双引号去掉
            title = eval(tlt[i].split(':')[1])#去掉raw_title字段,只要名称部分
            ilt.append([price,title])
    except:
        print("网页解析失败")

def printGoodsList(ilt):#将商品的信息输出到屏幕上
    try:
        tplt = "{:4}\t{:8}\t{:16}" #定义打印模板
        print(tplt.format("序号","价格","商品名称"))
        count = 0
        for s in ilt:
            count = count + 1
            print(tplt.format(count,s[0],s[1]))
    except:
        print("输出失败")

def main():
    goods = input("请输入想要搜索的商品:") #定义搜索关键词变量
    depth = input("请输入想要搜索商品的深度(整数):") #定义爬取的深度即页数
    depth = int(depth)
    start_url = 'https://s.taobao.com/search?q='+goods
    infoList = [] #定义整个的输出结果变量
    for i in range(depth):#对每次翻页后的URL链接进行设计
        try:
            url = start_url + '&s='+str(44*i)
            html = getHTMLText(url)
            parsePage(infoList,html)
        except:
            continue
    printGoodsList(infoList)

#调用主函数
main()

  本篇完,如有错误欢迎指出~

引用源自

中国大学MOOC Python网络爬虫与信息提取
https://www.icourse163.org/course/BIT-1001870001

猜你喜欢

转载自blog.csdn.net/weixin_44578172/article/details/109356900