import requests
import re
import os
import os.path
#正则表达式,url get分析方法,文件保存,字典保存信息方法
#设置网址url,图片字典
count= 1553
#homeUrl="http://huaban.com/favorite/pets/"
homeUrl="http://huaban.com/xxx/likes/"
#xxx为你的用户名
images=[]
def get_image_info(url_image):
htmlPage=requests.get(url = url_image).content #加载主页面
with open("htmlPage.html",'wb') as fp: #得到网页所有内容
fp.write(htmlPage)
#prog = re.compile(r'app\.page\["pins"\].*') #p449 正则表达式re模块中compile负责编译,返回regex对象["user"\].["pins"\]
prog = re.compile(r'\"likes\".*')
appPins = prog.findall(htmlPage) #得到正则表达式模式中匹配的所有非重叠结果,返回列表元祖
null=None ; true=True #将json中的布尔值转换呈py的None
print appPins
if appPins==[]: #若列表appPins是空,则没有匹配到结果
print "appPins==None"
#result = eval(appPins[0][19:-1])
result=eval(appPins[0][8:-2]) #p418 eval对表达式(字符串或内建函数compile创建的预编译代码对象),得到所有图的字典
for i in result: #遍历result,将有用部分赋值给info
info={} #创建字典info
info['id']=str(i['pin_id']) #将遍历出的i page信息转换为字符串送入info字典相应的位置
info['url']="http://img.hb.aicdn.com/" + i["file"]["key"] + "_fw658"
info['seq']=str(i['seq'])
if 'image' ==i["file"]["type"][:5]:
info['type']=i["file"]["type"][6:]
else:
info['type']='noName'
images.append(info)
if __name__ == '__main__':
get_image_info(homeUrl)
page_more=homeUrl + "?iuwq2ekr&max=" + images[-1]['id'] + "&limit=20&wfl=1" #ajax请求的url http://huaban.com/favorite/pets/?i5p998kw&max=902435624&limit=20&wfl=1
for i in range((count-1)/20): #p29 range设置遍历范围,count为下载数量
page_more=homeUrl + "?iuwq2ekr&max=" + images[-1]['seq'] + "&limit=20&wfl=1"
#page_more="http://huaban.com/ods3oninv0/likes/?iuwqwdvj&max=71926723&limit=20&wfl=1"
print page_more
url_more=requests.get(page_more).content #刷新页面,利用最后一张图的pin id,用network的overview视图查看刷新发出的get信息
get_image_info(page_more)
print "{} image will be download".format(len(images)) #开始下载图片
for key,image in enumerate(images): #enumerate返回枚举对象,它既可以循环索引,也可以循环元素
print "download {0}... ...".format(key)
try:
req=requests.get(image["url"]) #用get得到url下的所有资源
except:
print "error"
imagename=os.path.join('likes',image["id"]+"."+image["type"]) #命名文件,位置,文件名+后缀
with open(imagename,'wb') as fp: #保存图片
fp.write(req.content) #content得到图片的编码写入文件中