零基础爬什么值得买的榜单——爬虫练习题目一(答四)

你猜中了吗?

    • 引言
    • 添加代码
    • 优化代码
      • 测试代码
      • 改进代码
    • 详细讲解
      • 字典中的Get()方法
      • 示例代码:
    • 结尾

引言

我们[上一节]
零基础爬什么值得买的榜单——爬虫练习题目一(答三)
是拿到了一个商品的数据
按照流程下来
我们是时候
拿这一页的所有商品数据了
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第1张图片

添加代码

for product in data_dict:
    product_info = {
        "main_pic_url": product["article_pic_url"],  # 主图链接
        "platform": product["article_mall"],  # 平台名称
        "title": product["article_title"],  # 商品标题
        "price": product["article_price"],  # 商品价格
        "comment_count": product["article_comment"],  # 评论数量
        "link": product["article_link"],  # 商品链接
    }
    print(product_info)
    print("---------------------------------------------------")

完整的代码后面给出
我们先来捋捋这部分代码
其中学问不少
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第2张图片

且可以优化
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第3张图片

我说原由:
我们从上节
知道数据的格式
就是data_dict[ ] [ ],是一个二维的数组
那么第一个for
遍历的就是第一维中的N种商品
这里方便的就是
N我们不需要知道,如果你硬要知道到
那么就是是len(data_dict)就可以知道一维中有多少个商品了
下面的 product[ ] 就是从
第二维商品中的详细信息取出键对应的值
AI说知识:
该函数的功能是遍历一个字典data_dict,并将每个字典中的特定键值对存储在一个新的字典product_info中。然后打印出product_info字典的内容,并在每行末尾添加一个分隔线。

这段代码使用了以下几种方法和Python知识点:

  1. for循环

    • Python中的for循环用于遍历序列(如列表、元组或字符串)或其他可迭代对象的元素。这里,它用于遍历一个字典数组 data_dict 中的每个商品对象。
  2. 字典推导式(虽然此处不是推导式,但结构类似)

    • 在每次循环中,代码创建了一个新的字典 product_info,该字典包含了从当前商品字典(product)中提取的关键信息。尽管这里的字典是手动逐行构建的,但在其他情况下,如果结构更简单,可以使用字典推导式简化此过程。
  3. 字典访问

    • 通过键来访问字典内的值,例如:product["article_pic_url"],这是在获取数据字典中代表主图链接的值。
  4. 变量赋值

    • 将提取出的商品属性值分别赋给新字典 product_info 的相应键。
  5. 打印输出

    • 使用 print() 函数将 product_info 字典内容输出到控制台。
    • 每次输出后打印分割线(“---------------------------------------------------”),以清晰区分不同商品的信息。

这段代码的主要目的是遍历一个包含多个商品详细信息的JSON转化后的字典数组,并对每一个商品生成一个只包含关键信息的新字典,然后逐一打印这些精简后的商品信息,每条商品信息之间用分割线进行区分。

优化代码

那么我们知道怎么拿

是否想过,要是有的商品有缺失值
那么又应该怎么办呢?
(当然作为一个正规的商品网站一般不会有,我们这里模拟的是一些可有可无值得时候,比如评论,有一些商品没有评论,那么你去爬取评论的内容,是不是有可能就缺失呢?)
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第4张图片

那么这时候会发生什么事情呢?
假设一下商品的数据:
我们使其中一个

‘article_comment’

去掉

# 多个商品数据(用列表存储)
products_data = [
    {
        'article_pic_url': 'https://qny.smzdm.com/202402/02/65bc83f8af9388486.jpg_d200.jpg',
        'article_mall': '京东',
        'article_title': 'Apple 苹果 Vision Pro苹果VR眼镜',
        'article_price': '35999元',
        #'article_comment': 22,
        'article_link': 'https://go.smzdm.com/bab24c22d39154f0/ca_aa_yh_163_103679023_0_1687_4939_0',
    },
    {'article_pic_url': 'https://y.zdmimg.com/202402/02/65bc647ca58705354.png_d200.jpg', 
     'article_mall': '京东', 
     'article_title': '泰坦军团 P27A6R 27英寸Mini-LED显示器(2560*1440、180Hz、97%DCI-P3、HDR1000)', 
     'article_price': 'NA', 
     'article_comment': '63', 
     'article_link': 'https://go.smzdm.com/53d3cb7c92774e06/ca_aa_yh_163_103670473_16907_40664_1519_0'
     }
    # 添加更多商品...
]

测试代码

