1. 项目需求
我们将从一个网页中抓取图片数据,提取图片的URL,并将图片下载到本地。我们将使用lxml库结合XPath来定位网页中的图片元素。
2. 环境准备
安装必要的Python库:
pip install lxml urllib
3. 完整代码示例
from lxml import etree
import urllib.request
import os
# 1. 定制请求对象
# 2. 获取网页数据
# 3. 下载图片
# 分析网页的特征
# 第一页数据连接 https://sc.chinaz.com/tupian/fengjing.html
# 第二页数据连接 https://sc.chinaz.com/tupian/fengjing_2.html
# 第三页数据连接 https://sc.chinaz.com/tupian/fengjing_3.html
def create_request(page):
"""定制请求对象"""
url = f'https://sc.chinaz.com/tupian/fengjing_{page}.html' if page > 1 else 'https://sc.chinaz.com/tupian/fengjing.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'}
return urllib.request.Request(url=url, headers=headers)
def get_content(request):
"""获取网页源码"""
with urllib.request.urlopen(request) as response:
return response.read().decode('utf-8')
def download_images(content, save_folder='./fengjingImg'):
"""下载图片"""
if not os.path.exists(save_folder):
os.makedirs(save_folder)
tree = etree.HTML(content)
img_list = tree.xpath('//div[@class="container"]//div//img/@data-original')
alt_list = tree.xpath('//div[@class="container"]//div//img/@alt')
for i, img_url in enumerate(img_list):
full_url = 'https:' + img_url
img_name = alt_list[i] + '.jpg'
file_path = os.path.join(save_folder, img_name)
urllib.request.urlretrieve(url=full_url, filename=file_path)
print(f"下载 {img_name}")
if __name__ == '__main__':
# 输入起始页和结束页
start_page = int(input('输入起始页: '))
end_page = int(input('输入结束页: '))
# 循环抓取指定范围的页面
for page in range(start_page, end_page + 1):
request = create_request(page) # 请求对象的定制
content = get_content(request) # 获取网页源码
download_images(content) # 下载图片
4. 代码解析
- 创建请求
create_request(page):根据传入的页码,动态生成请求的URL,并添加User-Agent头部。 - 获取网页内容
get_content(request):通过urllib.request.urlopen()发送请求,获取网页源码并解码为UTF-8格式。 - 下载图片
download_images(content):使用XPath提取图片链接(data-original属性),并下载图片到本地指定文件夹。如果文件夹不存在,代码会自动创建。
5. 执行过程
- 输入起始页和结束页,程序会循环抓取这些页码的图片数据。
- 每页的图片链接会被提取并下载保存。