我们[上一节]
零基础爬什么值得买的榜单——爬虫练习题目一(答三)
是拿到了一个商品的数据
按照流程下来
我们是时候
拿这一页的所有商品数据了
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("---------------------------------------------------")
我说原由:
我们从上节
知道数据的格式
就是data_dict[ ] [ ],是一个二维的数组
那么第一个for
遍历的就是第一维中的N种商品
这里方便的就是
N我们不需要知道,如果你硬要知道到
那么就是是len(data_dict)
就可以知道一维中有多少个商品了
下面的 product[ ]
就是从
第二维商品中的详细信息取出键对应的值
AI说知识:
该函数的功能是遍历一个字典data_dict,并将每个字典中的特定键值对存储在一个新的字典product_info中。然后打印出product_info字典的内容,并在每行末尾添加一个分隔线。
这段代码使用了以下几种方法和Python知识点:
for循环:
for
循环用于遍历序列(如列表、元组或字符串)或其他可迭代对象的元素。这里,它用于遍历一个字典数组 data_dict
中的每个商品对象。字典推导式(虽然此处不是推导式,但结构类似):
product_info
,该字典包含了从当前商品字典(product
)中提取的关键信息。尽管这里的字典是手动逐行构建的,但在其他情况下,如果结构更简单,可以使用字典推导式简化此过程。字典访问:
product["article_pic_url"]
,这是在获取数据字典中代表主图链接的值。变量赋值:
product_info
的相应键。打印输出:
print()
函数将 product_info
字典内容输出到控制台。这段代码的主要目的是遍历一个包含多个商品详细信息的JSON转化后的字典数组,并对每一个商品生成一个只包含关键信息的新字典,然后逐一打印这些精简后的商品信息,每条商品信息之间用分割线进行区分。
那么我们知道怎么拿
然
是否想过,要是有的商品有缺失值
那么又应该怎么办呢?
(当然作为一个正规的商品网站一般不会有,我们这里模拟的是一些可有可无值得时候,比如评论,有一些商品没有评论,那么你去爬取评论的内容,是不是有可能就缺失呢?)
那么这时候会发生什么事情呢?
假设一下商品的数据:
我们使其中一个
‘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("---------------------------------------------------")
运行后会发现
该错误提示表明在遍历products_data 中的产品字典时
尝试访问的键’article_comment’不存在
这意味着并非products_data 中每个子字典都包含这个键
因此在获取评论数量时出现了KeyError
看 多亏咱的小动作
试出这代码的不稳定了
那么我们应该如何修改呢?
很简单,用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("---------------------------------------------------")
运行后会发现
没问题了
且我们缺失的值,被补上0
看了代码,你大概知道为什么了
在Python中,列表(List)并没有内置的get()
方法。get()
方法是字典(Dictionary)的一个内建方法,而非列表的方法。
关于字典get()
方法的介绍:
原理:
get()
方法是用来获取字典中指定键对应的值。dict.get(key, default=None)
,其中key
是要查找的键,default
是一个可选参数,如果key
不存在于字典中,则返回这个默认值。作用:
get()
方法可以安全地从字典中获取一个键的值,即使该键可能不存在于字典中。dict[key]
会抛出KeyError
异常,而get()
方法则可以在键不存在时避免引发异常,并且可以选择提供一个默认值作为替代。对比优势:
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()了
那么
我