一条伪装头部的淘宝商品信息爬虫

淘宝商品信息爬虫

做任何东西的基本思考过程,莫过于三个过程 what? why? how?
那我们也就从这个三方面来介绍本篇文章:

  • What?

    本爬虫是对用户给定的商品名,在淘宝进行搜索,并且返回一定的商品数目的部分信息。比如价格、链接、商品名称。其他属性读者亦可自行扩展。

  • Why?

    首先,做这个东西纯属个人技术学习。前阵子看猪哥的公众号有关爬虫的介绍,又这学期课程也以结束,刚好闲暇。打算学习Python爬虫技术。多一个技术能力绝对不会是什么坏事。所以实现这个爬虫,只单纯为个人练习。

  • How?

    1. 首先介绍一下本次爬虫实现所用到的

    • Python 环境
    • Python 第三方库 (Requests、Re)
    • Requests 请求信息提取工具 :https://curl.trillworks.com/

    2. 需要了解的 Robots 协议

    • Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots ExclusionProtocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取.
    • 即是网站对爬虫的“君子协议”,可通过要爬取的URL的根目录/rebots.txt 进行查看。

    3. 爬虫设计的前期分析

    1. 业务需要网页分析

    1. 获取Robots协议
    一条伪装头部的淘宝商品信息爬虫_第1张图片

    • 即为不允许任何爬虫,emmm。这块就是说的之前的,为了学习技术,并无其他目的,也不会对其服务器造成影响,因为个人小爬虫规模较小。

    2. 分析淘宝搜索Url接口

  • 首先我们先通过实际搜索观察到

  • 淘宝的搜索URL接口 = “https://s.taobao.com/search?q=” + sth

  • Sth即为你要搜索的东西

  • 一条伪装头部的淘宝商品信息爬虫_第2张图片

3. 审查页面源代码,提取出获得信息的途径

  • 一般浏览器都有查看网页源代码按键,即在页面空白处鼠标右键,查看网页源代码

  • 一条伪装头部的淘宝商品信息爬虫_第3张图片

  • 如何去获得商品的信息呢,我们首先先从单个入手,在网页源代码中搜索第一个商品的价格。例如我们搜索第一支YSL11的价格335.00
    一条伪装头部的淘宝商品信息爬虫_第4张图片

    在这里插入图片描述


  • 即可以看出这个键值对“view_price”:“335.00” 。这很关键这是我们之后进行网页进行正则表示式搜索的依据。
  • 同理,搜索第一个商品的名称
    一条伪装头部的淘宝商品信息爬虫_第5张图片

在这里插入图片描述

  • 这就是另一个我们想要获取的信息了,即商品名称信息键值对“title”:“xxxxxxxxxxx”
  • 那么如何获取多页的信息呢,这又得去从网页去分析了。通过多次点击下一页,观察网页URL的变动。发现URL中有个属性&=xx 的xx每次点击下一页的值依次为1,44,88。刚好每页又是44个商品。故不难得到改变&=44等可以进行翻页。
    一条伪装头部的淘宝商品信息爬虫_第6张图片

一条伪装头部的淘宝商品信息爬虫_第7张图片

4.Coding

  • 首先需要几个函数

    1. getHtmlText(url, code=‘utf-8’)获取网页信息函数
    2. parsePage(intoList, html)爬取信息
    3. printGoodsList()打印所爬取的信息
    4. main()进行函数调度
  • main()

    • depth 即淘宝网页的页数 ,在这里我们设置为3页。
    • 对淘宝搜索URL接口进行组装。再调用getHtmlText(url, code=‘utf-8’)进行获得页面所以信息
    • 再调用parsePage(intoList, html)获取要爬取的关键信息
    • printGoodsList(ilt)进行打印
if __name__ == '__main__':
    print("请输入你要搜索的东西")
    goods = input()
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    intoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(44*i)
            html = getHtmlText(start_url)
            parsePage(intoList, html)
        except:
            continue
    printGoodsList(intoList)
  • getHtmlText(url, code=‘utf-8’)

    • 这里我们默认网页的编码格式为‘UTF-8’,这样就用不到 re.encoding = r.apparent_encoding节约了时间。这里使用的爬虫的基本框架,r.raise_for_status()如果状态不是200则产生异常,被try捕获,进行except:return。
def getHtmlText(url, code='utf-8'):
    try:
        r = requests.get(url,  timeout=30)
        r.raise_for_status()
        # r.encoding = r.apparent_encoding
        # 直接给定编码格式,节约时间
        r.encoding = code
        return r.text
    except:
        return ""
  • parsePage(ilt, html)

    • 这就是爬虫主要爬取函数了,首先是通过正则表达式,对getHtmlText函数的返回值,即是网页的全部文本信息进行匹配。这基于以上总结的商品价钱和商品名称特性,书写正则表达式,从而进行模板匹配。
    • 这里的id指的是商品的详情页面的url特征链接的键值对,类似于上一步的淘宝翻页,大家可自行观察实践。
