主要是要了解
- 网页图片的懒图片加载在xpath上的应用
- xpath的用法练习
- 图片文件的下载和保存
练习网页对象:http://sc.chinaz.com/tupian/xingganmeinvtupian.html
附上练习代码:
import urllib.request
import urllib.parse
from lxml import etree
import time
import os
def handle_request(url,page):
#网页拼接
if page==1:
url=url + '.html'
else:
url=url + '_' + str(page) +'.html'
# print(url)
#方式二:
# if page==1:
# url=url.format('')
# else:
# url=url.format('_' + str(page) )
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
request=urllib.request.Request(url=url,headers=headers)
return request
def handle_parse(content):
#使用Xpath在线解析方式
tree=etree.HTML(content)
pic_list=tree.xpath('//div[starts-with(@class,"box picblock")]')
# print(pic_list)
# print(len(pic_list))
for pic in pic_list:
pic_name=pic.xpath('.//div/a/img/@alt')[0]
# print(pic_name)
#图片赖加载用 @src2 而用@src显示不出来
pic_url=pic.xpath('.//div/a/img/@src2')[0]
# print(pic_url)
#下载及保存图片
download_img(pic_url,pic_name)
def download_img(pic_url,pic_name):
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
#构建图片请求对象
request_pic=urllib.request.Request(url=pic_url,headers=headers)
#读取图片内容,图片不用decode()
pic_content=urllib.request.urlopen(request_pic).read()
#创建一个文件夹
dirpath='xingan'
if not os.path.exists(dirpath):
os.mkdir(dirpath)
#创建一个文件名
filename=pic_name+'.jpg'
#os有个方法截取pic_url里的后面段作为文件名,我觉得上面的好些
# filename=os.path.basename(pic_url)
#创建图片路径
filepath=os.path.join(dirpath,filename)
#二建制写入图片内容
with open(filepath,'wb') as fp:
fp.write(pic_content)
def main():
#第一页URL
url='http://sc.chinaz.com/tupian/xingganmeinvtupian'
#第二页URL
#url='http://sc.chinaz.com/tupian/xingganmeinvtupian_2.html'
#方式二
#url='http://sc.chinaz.com/tupian/xingganmeinvtupian{}.html'
start_page=int(input("请输入起始页码:"))
end_page = int(input("请输入结束页码:"))
for page in range(start_page,end_page + 1):
print('开始下载%s页图片....' % page)
#构建请求对象
request=handle_request(url,page)
#发送请求,获取响应内容
content=urllib.request.urlopen(request).read().decode()
#解析响应内容
handle_parse(content)
print('结束下载%s页图片...' % page)
time.sleep(2)
if __name__ == '__main__':
main()
print('所有图片下载完成,请查看当前xingan文件夹图片...')
-
运行中效果:
-
本地图片效果: