bs4简介
bs4是Python的一个第三方库,主要用于从HTML或者是XML文档中快速提取数据。bs4是BeautifuiSoup库的简称,最后的4是版本号。
bs4安装命令为:pip install bs4
安装完毕后,在 Python程序中导入时,可添加代码:from bs4 import BeautifulSoup
函数:
1、find(标签,属性=值):只查找一个
2、find_all(标签,属性=值):查找所有
案例1
需求: 爬取北京新发地市场网站的菜价
网页如下:
页面源代码如下:
操作思路:
1、拿到网页源代码;
2、使用bs4进行解析,拿到数据;
代码如下:
ini
from bs4 import BeautifulSoup
import requests
url = "http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml"
resp = requests.get(url)
# print(resp.text)
# 解析数据
# 1.把页面源代码交给BeautifulSoup进行处理,生成bs对象
page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器:html.parser
# 2.从bs对象中查找数据
# find(标签,属性=值)
# find_all(标签,属性=值)
# table = page.find("table", class_="hq_table") # class是python的关键字,class_为了区分关键字,否则报错
table = page.find("table", attrs={"class": "hq_table"}) # 意思同上
# 拿到所有的数据行,做切片,做切片的目的是去掉表头
trs = table.find_all("tr")[1:]
for tr in trs: # 每一行
tds = tr.find_all("td") # 拿到每行中的所有列
name = tds[0].text # .text表示拿到被标签标记的内容
low_price = tds[1].text
avg = tds[2].text
high_price = tds[3].text
norms = tds[4].text
unit = tds[5].text
date = tds[6].text
print(name, low_price, avg, high_price, norms, unit, date)
运行结果:
出现以上结果就成功了,我们现在可以把爬取到的数据写入到文件中
增加写入文件后的代码如下:
ini
from bs4 import BeautifulSoup
import requests
import csv
url = "http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml"
resp = requests.get(url)
# print(resp.text)
f = open("菜价.csv", mode="w", encoding="utf-8")
csvwriter = csv.writer(f)
# 解析数据
# 1.把页面源代码交给BeautifulSoup进行处理,生成bs对象
page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器:html.parser
# 2.从bs对象中查找数据
# find(标签,属性=值)
# find_all(标签,属性=值)
# table = page.find("table", class_="hq_table") # class是python的关键字,class_为了区分关键字,否则报错
table = page.find("table", attrs={"class": "hq_table"}) # 意思同上
# 拿到所有的数据行,做切片,做切片的目的是去掉表头
trs = table.find_all("tr")[1:]
for tr in trs: # 每一行
tds = tr.find_all("td") # 拿到每行中的所有列
name = tds[0].text # .text表示拿到被标签标记的内容
low_price = tds[1].text
avg = tds[2].text
high_price = tds[3].text
norms = tds[4].text
unit = tds[5].text
date = tds[6].text
# print(name, low_price, avg, high_price, norms, unit, date)
csvwriter.writerow([name, low_price, avg, high_price, norms, unit, date])
print("over!")
运行结果:
案例2
需求:
爬取www.qqtn.com/tp/wmtp_3.h... 这个唯美图片网站上的图片并得到下载地址
主页面网页如下:
主页面的页面源代码如下
子页面网页如下:
子页面的页面源代码如下:
操作思路:
1、拿到主页面的页面源代码,然后提取子页面的链接地址,href;
2、通过href拿到子页面的内容,从子页面中找到图片的下载地址img → src;
3、下载图片;
代码如下:
ini
# 1、拿到主页面的页面源代码,然后提取子页面的链接地址,href;
# 2、通过href拿到子页面的内容,从子页面中找到图片的下载地址img → src;
# 3、下载图片;
import requests
from bs4 import BeautifulSoup
import time
url = "https://www.qqtn.com/tp/wmtp_3.html"
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"}
resp = requests.get(url=url, headers=header) # 添加headers处理反爬虫
resp.encoding = "gb2312" # 处理乱码问题
# print(resp.text)
# 把源代码交给bs
main_page = BeautifulSoup(resp.text, "html.parser")
# 找到包含href的所有a标签
alist = main_page.find("ul", class_="g-gxlist-imgbox").find_all("a")
# print(alist)
for a in alist:
# print(a.get("href")) # 直接通过get就可以拿到属性值,打印到控制台可以查看
href = "https://www.qqtn.com" + a.get("href") # 直接取到的href是没有域名的,我们需要拼接上域名
# 拿到子页面的源代码
child_page_resp = requests.get(url=href, headers=header)
child_page_resp.encoding = "gb2312" # 处理乱码问题
child_page_text = child_page_resp.text
# 从子页面中拿到图片的下载路径
chlid_page = BeautifulSoup(child_page_text, "html.parser")
imglist = chlid_page.find("div", id="zoom").find_all("img")
for i in imglist:
# 获取到子页面的所有图片下载地址
src = i.get("src")
# 下载图片
img_resp = requests.get(src)
img_name = src.split("/")[-1] # 拿到下载地址中最后一个"/"后面的内容作为图片的名称
with open("img/" + img_name, mode="wb") as f:
f.write(img_resp.content) # img_resp.content 这里拿到的是字节,将图片内容写入到文件
print("over!", img_name)
time.sleep(3) # 因为在循环里面,为了不给服务器造成负担,每完成一次循环延时3秒钟
print("ALL OVER!!!")
代码运行结果:
备注: 在下载每一个图片的时候,pycharm会默认对每一个文件做索引,图片下载的越多,pycharm就会越慢,针对当前下载的图片,我们没有必要做索引,可以按照下图关闭此文件夹的默认索引。
结语
关于使用bs4解析的爬虫操作就简单说到这里,希望大家加油哦!
如果觉得文章对你有用的话,请留下你的小心心,如果有其他任何问题,请评论区留言哦!
心灵鸡汤:
因为选择,才会错过;因为错过,才会失去;因为失去,才会珍惜;因为珍惜,才会得到......万事万物,循环如戏,不去刻意强求,终是会有因有果。因为心中有爱,你才能被人爱!