百度相册提取器(Python)

使用方法:

例(随便从首页找的):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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值