爬爬更健康

爬虫的定义

是一种按照一定规范自动获取网络信息的程序或脚本。 简单来说,网络爬虫就是根据一定的算法实现编程开发, 主要通过URL实现数据的抓取和发掘。

我们先来解决一下前置知识,本爬虫会用到以下库

  1. requests 是一个很实用Python的一个很实用的HTTP客户端需要
  2. json 用于数据的处理
  3. csv 用于数据的储存

分析说明

爬取淘宝商品的信息,数据主要用于分析市场趋势,从而制定一系列营销方案。实现功能如下:

  1. 使用者提供关键字,利用淘宝搜索功能获取搜索后的数据
  2. 获取商品信息:标题,价格,销量,店铺所在区域
  3. 数据以文件格式存储

功能实现依次体现了爬虫的开发流程:

爬虫规则->数据清洗->数据存储

使用谷歌浏览器进入淘宝网站,利用搜索的功能输入‘四件套’关键字, 使用浏览器的调试功能捕捉信息,如果在响应的HTML中找不到数据, 那么可能数据是通过Ajax请求后台的,再通过前端渲染到页面上去的, 单击XHR,发送一个请求,查看数据请求信息 接下来,我们单击Preview查看该URL的响应数据格式, 发现数据是JSON格式的,商品的标题,价格,销量, 店铺名称和店铺所在地点 分别对应的数据为rawtitle,viewprice,viewsales,nick,itemloc

我们把它的请求链接拿出来研究一下

https://s.taobao.com/api?_ksTS=1540176287763_226&callback=jsonp227&ajax=true&m=customized&sourceId=tb.index&_input_charset=utf-8&bcoffset=-1&commend=all&suggest=history_1&source=suggest&search_type=item&ssid=s5-e&suggest_query=&spm=a21bo.2017.201856-taobao-item.2&q=四件套&s=36&initiative_id=tbindexz_20170306&imgfile=&wq=&ie=utf8&rn=9e6055e3af9ce03b743aa131279aacfd

我们可以把这个长长的链接简化一下

https://s.taobao.com/api?callback=jsonp227&m=customized&q=%E5%9B%9B%E4%BB%B6%E5%A5%97&s=36

从简化后的URL看出,有两个参数可以动态设置来获取不同的商品

  1. q = 四件套 这个是搜索的关键字
  2. s = 36 这个是页数设置,

功能实现

根据对网站的分析获取单个关键字搜索的单页商品信息, 代码如下:

import requests
import json
url = "https://s.taobao.com/api?callback=jsonp227&m=customized&q=四件套&s=36"
r = requests.get(url)
response = r.text
# 截取成标准的JSON格式
# 由于Ajax返回的数据是字符串格式的饿,在返回的值jsonp227(XXX)中
# XXX部分是JSON格式数据,因此先用字符串split()截取XXX部分,
#然后将XXX部分由字符串格式转成JSON格式的数据读取
response = response.split('(')[1].split(')')[0]
# 读取JSON
response_dict = json.loads(response)
# 定位到商品信息列表
response_auctions_info = response_dict['API.CustomizedApi']['itemlist']['auctions']

如果想要获取多页数据,可以在上述的代码中加入一个循环,实现代码如下:

for p in range(88):
    url = "https://s.taobao.com/api?callback=jsonp227&m=customized&q=四件套&s=%s"%(p)
    r = requests.get(url)
    # 获取响应信息字符串
    response = r.text
    # 转换成JSON格式
    response = response.split('(')[1].split(')')[0]
    # 加载数据
    response_dict = json.loads(response)
    # 商品信息
    response_auctions_info = response_dict['API.CustomizedApi']['itemlist']['auctions']

上述代码只能获取单个关键字搜索的商品信息, 如果要实现多个关键字的功能呢,就可以在上述代码中在多加一个循环,代码如下:

for k in ['四件套','手机壳']:
    for p in range(88):
        url = "https://s.taobao.com/api?callback=jsonp227
&m=customized&q=%s&s=%s"  %(k,p)
        r = requests.get(url)
        response = r.text
        response = response.split('(')[1].split(')')[0]
        response_dict = json.loads(response)
        # 商品信息
        response_auctions_info = response_dict['API.CustomizedApi']['itemlist']['auctions']

数据存储

我们以CSV文件的格式存储数据,我们来定义一个函数,传入参数 分别为responseauctionsinfo数据集合信息, file_name保存的文件名:

def get_auctions_info(response_auctions_info,file_name):
    with open(file_name,'a',newline='') as csvfile:
        # 生成CSV对象,用于写入CSV文件
        writer = csv.writer(csvfile)
        for i in response_auctions_info:
            # 判断是否数据已经记录
            if str(i['raw_title']) not in auctions_distinct:
                # 写入数据
                # 分别是商品信息列表和CSV文件路径。
                # 但该文件并没有对CSV设置表头,所以在开始获取数据之前。
                # 应该生成对应CSV文件,并设定其表头
                writer.writerrow([i['raw_title'],i['view_price'],i['view_sales'],i['nick'],i['item_loc']])

                auctions_distinct.append(str(i['raw_title']))
        csvfile.close()

最后附上爬取结果图:

总结

  1. 去除无用的链接的参数,简化链接
  2. 分析URL请求参数含义以及响应内容数据规律
  3. 数据储存的去重判断

本文分享自微信公众号 - 志学Python(gh_755651538c61),作者:Ken

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Scrapy(7) Shell 研究

    Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网...

    公众号---志学Python
  • python爬虫scrapy模拟登录demo

    背景:初来乍到的pythoner,刚开始的时候觉得所有的网站无非就是分析HTML、json数据,但是忽略了很多的一个问题,有很多的网站为了反爬虫,除了需要高可用...

    公众号---志学Python
  • 爬虫 (十四) 可变类型和不可变类型 (七)

    我会以比较学习的方式,主要拿Python和我之前学习的javascript进行比较,拿学习javascript的学习经历来迁移到学习Python,如果你在此之前...

    公众号---志学Python
  • 返回用户指定页面的web服务器

    skylark
  • 面向对象封装的web服务器

    skylark
  • Response响应

    在去发送一个请求时,先会找到主机服务器再找到对应的Service,找到Servoce对应的引擎

    木瓜煲鸡脚
  • Java 通过网络流转发文件到浏览器

    本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

    IT小马哥
  • IOS Alamofire使用get获取数据

    用户5760343
  • IOS Alamofire使用Post获取数据

    用户5760343
  • 终极解决方案:org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has alr

    org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStr...

    庞小明

扫码关注云+社区

领取腾讯云代金券