def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        id = re.findall(r'\"nid\"\:\"[0-9]+\"', html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[i].split(':')[1])
            nid = eval(id[i].split(':')[1])
            nid_url = 'https://detail.tmall.com/item.htm?id=' + nid
            ilt.append([price, title, nid_url])
            print('\r当前进度:{:.2f}%'.format(i*100/len(plt)), end="")
    except :
        print("")

  • printGoodsList(ilt)

    • 即是对上一步整理的列表进行format格式化打印
def printGoodsList(ilt):
    print('\n')
    tplt = "{:4}\t{:8}\t{:46}\t\t{:16}"
    print(tplt.format("序号", "价格", "链接", "商品名称"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[2], g[1]))

5.调试

  • 既然我写了这个调试部分,也就是上述的代码是存在一定的问题的。首先我们先跑一下。看一下结果。这是因为我们既定的访问的网页不是我们想要的。
    一条伪装头部的淘宝商品信息爬虫_第8张图片

  • 打印一下 r.text 我们看到的是这样的。和我们之前查看网页源代码的时候是有很大的出入的。这里通过观察整个网页的代码可以观察处这是要我们进行登陆的。
    一条伪装头部的淘宝商品信息爬虫_第9张图片
    一条伪装头部的淘宝商品信息爬虫_第10张图片

  • 而我们只需要一些微小但关键的东西就可以避开这个问题了。得到我们想要的了。

  • 一条伪装头部的淘宝商品信息爬虫_第11张图片

  • 这里就要提到了requests,或者普遍的反爬虫机制。

    • 首先我们对一个网页进行requests.get请求的时候,服务器会对我们的请求进行分析,对判断从而给出什么样的响应。而我们rquests.get请求中的首部会提供给服务器我们的访问的一些属性。谷歌浏览器可通过F12进行开发者模式。
      一条伪装头部的淘宝商品信息爬虫_第12张图片

    一条伪装头部的淘宝商品信息爬虫_第13张图片

    • 例如User-Agent:这块就说明了我们的浏览器属性等属性。
    • 敲黑板了,重点来了。上述说的Reuests Headers就会被网站进行识别进而判断这次请求是否合法,是否合法,是否合法!!!

      • 爬虫的默认的头部是极具爬虫特色的,也就是说默认的爬虫的首部是直接可以被服务器判断出来的。从而网站就可以对应做出应对的响应。
      • 而我们应该做的就是对头部的伪装,将爬虫伪装成为一个正常用户的普通浏览器访问。
      • 这边还涉及一个叫cookie的小家伙,这里我们可以大概的这样去理解,就是将一些个人信息存储于本地,因为http本身是无状态的。也就是上一次的http的下一次的是没有任何的关联的,而这对我们用户而言就是每次访问的页面和上次没有针对于我们个人的变化,这是很糟糕的。因为我们每次进入一个网站,就都会要求我们输入账户密码。而这一问的解决,即是cookie。将用户的状态存于本地,而在之后每次请求的时候都只需要带上这个cookie,而服务器对cookie进行检查校对,而做出针对性的响应。就省去了诸多麻烦。

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

1.获得正确的头部信息

  • 要获取一个正确的真实的头部,自然自己访问一次不就好了,这样不得不吹一下谷歌的开发者模式了,首先我先登陆网页淘宝,然后随便搜索一下关键字,再按F12进入开发者模式
  • 可以看到这个是一个具有cookie的首部
  • 一条伪装头部的淘宝商品信息爬虫_第14张图片
  • 然后我们导出这个首部
  • 一条伪装头部的淘宝商品信息爬虫_第15张图片 - 这里就要用到一个提取工具了:https://curl.trillworks.com/ 在左边粘贴,下面选择python即可得到整个信息,我们只需要提取出heades就行了。复制粘贴heades插入我们的变量
    一条伪装头部的淘宝商品信息爬虫_第16张图片
    一条伪装头部的淘宝商品信息爬虫_第17张图片
  • 最后在rquests.get()中添加header值就行了
    r = requests.get(url, headers=headers_var, timeout=30)

Run!

  • Perfect!

一条伪装头部的淘宝商品信息爬虫_第18张图片

总结一下:

- 网页的前期分析很重要,如果前期正确明晰,后面写代码基本不会有太大的问题。具体分析也就值得是对网页的结构分析,在这个例子即是我们如何去提取我们想要的信息,即是通过正则表达式去匹配。这只是一种方法,还有种方法即是通过Bs4库进行信息提取。
- 还有就是一些小知识的积累,总会在不经意间给你喜悦。
- 代码不能只注重于实现,还要有优化。

你可能感兴趣的:(Python:从入门到放弃)