BeautifulSoup介绍:

简单来说,Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。

以下为爬取网页图片的例子:

先创建一个requests的请求,然后使用BeautifulSoup的lxml HTML解析器去解析网页

url = 'https://pic.netbian.com/4kdongman/'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
r = requests.get(url,headers=headers)
#设置编码为gbk,要不然会乱码
r.encoding='gbk'
#使用lxml解析器解析
soup = BeautifulSoup(r.text,'lxml')

编码格式可以从网页html中看到

python爬图 python爬图片 beautifulsoup_编码方式

接下来可以先定位到所有图片的整体div,例如class=’slist‘这个div,然后再定位每张图片的img标签,提取相关数据,得到每张图片的url地址

python爬图 python爬图片 beautifulsoup_xml_02

 

 

 

#定位所有图片的整体div
all_list = soup.find_all(attrs={'class': 'slist'})
#定位所有的img标签
img_list = all_list[0].find_all('img')
#遍历每个img标签
for img in img_list:
    img_url = img['src']
    name = img['alt']
  #拼接图片url地址
    img_url = 'https://pic.netbian.com' + img_url
  #图片名称
    print(name)
  #图片url
    print(img_url)

 获取到每张图片的url地址后,就可以直接将其下载下来

方法一:with open直接将图片用字节流写入保存

r_img = requests.get(img_url)
 with open('./img/'+name+'.jpg','wb+') as f:
#content返回的是二进制数据,如果你是取文本,你可以使用r.txt,如果取图片和文件,则是r.content
 f.write(r_img.content)

方法二:直接使用urllib.request.urlretrieve下载

#第一个参数为要下载文件的url,第二个参数为本地保存路径以及文件名的路径
urllib.request.urlretrieve(img_url,'./img/'+name+'.jpg')

两种都可以实现,图片的下载,我保存的图片的地址为当前目录的img,从下面图片可以看到已经全部下载了

python爬图 python爬图片 beautifulsoup_python爬图_03

 

 

 

完整代码如下:

 

import urllib.request

import requests
from bs4 import BeautifulSoup

url = 'https://pic.netbian.com/4kdongman/'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
r = requests.get(url,headers=headers)
#设置编码为gbk,要不然会乱码
r.encoding='gbk'
#使用lxml解析器解析
soup = BeautifulSoup(r.text,'lxml')
all_list = soup.find_all(attrs={'class': 'slist'})
img_list = all_list[0].find_all('img')
for img in img_list:
    img_url = img['src']
    name = img['alt']
    img_url = 'https://pic.netbian.com' + img_url
    print(name)
    # r_img = requests.get(img_url)
    # with open('./img/'+name+'.jpg','wb+') as f:
    #     f.write(r_img.content)
    urllib.request.urlretrieve(img_url,'./img/'+name+'.jpg')
    print('已经保存完成:'+img_url)