python爬虫学习第十一篇爬取指定范例数据

打印 上一主题 下一主题

主题 845|帖子 845|积分 2535

最近在学习Python爬虫的过程中,实验用爬虫获取指定范例的数据。今天,我想和大家分享一下我的实践过程和遇到的问题。
一、实现目标

目标是从一个网站的API接口获取差别范例的食品数据。
比如,第一步我想获取汉堡、小食、甜品等差别范例的数据,
第二步根据用户输入的选择返回相应的效果。
二、代码实现

起首,我用到了requests库来发送HTTP请求。我界说了一个字典types,用来保存全部产物的关键字,这些关键字对应API接口需要的参数。然后,我通过用户输入选择对应的范例,并发送POST请求获取数据。
以下是代码示例:
第一步获取全部数据
  1. import requests
  2. url = 'https://example.com/api/data'
  3. # 使用列表保存所有产品的关键字 请求参数
  4. types = ['season', 'ham','snack', 'dessert', 'breakfirst','meats', 'coffee', 'happy_meal']
  5. # 循环列表,每循环一次,发起一个请求
  6. for type in types:
  7.     data = {
  8.     'type': type
  9.     }
  10.     res = requests.post(url, data=data)
  11.     res_data = res.json()
  12.         for k, v in res_data.items(): # 因为键会变化,所以不能够直接写死,要通过循环获取当前响应中的键
  13.             print('当前类型:----', k)
  14.             if v!= None:
  15.                 for i in v:
  16.                     print(i['FName'])
  17.                 else:
  18.                     print('没有内容')
复制代码
在这里的时候我遇到了报错,他提示有数据为空,然后我其时的处置处罚方式是同try,except情势行止置处罚 except就直接break了,
  1. try:
  2.     for i in v:
  3.     print(i['FName'])
  4. except:
  5.     break
复制代码
 这里是上篇博客处置处罚报错的方式,报错就直接退出,但是这里这么写会导致获取停止反面的信息就不获取了,把break改成print(“没有内容”),如许就可以了。
上面代码写的是使用判断语句行止置处罚报错,由于如果他网页内容输出不是none而是一个空【】那么网页是不会报错的,他还会循环下去,这时候就需要用判断条件行止置处罚列表为空的情况了
第二步
  1. import requests
  2. # 目标URL
  3. url = 'https://example.com/api/data'#示例代码
  4. # 使用字典保存所有产品的关键字请求参数
  5. types = {
  6.     '季节新品': 'season',
  7.     '汉堡': 'ham',
  8.     '小食': 'snack',
  9.     '甜品': 'dessert',
  10.     '早餐': 'breakfast',
  11.     '饮料': 'meats',  # 注意:这里可能是参数错误,饮料应该是 'drink'
  12.     '咖啡': 'coffee',
  13.     '儿童餐': 'happy_meal',
  14. }
  15. # 结合用户输入选择对应的类型
  16. name = input(f"请输入你要获取的菜单:{','.join(list(types.keys()))} ")
  17. # 判断当前用户输入的内容是否属于菜单的一种
  18. if name in types:
  19.     # 从字典中取出关键字
  20.     data = {
  21.         'type': types[name]
  22.     }
  23.     # 发起POST请求
  24.     res = requests.post(url, data=data)
  25.     res_data = res.json()
  26.     # 解析数据:注意键不同,不能直接写死
  27.     for k, v in res_data.items():
  28.         print('当前类型:----', k)
  29.         if v is not None:  # 如果v不为None,执行for循环
  30.             for i in v:
  31.                 print(i['FName'])
  32.         else:
  33.             print('没有内容')
  34. else:
  35.     print('没有这个选择')
复制代码
问题一

在写代码的时候,我一直在琢磨怎么让用户输入的内容和我界说的选项匹配起来。究竟,我需要判断用户输入的是否是我提供的那些选项之一。比如,用户输入了一个食品范例,我得确认这个范例是不是在我的列表里。
一开始,我有点犯难,不知道该怎么实现。后来,我想到了一个好办法:可以用 in 关键字来判断!我让用户输入的内容赋值给一个变量,然后用 in 来查抄这个变量是否在我的选项列表里。如果匹配上了,就继承往下实行代码;如果对不上,就直接告诉用户“没有这个选项”。
这个方法既简朴又实用,一下子就办理了我的问题。
问题二

当我想要把全部可选的分类信息展示给用户时,我忽然卡住了。我有一个字典保存了全部的分类,但我不知道怎么把里面的分类名称取出来展示给用户。一开始,我实验直接打印字典的内容,但效果看起来很乱,还带着中括号和引号,一点都不美观。
后来,我忽然想起可以用 .keys() 方法来提取字典中的键(也就是分类名称)。但是,.keys() 返回的效果是一个字典视图对象,看起来还是不太友好。于是,我把它转换成了一个列表,如许看起来就清楚多了。不过,列表表面还是会带中括号,这让我觉得还是不够完善。
末了,我灵机一动,用到了 .join() 方法。我把列表转换成了一个用逗号分隔的字符串,如许中括号就不见了,输出效果变得非常美观。

三、总结

通过这次实践,我不仅学会了怎样用爬虫获取指定范例的数据,还学会了怎样处置处罚网络请求中可能出现的问题。固然遇到了一些挫折,但这些问题也让我更加深刻地明白了爬虫开发的复杂性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表