Python3实现Web网页图片下载:原理、功能与多线程代码详解
本文介绍基于Python3的Web网页图片下载实现方案。首先解析GET与POST请求的区别及Cookie技术原理,明确图片下载的核心功能点,包括链接解析、格式校验、异常处理及自动命名。最后提供包含多线程并发下载功能的完整Python代码,帮助开发者高效批量获取网络图片资源。
首先简要介绍Python Web编程的基础知识。
1. GET与POST的区别
1) POST旨在向Web服务器提交数据,而GET旨在从服务器获取数据。虽然GET也能传输少量数据,但其设计初衷是告知服务器所需数据的类型。POST将信息作为HTTP请求体发送,而GET则将参数置于HTTP头部中传输;
2) GET与POST在HTTP传输方式上存在差异:GET的参数位于HTTP头部,而POST的数据位于HTTP请求体中;
3) POST传输数据时URL中不显示具体参数,而GET方法必须在URL中展示参数;
4) GET受限于URL长度,通常只能传输约1024字节的数据;POST支持更大的数据传输量,可达2MB。
2. Cookies技术
Cookies常被提及,但其具体定义和作用是什么?
Cookies是一种允许Web服务器将少量数据存储于客户端硬盘或内存,或从客户端读取数据的技术。当用户浏览某网站时,Web服务器会在用户硬盘上放置一个极小的文本文件,用于记录用户ID、密码、浏览过的网页及停留时间等信息。
当用户再次访问该网站时,网站通过读取Cookies获取相关信息,从而执行相应操作,例如显示欢迎标语或实现免ID、密码直接登录等功能。
从本质上看,Cookies相当于用户的身份证。它不能执行代码,不会传播病毒,且专属于用户,仅由提供它的服务器读取。
保存的信息片段以“名/值”对(name-value pairs)的形式存储,每个“名/值”对仅代表一条命名的数据。
一个网站只能获取其放置在用户电脑中的信息,无法从其他Cookies文件中读取信息,也无法获取用户电脑上的其他数据。
Cookies中的内容大多经过加密处理,因此普通用户看到的通常是无意义的字母数字组合,只有服务器的CGI处理程序才能解读其真实含义。
Python3实现Web网页图片下载的基本功能点
- 需要实现的主要功能点包括:
- 解析网页中的图片链接
- 对图片链接进行检测,若图片格式或大小不符合要求,则跳过下载
- 加入异常处理机制
- 自动提取文件名,直接从图片链接中获取文件名
Python3实现Web网页图片下载的参考代码:
from urllib import request
import threading
from time import sleep,ctime
from html import parser
def downjpg( filepath,FileName ="default.jpg" ):
try:
web = request.urlopen( filepath)
print("访问网络文件"+filepath+"\n")
jpg = web.read()
DstDir="E:\\image\\"
print("保存文件"+DstDir+FileName+"\n")
try:
File = open( DstDir+FileName,"wb" )
File.write( jpg)
File.close()
return
except IOError:
print("error\n")
return
except Exception:
print("error\n")
return
def downjpgmutithread( filepathlist ):
print("共有%d个文件需要下载"%len(filepathlist))
for file in filepathlist:
print( file )
print("开始多线程下载")
task_threads=[] #存储线程
count=1
for file in filepathlist:
t= threading.Thread( target=downjpg,args=(file,"%d.jpg"%count) )
count=count+1
task_threads.append(t)
for task in task_threads:
task.start()
for task in task_threads:
task.join() #等待所有线程结束
print("线程结束")
class parserLinks( parser.HTMLParser):
filelist=[]
def handle_starttag(self,tag,attrs):
if tag == 'img':
for name,value in attrs:
if name == 'src':
print( value)
self.filelist.append(value)
#print( self.get_starttag_text() )
def getfilelist(self):
return self.filelist
def main(WebUrl):
#globals flist
if __name__ == "__main__":
lparser = parserLinks()
web = request.urlopen( WebUrl )
#context= web.read()
for context in web.readlines():
_str="%s"%context
try:
lparser.feed( _str)
except parser.HTMLParseError:
#print( "parser error")
pass
web.close()
imagelist= lparser.getfilelist()
downjpgmutithread( imagelist)
#downjpgmutithread( flist)
#WebUrl="http://www.baidu.com/" #要抓去的网页链接,默认保存到e盘
WebUrl="http://hi.baidu.com/yuyinxuezi/item/df0b59140a06be27f6625cd4"
main(WebUrl)
以上即为Python3实现Web网页图片下载的相关介绍,希望能为您的学习提供帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









