美文网首页
第3关 BeautifulSoup实践

第3关 BeautifulSoup实践

作者: 夕颜00 | 来源:发表于2020-07-09 17:30 被阅读0次

1、项目:解密吴氏私厨

1-1、确定目标

(1)目标网站:http://www.xiachufang.com/explore/

(2)网站协议:http://www.xiachufang.com/robots.txt(目标网站 + robots.txt 可查看目标网站的页面爬取许可);

(3)项目目标:爬取热门菜谱清单,内含:菜名、原材料、详细烹饪流程的URL。

1-2、过程分析

(1)确定数据位置

  • 菜名、所需材料、和菜名所对应的详情页URL均在 html 页面上;

  • 获取数据用 requests.get() ;

  • 解析数据用 BeautifulSoup。

image.png

(2)提取数据

  • 【windows】:在网页的空白处点击右键,然后选择“检查”(快捷方式是ctrl+shift+i),再在 Elements 页面按 ctrl+f;
  • 【mac】:在网页的空白处点击右键,然后选择“检查”(快捷键 command + option + I(大写i));
image.png
  • 点击【检查】页面左上角的 “鼠标” 按钮,再点击后右侧想要获取的内容可以定位到该内容对应的标签;
image.png

1-3、代码实现(一)

1-3-1、数据获取

requests.get() 获取数据,BeautifulSoup 解析数据。

import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

print(bs_foods)

# 打印解析结果

1-3-2、提取最小父级标签

根据我们【过程分析】中所有菜谱的共同标签 class_='info pure-u',我们用 find_all 获取所有菜谱(find_all 获取后返回的是一个列表),下面我们提取出第0个父级标签中的第0个<a>标签,并输出菜名和URL:

import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

list_foods = bs_foods.find_all('div',class_='info pure-u')

# 查找最小父级标签

print(list_foods)

# 打印最小父级标签
  1. 提取菜名

依旧是根据我们的内容定位我们的标签,可以找到菜名是在我们的标签 a 中,再用 text 取到该标签对应的菜名。

image.png
import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

list_foods = bs_foods.find_all('div',class_='info pure-u')

# 查找最小父级标签

tag_a = list_foods[0].find('a')

# 提取第0个父级标签中的<a>标签

print(tag_a.text[17:-13])

# 输出菜名,使用[17:-13]切掉了多余的信息
  1. 提取 URL

我们发现在标签 a 后面的 href 有我们需要的链接,但是不完整,所以需要拼接后才能得到我们要的菜谱 URL。

import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

list_foods = bs_foods.find_all('div',class_='info pure-u')

# 查找最小父级标签

tag_a = list_foods[0].find('a')

# 提取第0个父级标签中的<a>标签

print('http://www.xiachufang.com'+tag_a['href'])

# 拼接后输出URL
  1. 提取食材

我们可以看到我们的食材是在 p 中,但是只靠这个是不够的的,所以我们要精确取值,可以看到食材对应的 class 属性为 ing ellipsis。

image.png
import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

list_foods = bs_foods.find_all('div',class_='info pure-u')

# 查找最小父级标签

tag_p = list_foods[0].find('p',class_='ing ellipsis')

# 提取第0个父级标签中的<p>标签

ingredients = tag_p.text[1:-1]

# 食材,使用[1:-1]切掉了多余的信息

print(ingredients)

# 打印食材

1-3-3、写循环,存列表

import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

list_foods = bs_foods.find_all('div',class_='info pure-u')

# 查找最小父级标签

list_all = []

# 创建一个空列表,用于存储信息

for food in list_foods:

 tag_a = food.find('a')

 # 提取第0个父级标签中的<a>标签

 name = tag_a.text[17:-13]

 # 菜名,使用[17:-13]切掉了多余的信息

 URL = 'http://www.xiachufang.com'+tag_a['href']

 # 获取URL

 tag_p = food.find('p',class_='ing ellipsis')

 # 提取第0个父级标签中的<p>标签

 ingredients = tag_p.text[1:-1]

 # 食材,使用[1:-1]切掉了多余的信息

 list_all.append([name,URL,ingredients])

 # 将菜名、URL、食材,封装为列表,添加进list_all

print(list_all)

# 打印

1-4、代码实现(二)

创建一个空列表,启动循环,循环长度等于 <p> 标签的总数——我们可以借助 range(len()) 语法。

import requests

# 引用requests库

from bs4 import BeautifulSoup

# 引用BeautifulSoup库

res_foods = requests.get('http://www.xiachufang.com/explore/')

# 获取数据

bs_foods = BeautifulSoup(res_foods.text,'html.parser')

# 解析数据

tag_name = bs_foods.find_all('p',class_='name')

# 查找包含菜名和URL的<p>标签

tag_ingredients = bs_foods.find_all('p',class_='ing ellipsis')

# 查找包含食材的<p>标签

list_all = []

# 创建一个空列表,用于存储信息

for x in range(len(tag_name)):

# 启动一个循环,次数等于菜名的数量

 list_food = [tag_name[x].text[18:-14],tag_name[x].find('a')['href'],tag_ingredients[x].text[1:-1]]

 # 提取信息,封装为列表。注意此处[18:-14]切片和之前不同,是因为此处使用的是<p>标签,而之前是<a>

 list_all.append(list_food)

 # 将信息添加进list_all

print(list_all)

# 打印

相关文章

  • 第3关 BeautifulSoup实践

    1、项目:解密吴氏私厨 1-1、确定目标 (1)目标网站:http://www.xiachufang.com/ex...

  • 第3关 BeautifulSoup实践【课后习题】

    一、第一题 需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下来,结果就是全部展示打印出...

  • BeautifulSoup实践(3)

    项目目标: 爬取热门菜谱清单,获取菜名、原材料和详细烹饪流程的URL 步骤与思路: 第一:打开网址,查阅robot...

  • 第2关 BeautifulSoup

    1、BeautifulSoup 是什么 解析和提取网页中的数据: (1)解析数据:把服务器返回来的 HTML 源代...

  • 啊哈编程星球-第1章-完善版

    第1关: 1行 第2关: 3行 第3关: 3行 第4关: 5行 第5关: 9行 第6关: 4行 第7关: 10行 ...

  • 第1关 BeautifulSoup 【课后习题】

    一、题目1: 你需要爬取的是博客【人人都是蜘蛛侠】中,《未来已来(四)——Python学习进阶图谱》文章的默认评论...

  • 啊哈编程星球-第1章-学习版

    第1关: 3行 第2关: 7行 第3关: 7行 第4关: 5行 第5关: 11行 第6关: 4行 第7关: 12行...

  • 孤荷凌寒自学python第七十天学习并实践beautifulso

    孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3 (完整学习过程屏幕记录视频地址在文...

  • 爬虫2

    爬虫之 beautifulsoup BeautifulSoup3目前已经停止开发,推荐现在的项目使用Beautif...

  • 爬虫

    爬虫之 beautifulsoup BeautifulSoup3目前已经停止开发,推荐现在的项目使用Beautif...

网友评论

      本文标题:第3关 BeautifulSoup实践

      本文链接:https://www.haomeiwen.com/subject/zgmscktx.html