# 多个商品数据(用列表存储)
products_data = [
    {
        'article_pic_url': 'https://qny.smzdm.com/202402/02/65bc83f8af9388486.jpg_d200.jpg',
        'article_mall': '京东',
        'article_title': 'Apple 苹果 Vision Pro苹果VR眼镜',
        'article_price': '35999元',
        #'article_comment': 22,
        'article_link': 'https://go.smzdm.com/bab24c22d39154f0/ca_aa_yh_163_103679023_0_1687_4939_0',
    },
    {'article_pic_url': 'https://y.zdmimg.com/202402/02/65bc647ca58705354.png_d200.jpg', 
     'article_mall': '京东', 
     'article_title': '泰坦军团 P27A6R 27英寸Mini-LED显示器(2560*1440、180Hz、97%DCI-P3、HDR1000)', 
     'article_price': 'NA', 
     'article_comment': '63', 
     'article_link': 'https://go.smzdm.com/53d3cb7c92774e06/ca_aa_yh_163_103670473_16907_40664_1519_0'
     }
    # 添加更多商品...
]

for product in products_data:
    product_info = {
        "main_pic_url": product["article_pic_url"],  # 主图链接
        "platform": product["article_mall"],  # 平台名称
        "title": product["article_title"],  # 商品标题
        "price": product["article_price"],  # 商品价格
        "comment_count": product["article_comment"],  # 评论数量
        "link": product["article_link"],  # 商品链接
    }
    print(product_info)
    print("---------------------------------------------------")

运行后会发现
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第5张图片
该错误提示表明在遍历products_data 中的产品字典时
尝试访问的键’article_comment’不存在
这意味着并非products_data 中每个子字典都包含这个键
因此在获取评论数量时出现了KeyError
看 多亏咱的小动作
试出这代码的不稳定了
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第6张图片

那么我们应该如何修改呢?
很简单,用get函数

改进代码

# 多个商品数据(用列表存储)
products_data = [
    {
        'article_pic_url': 'https://qny.smzdm.com/202402/02/65bc83f8af9388486.jpg_d200.jpg',
        'article_mall': '京东',
        'article_title': 'Apple 苹果 Vision Pro苹果VR眼镜',
        'article_price': '35999元',
        #'article_comment': 22,
        'article_link': 'https://go.smzdm.com/bab24c22d39154f0/ca_aa_yh_163_103679023_0_1687_4939_0',
    },
    {'article_pic_url': 'https://y.zdmimg.com/202402/02/65bc647ca58705354.png_d200.jpg', 
     'article_mall': '京东', 
     'article_title': '泰坦军团 P27A6R 27英寸Mini-LED显示器(2560*1440、180Hz、97%DCI-P3、HDR1000)', 
     'article_price': 'NA', 
     'article_comment': '63', 
     'article_link': 'https://go.smzdm.com/53d3cb7c92774e06/ca_aa_yh_163_103670473_16907_40664_1519_0'
     }
    # 添加更多商品...
]

for product in products_data:
    product_info = {
        "main_pic_url": product.get("article_pic_url", ""),
        "platform": product.get("article_mall", ""),
        "title": product.get("article_title", ""),
        "price": product.get("article_price", ""),
        "comment_count": product.get("article_comment", 0),
        "link": product.get("article_link", "")
    }
    print(product_info)
    print("---------------------------------------------------")

运行后会发现
零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第7张图片
没问题了
且我们缺失的值,被补上0
看了代码,你大概知道为什么了

详细讲解

字典中的Get()方法

在Python中,列表(List)并没有内置的get()方法。get()方法是字典(Dictionary)的一个内建方法,而非列表的方法。
关于字典get()方法的介绍:

  1. 原理

    • 字典的get()方法是用来获取字典中指定键对应的值。
    • 它的基本语法是 dict.get(key, default=None),其中key是要查找的键,default是一个可选参数,如果key不存在于字典中,则返回这个默认值。
  2. 作用

    • 通过get()方法可以安全地从字典中获取一个键的值,即使该键可能不存在于字典中。
    • 当你尝试访问字典中可能不存在的键时,直接使用方括号dict[key]会抛出KeyError异常,而get()方法则可以在键不存在时避免引发异常,并且可以选择提供一个默认值作为替代。
  3. 对比优势

    • 异常处理:使用dict.get(key)相比直接用dict[key]更具有容错性,因为它不会因为找不到键而抛出异常,而是返回None或自定义的默认值。
    • 简洁性:对于那些可能不存在的键,不需要编写额外的异常处理代码来确保程序正常运行。
    • 灵活性:可以根据需求动态设置一个合理的默认值,以满足不同场景下的逻辑需求。

示例代码:

# 创建一个字典
my_dict = {'name': 'Alice', 'age': 30}

# 使用 get 方法获取键为 'name' 的值,若键不存在则返回 None
name = my_dict.get('name')  # 返回 'Alice'

# 使用 get 方法并设置默认值
job = my_dict.get('job', 'Engineer')  # 因为 'job' 键不存在,所以返回 'Engineer'

结尾

这节课的进度
我们从上节的一个商品
进阶到了整页的全部商品
这节课的知识点
我们从获取的字典中
学习到了不同于列表的方法
以后遇到字典找键值就知道用get()
而不是容错率更低的dicr[ ]
下节课
想必你已经从上节课
GET()了
那么

零基础爬什么值得买的榜单——爬虫练习题目一(答四)_第8张图片

你可能感兴趣的:(Python代码实例,AI,编程,爬虫,数据库,python,什么值得买,字典)