python爬虫学习第十一篇爬取指定类型数据

news/2025/2/26 16:34:47

最近在学习Python爬虫的过程中,尝试用爬虫获取指定类型的数据。今天,我想和大家分享一下我的实践过程和遇到的问题。

一、实现目标

目标是从一个网站的API接口获取不同类型的食品数据。

比如,第一步我想获取汉堡、小食、甜品等不同类型的数据,

第二步根据用户输入的选择返回相应的结果。

二、代码实现

首先,我用到了requests库来发送HTTP请求。我定义了一个字典types,用来保存所有产品的关键字,这些关键字对应API接口需要的参数。然后,我通过用户输入选择对应的类型,并发送POST请求获取数据。

以下是代码示例:

第一步获取所有数据

import requests
url = 'https://example.com/api/data'
# 使用列表保存所有产品的关键字 请求参数
types = ['season', 'ham','snack', 'dessert', 'breakfirst','meats', 'coffee', 'happy_meal']
# 循环列表,每循环一次,发起一个请求
for type in types:
    data = {
    'type': type
    }
    res = requests.post(url, data=data)
    res_data = res.json()
        for k, v in res_data.items(): # 因为键会变化,所以不能够直接写死,要通过循环获取当前响应中的键
            print('当前类型:----', k)
            if v!= None:
                for i in v:
                    print(i['FName'])
                else:
                    print('没有内容')

在这里的时候我遇到了报错,他提示有数据为空,然后我当时的处理方式是同try,except形式去处理 except就直接break了,

try:
    for i in v:
    print(i['FName'])
except:
    break

 这里是上篇博客处理报错的方式,报错就直接退出,但是这里这么写会导致获取中断后面的信息就不获取了,把break改成print(“没有内容”),这样就可以了。

上面代码写的是使用判断语句去处理报错,因为如果他网页内容输出不是none而是一个空【】那么网页是不会报错的,他还会循环下去,这时候就需要用判断条件去处理列表为空的情况了

第二步

import requests

# 目标URL
url = 'https://example.com/api/data'#示例代码

# 使用字典保存所有产品的关键字请求参数
types = {
    '季节新品': 'season',
    '汉堡': 'ham',
    '小食': 'snack',
    '甜品': 'dessert',
    '早餐': 'breakfast',
    '饮料': 'meats',  # 注意:这里可能是参数错误,饮料应该是 'drink'
    '咖啡': 'coffee',
    '儿童餐': 'happy_meal',
}

# 结合用户输入选择对应的类型
name = input(f"请输入你要获取的菜单:{','.join(list(types.keys()))} ")

# 判断当前用户输入的内容是否属于菜单的一种
if name in types:
    # 从字典中取出关键字
    data = {
        'type': types[name]
    }
    # 发起POST请求
    res = requests.post(url, data=data)
    res_data = res.json()

    # 解析数据:注意键不同,不能直接写死
    for k, v in res_data.items():
        print('当前类型:----', k)
        if v is not None:  # 如果v不为None,执行for循环
            for i in v:
                print(i['FName'])
        else:
            print('没有内容')
else:
    print('没有这个选择')
问题一

在写代码的时候,我一直在琢磨怎么让用户输入的内容和我定义的选项匹配起来。毕竟,我需要判断用户输入的是否是我提供的那些选项之一。比如,用户输入了一个食品类型,我得确认这个类型是不是在我的列表里。

一开始,我有点犯难,不知道该怎么实现。后来,我想到了一个好办法:可以用 in 关键字来判断!我让用户输入的内容赋值给一个变量,然后用 in 来检查这个变量是否在我的选项列表里。如果匹配上了,就继续往下执行代码;如果对不上,就直接告诉用户“没有这个选项”。

这个方法既简单又实用,一下子就解决了我的问题。

问题二

当我想要把所有可选的分类信息展示给用户时,我突然卡住了。我有一个字典保存了所有的分类,但我不知道怎么把里面的分类名称取出来展示给用户。一开始,我尝试直接打印字典的内容,但结果看起来很乱,还带着中括号和引号,一点都不美观。

后来,我突然想起可以用 .keys() 方法来提取字典中的键(也就是分类名称)。但是,.keys() 返回的结果是一个字典视图对象,看起来还是不太友好。于是,我把它转换成了一个列表,这样看起来就清晰多了。不过,列表外面还是会带中括号,这让我觉得还是不够完美。

最后,我灵机一动,用到了 .join() 方法。我把列表转换成了一个用逗号分隔的字符串,这样中括号就不见了,输出结果变得非常美观。

三、总结

通过这次实践,我不仅学会了如何用爬虫获取指定类型的数据,还学会了如何处理网络请求中可能出现的问题。虽然遇到了一些挫折,但这些问题也让我更加深刻地理解了爬虫开发的复杂性。


http://www.niftyadmin.cn/n/5868937.html

相关文章

ROS的action通信——实现阶乘运算(三)

在ROS中除了常见的话题(topic)通信、服务(server)通信等方式,还有action通信这一方式,由于可以实时反馈任务完成情况,该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享,实现基于action通信的阶乘运…

Linux 第三次脚本作业

源码编译安装httpd 2.4,提供系统服务管理脚本并测试(建议两种方法实现) 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了) 3、解压httpd包 4、解压后的httpd包的文…

【前端基础】Day 1 HTML

总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

【前沿探索篇九】【DeepSeek具身智能:机器人操作学习框架】

第一章 具身智能的"五感觉醒" 1.1 多模态感知的神经交响乐 我们的多模态编码器就像机器人的大脑皮层,把不同传感器数据拧成一股绳: class MultimodalEncoder(nn.Module):def __init__(self):sel

电脑不能正常启动了怎么办?查看解决方法

电脑是我们日常生活和工作中不可缺少的工具,但有时候我们可能会遇到电脑不能正常启动的问题,这会给我们带来很多麻烦和困扰。那么,电脑不能正常启动的原因有哪些,又该如何解决呢?本文将为你介绍几种常见的情况和对应的…

STM32【3】芯片的底层组成概论

关于单片机的组成 单片机的意思是,小小计算电脑,麻雀虽小,五脏俱全,里面包含了CPU,ROM,RAM,各种外设。 CPU地位最高,可以访问ROM和RAM,Flash,GPIO等外设&…

面试基础----ReentrantLock vs Synchronized

ReentrantLock vs Synchronized:源码级解析与高并发场景下的锁博弈 引言:多线程编程中的锁为何重要? 业务背景:北京互联网大厂的高并发场景(如电商秒杀、支付交易、实时推荐系统)对线程安全和性能的极致要…

医疗UI的特殊法则:复杂数据可视化的“零错误”设计守则

在当今医疗技术日新月异的时代,医疗UI设计不仅关乎用户体验,更直接关联到患者的生命健康。尤其是在处理复杂数据时,如何确保可视化的准确性和无误性,成为医疗UI设计的一大挑战。以下,我们将深入探讨医疗UI在复杂数据可…