前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Python爬取淘宝商品信息分析设计程序结构核心代码完整代码

利用Python爬取淘宝商品信息分析设计程序结构核心代码完整代码

作者头像
desperate633
发布2018-08-27 16:37:06
7790
发布2018-08-27 16:37:06
举报
文章被收录于专栏:desperate633

本文所实现的爬取淘宝商品信息将实现以下功能: 对于某个类别的淘宝商品的页面

image.png

爬取这个商品名称,比如“手机”搜索结果下的每个商品的信息,存储到数据结构中,并能将其输出显示。

如下的输出形式:

image.png

接下来,就看我们如何一步步实现这个小爬虫的吧

分析

  • 目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格
  • 理解: 淘宝的搜索接口 翻页的处理

首先分析搜索接口, 很容易我们就可以发现,

image.png

https://s.taobao.com/search?q=后面接我们的搜索词就可以

我们再研究翻页处理: 第二页

image.png

第三页

我们可以发现,s参数指定了搜索页的跳转,每48条记录一次页面跳转。

有同学可能发现还会有其他很多的参数,这个我们先忽略,我们直接构造一个url,只包括搜索词和搜索页,看看能不能访问到正确页面: 比如 https://s.taobao.com/search?q=手机&s=48

我们将上述地址放到地址栏

发现可以正确访问,所以我们现在就已经知道了如何确定访问接口

设计程序结构

主要有三步

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

首先我们对于上面研究出的搜索接口给出基本的代码:

代码语言:javascript
复制
#CrowTaobaoPrice.py
import requests
import re

def getHTMLText(url):

    
def parsePage(ilt, html):


def printGoodsList(ilt):

        
def main():
    goods = '手机'
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(48*i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
    printGoodsList(infoList)
    
main()

对于获取页面源码的函数,我们已经写过很多次了,就是利用requets库抓取页面

代码语言:javascript
复制
def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

核心代码

这个爬虫最核心的地方就在于对商品信息的获取,我们首先分析页面的源代码,我们搜索第一个商品的名字

image.png

基本上所有商品的信息,名称,价格,月销量都在这段数据结构里显示,是嵌入在js代码里的,所以我们就无法用bs4库来提取。 但我们可以直接用re库,正则表达式提取。 因为我们可以发现,所有的商品名称都是 “title”:" "的格式,我们可以搜索确认一下:

我们搜索发现,正好是48条记录,也就是48个商品的信息,所以直接匹配就可以把所所有商品名称信息提取出来,是不是很简单。 对于商品价格 和月销量也是这么获取的

代码语言:javascript
复制
def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
        tlt = re.findall(r'\"title\"\:\".*?\"',html)
        mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[i].split(':')[1])
            monthsales = eval(mslt[i].split(':')[1])
            ilt.append([price , title, monthsales])
    except:
        print("")

完整代码

代码语言:javascript
复制
#CrowTaobaoPrice.py
import requests
import re

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
    
def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
        tlt = re.findall(r'\"title\"\:\".*?\"',html)
        mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[i].split(':')[1])
            monthsales = eval(mslt[i].split(':')[1])
            ilt.append([price , title, monthsales])
    except:
        print("")

def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}\t{:16}"
    print(tplt.format("序号", "价格", "商品名称","月销量"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1],g[2]))
        
def main():
    goods = '手机'
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(48*i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
    printGoodsList(infoList)
    
main()

结果:

小伙伴也可以更改这个程序去搜索各种不同的商品的信息啦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析
  • 设计程序结构
  • 核心代码
  • 完整代码
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档