Python实现从订阅源下载图片的方法
本文实例讲述了Python实现从订阅源下载图片的方法。分享给大家供大家参考。具体如下:
这段代码是基于python3.4实现的,和python2.X比起来有了好多差别啊。
这是一个练习,数据源来自网易订阅。代码如下:
__author__='Saint'
importos
importurllib.request
importjson
fromhtml.parserimportHTMLParser
#从获取的网页内容筛选图片的内容
classMyHtmlParser(HTMLParser):
links=[]
defhandle_starttag(self,tag,attrs):
iftag=="img":
iflen(attrs)==0:
pass
else:
forname,valueinattrs:
ifname=="src":
self.links.append(value)
classDown(object):
#总的目录
img_path="E:/saint"
#下载目录
dir=''
#采集源地址
collect_links=["http://dy.163.com/v2/media/articlelist/T1374483113516-1","http://dy.163.com/v2/media/articlelist/T1420776257254-1","http://dy.163.com/v2/media/articlelist/T1376641060407-1"]
img_links="http://dy.163.com/v2/article"
defhandleCollect(self):
forcollect_linkinself.collect_links:
notice="开始从["+collect_link+"]采集图片"
print(notice)
#建立下载的目录
dir_name=collect_link.split("/")[-1]
self.isDirExists(dir_name)
dict=self.getListFromSubscribe(collect_link)
ifdict==False:
print("数据采集失败,是否继续(y/n)")
op=input();
ifop=="y":
os.system("cls")
pass
elifop=="n":
print("停止采集")
break
else:
os.system("cls")
print("非法输入")
break
else:
forpageindict:
page_uri=self.img_links+"/"+page["tid"]+"/"+page["docid"]
self.getImgFromUri(page_uri)
print("是否继续(y/n)")
new_op=input();
ifnew_op=="n":
os.system("cls")
print("采集完毕")
break
print("OK")
#从订阅源获取目录
defgetListFromSubscribe(self,uri):
res=urllib.request.urlopen(uri)
ifres.code<200orres.code>300:
os.system("clear")
returnFalse
else:
result=res.read().decode("gbk")#3.4版本的read()返回的是byte类型,需要decode()处理,选项是网页编码
dict=json.loads(result)
ifdict['code']!=1:
print(dict['msg'])
returnFalse
else:
returndict['data']
#获取本期订阅的网页,并从网页中提取出来需要的图片
defgetImgFromUri(self,uri):
html_code=urllib.request.urlopen(uri).read().decode("gbk")
hp=MyHtmlParser()
hp.feed(html_code)
hp.close()
forlinkinhp.links:#hp.links是图片的下载地址的列表
self.writeToDisk(link)
#检查文件目录是否存在,如果不存在,则创建目录
defisDirExists(self,dir_name):
self.dir=self.img_path+dir_name
isExists=os.path.exists(self.dir)
ifnotisExists:
os.makedirs(self.dir)
returnTrue
else:
returnTrue
#下载文件,并且写入磁盘
defwriteToDisk(self,url):
os.chdir(self.dir)
file=urllib.request.urlopen(url).read()
file_name=url.split("/")[-1]
open(file_name,"wb").write(file)
returnTrue
if__name__=="__main__":
down=Down()
down.handleCollect()
希望本文所述对大家的Python程序设计有所帮助。