使用方法:
例(随便从首页找的):http://xiangce.baidu.com/picture/album/list/5852a22d51d6450ed82bf35f49d2e519df867ab6
提取后半部分:5852a22d51d6450ed82bf35f49d2e519df867ab6
import re
import urllib.request
import os
from time import sleep
#从url下载图片,保存至fileAddress
def savePicture(url,fileAddress):
conn = urllib.request.urlopen(url)
f = open(fileAddress,'wb')
f.write(conn.read())
f.close()
#get url,获取json,返回string
def getJson(album_sign,startFrom,size):
url = "http://xiangce.baidu.com/picture/album/list/%s?view_type=list&size=%d&pn=%d&format=json&type=default&_=1432740977640" %(album_sign,size,startFrom)
conn = urllib.request.urlopen(url)
return conn.read().decode("utf-8");
#相册预读,查看照片数量(因为百度最多一次只能返回200个)
def getAllJson(album_sign):
str = getJson(album_sign,0,1)
reObj = re.compile("(?<=\"picture_num\":)\\d+"); #提取图片数量
size = reObj.findall(str)
json = "" #数据
startFrom = 0
while startFrom < int(size[0]):
json += getJson(album_sign,startFrom,200) #0~199;200~399;……
startFrom += 200
return json
def main(album_sign,saveFolder):
#从数据库里面提取地址
json = getAllJson(album_sign)
reObj1 = re.compile('(?<=\"pic_big_src\":\").*?(?=\")')
result = reObj1.findall(json)
#文件夹是否存在
if(not os.path.exists(saveFolder)):
os.makedirs(saveFolder)
#进度条?
index = 0
#通过地址提取图片
for str in result:
reObj2 = re.compile(r"\w*?\.jpg") #提取文件名
name = reObj2.findall(str)
fileAddress = saveFolder + name[0]
url = str.replace("\/","/")
savePicture(url,fileAddress)
print("文件%d:%s" % (index,fileAddress))
index += 1
sleep(0.1)
print("搞定!")
main("5852a22d51d6450ed82bf35f49d2e519df867ab6","E:\\图片")
代码中最后一行main函数,第一个参数是album_sign(就是字母和数字的组合),第二个参数是保存的本地位置
流程:
利用album_sign从百度获取json,分析json提取原始图片地址,下载保存到本地
注:每次get最多只能获取200条,如果相册有500张图片,那么至少要3次。所以,getAllJson方法先获取图片数量,然后while循环,全部储存到一个字符串内。
正则表达式:
(?<="picture_num":)\d+ 用来提取照片数量,比如 "picture_num":500 获取500
(?<="pic_big_src":").*?(?=") 用来提取照片地址,比如"pic_big_src":"http://xiangce.baidu.com/1.jpg" 获取http://xiangce.baidu.com/1.jpg
"\w*?\.jpg" 提取照片文件名,比如http://xiangce.baidu.com/1.jpg 获取1.jpg