利用bs4爬取资料信息
bs4解析-HTML语法
bs4解析比较简单,但是呢,首先你需要了解一下html知识,然后再去使用bs4去提取,逻辑和编写难度就会非常简单和清晰
HTML(Hyper Text Markup Language)超文本标记语言,是我们编写网页的最基本也是最核心的一种语言.其语法规则就是用不同的标签对网页上的内容进行标记,从而使网页显示出不同的展示效果。
<h1>我爱放假</h1>
上述代码的含义是在页面中显示"我爱放假"四个字,但是被" <h1>"和"</h1>"
" 标记了。白话就是被括起来了被H1这个标签括起来了,这个时候浏览器在展示的时候就会让字体变粗变大,俗称标题,所以HTML的语法就是用似这样的标签对页面内容进行标记,不同的标签表现出来的效果也是不一样的。
h1:一级标题
h2:二级标题
p:段落
body:主体
这里简单科普一下,其实HTML标签还有很多很多的,我们不需要一一列举。
一、安装bs
- pip install bs4
或requests安装方式那样安装
二、bs4介绍
-
BeautifulSoup4(简称bs4)是一个强大的Python库,专门用于解析HTML和XML文档。它可以非常方便地从结构复杂、格式不规范的网页源代码中提取出有用的数据。以下是对BeautifulSoup4主要功能和特性的介绍:
-
1、解析功能:
- BS4能够接受各种形式的输入,如字符串形式的HTML或XML文本,或者已经读取好的文件。
- 它利用内置的解析器(如Python标准库的html.parser,或者第三方库如lxml)将这些文本转化为复杂的树状结构,即DOM树(Document Object Model),使得开发者可以通过编程方式操作和访问页面元素。
-
2、易用性:
- 提供了一套简单直观的API,允许用户通过标签名、CSS选择器或属性值来查找、定位和筛选网页元素。
- 可以处理文档的各种异常情况,比如缺失结束标签、嵌套错误等,尽可能还原出文档结构。
-
3、数据提取:
- find()和find_all()是最常用的两个方法,分别用于查找文档中第一个匹配特定条件的元素和所有匹配的元素集合。
- 可以获取标签名、属性以及标签内的文本内容,甚至可以递归地遍历整个文档树以抽取深层嵌套的数据。
-
4、灵活性:
- 支持多种搜索方法,包括基于标签、类名、ID、属性等进行精确或模糊匹配。
- 结合Python语言本身的强大功能,可以编写高效灵活的脚本来批量处理大量网页数据。
-
总之,对于网络爬虫开发者而言,BeautifulSoup4是一个不可或缺的工具,它简化了网页抓取和数据提取的过程,极大地提高了数据清洗和预处理的效率。
三、案例介绍
案例1:下载https://home.meishichina.com/recipe/recai/网站的菜谱信息
- 编写代码
from bs4 import BeautifulSoup
import requests
url = "https://home.meishichina.com/recipe/recai/"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"
}
resp = requests.get(url,headers=headers)
#print(resp.text)
#解析数据
#1、把页面源代码交给bs4进行处理,生成bs对象
page = BeautifulSoup(resp.text,"html.parser")#制定html解析器
#2、从bs对象中找到数据
#find(标签,属性=值)
#find_all(标签,属性=值)
#div = page.find("div",class_="ui_newlist_1 get_num") #class是python的关键字
div1 = page.find("div",attrs={"class":"ui_newlist_1 get_num"})#和上一行是一样的意思,此时可以避免class
#print(div1)
#找到数据所在的li标签,返回的是多个
lis = div1.find_all("li")
count = 0;
for li in lis:
h2 = li.find_all("a")
p = li.find_all("p")
try :
title = h2[1].text
author = h2[2].text
con = p[1].text
print(title,"---",author,"---",con)
except IndexError as e:
print("异常")
- 运行结果
案例2:下载https://movie.douban.com/celebrity/1315477/photos/里面的图片 - 编写代码
import requests
from bs4 import BeautifulSoup
url = "https://movie.douban.com/celebrity/1315477/photos/"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"
}
resp = requests.get(url,headers=headers)
#创建bs对象
page = BeautifulSoup(resp.text,"html.parser")
#查找数据
data = page.find_all("ul",class_="poster-col3 clearfix")
count = 0
plist = None
for d in data:
plist = d.find_all("img")
for img in plist:
#通过[属性名]拿属性值
print(img["src"])
imgLink = img["src"]
#下载图片 并保存
imgName = imgLink.split("/")[-1]
imgContent = requests.get(imgLink)
with open(imgName,"wb") as f:
f.write(imgContent.content)#要写的内容
resp.close()
- 运行结果
- 爬取到的图片如下: