在上一篇学习笔记中,python学习笔记2-下载网络图片 ,简单记下了已知网络图片地址,下载图片的过程。
但是,一个网页里图片很多,怎么让python自动解析地址,再挨个下载图片呢?
这篇算是上篇的一个继续。
要使用本代码,要安装 3个模块:
requests、BeautifulSoup(这个要安装 BeautifulSoup4,简写为bs4,否则是老版本)、lxml。
安装方法:
在 cmd 里依次输入,挨个安装:
python -m pip install requests
python -m pip install BeautifulSoup4
python -m pip install lxml
# -*- coding:utf-8 -*-
"""
爬虫的基础练习:
利用 requests 和 BeautifulSoup 模块下载图片
利用 lxml 解析HTML
"""
import os
import re # 正则模块
import requests # 爬取网页内容需要的模块
from bs4 import BeautifulSoup # 解析 HTML 的模块 导入 BS ,版本 4。
import lxml # bs4的解析插件模块
# 定义网址,我们就来爬取这个网址上的所有图片。对不住学校了,练习使用~
weburl = r"http://www.cqie.edu.cn"
# 图片保存目录,事先建立好的目录。跟python文件同一目录哦。
dir = "images"
# 定义正则,用以判断图片地址是不是 http 开头的绝对地址。
reg = re.compile(r'^http',re.I)
以上代码就是 模块的引入,并且设置一些基础变量。
# 设置请求 headers,伪装浏览器 并接受中文数据
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
'Accept-Language': "zh-CN,zh;q=0.9"
}
# 开始请求页面
req = requests.get( weburl, headers=headers )
req.encoding = req.apparent_encoding # 设置接受的编码,免得乱码出现
# 如果状态码正确,就获取请求到的HTML代码
if req.status_code == 200:
html = req.text # str 数据 , w+
以上在利用 requests 模块,请求访问指定网址,以获得 HTML 代码。我们需要从这些HTML代码中,获取指定的图片地址。
# 用BS 解析HTML,获取图片地址
bs = BeautifulSoup( html ,"lxml") # lxml 需要下载
images = bs.select("img") # 找到页面中所有的img 标签
imgSrc = []
for img in images:
# imgSrc.append( weburl+img.get("src") )
url = img.get("src")
if not reg.match(url): # 如果图片开头没有 http ,说明这个是不完整的地址,就给它前面加上网址。获得一个完整的图片地址。
imgSrc.append( weburl+url )
else:
imgSrc.append( url )
print( imgSrc ) # 获取所有的图片地址
BeautifulSoup 对象的 select() 方法就是选择标签。参数可以写 CSS 的选择标签方式。
images = bs.select("img") 这里就是选择页面中所有的 img 标签,找到的结果当然是个 list 数据。
然后,利用 for 循环把所有的 img 标签的 地址 保存在 列表 imgSrc 中。
for i in imgSrc:
imgName = i.split( "/" )[-1] # 获取图片的名字
imgSaveDir = dir + "/" + imgName # 图片的存放地址
imgRq = requests.get(i) # 访问图片地址
with open(imgSaveDir,"wb+") as f:
f.write( imgRq.content )
print( "图片下载完毕" )
循环遍历 图片地址 list, 依次使用 requests 请求图片地址,并且挨个下载到指定的文件夹中。
完毕~~
下载的成果截图: