淘宝现阶段的淘女郎相册无须登录,省了好多麻烦,如果需要登录,请看本系列第一篇文章
本人现阶段尚在学习阶段,参考学习链接如下,部分代码可能存在相同,可以参考:http://cuiqingcai.com/1001.html
代码使用python2.7,如果用的是python3.0版本,使用的类库可能需要自行更改!!!
# coding: utf-8
import re
import urllib
import urllib2
import os
import cookielib
'''
https://mm.taobao.com/json/request_top_list.htm?page=3 初始访问页
https://mm.taobao.com/self/model_card.htm?user_id=539549300&is_coment=false 索引页个人跳转链接
https://mm.taobao.com/self/model_info.htm?user_id=539549300&is_coment=false 个人主页链接
https://mm.taobao.com/self/model_album.htm?user_id=440678454&is_coment=false 个人相册链接
https://mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id =440678454&page=1 ajax请求返回的数据页面
'''
class Spider:
# 一些初始化参数配置
def __init__(self):
# 请求路径基本前缀
self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm'
# 网页请求头信息
self.userAgent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'
self.headers = {'User-Agent':self.userAgent}
# 获取索引页面,由基本的请求路径 + 请求参数(page)
# https://mm.taobao.com/json/request_top_list.htm?page=3
# 返回页面的gbk编码代码
def getPage(self,pageIndex):
url = self.siteURL + '?page=' + str(pageIndex)
request = urllib2.Request(url,headers = self.headers)
response = urllib2.urlopen(request)
return response.read().decode('gbk')
# 创建图片存储的对应文件夹
def mkPicDir(self, path):
path = path.strip()
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists = os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
print u"系统偷偷新建了名字叫做", path, u'的文件夹'
# 创建目录操作函数
os.makedirs(path)
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print u"名为", path, '的文件夹已经创建成功'
return False
# 获取模特个人信息页全部内容
def getModelPage(self,url):
request = urllib2.Request(url,headers=self.headers)
response = urllib2.urlopen(request)
return response.read().decode('gbk')
# 下载图片并保存到本地
def saveImage(self, url, name, number):
filename = 'e:/pics/' + name + '/' + str(number) + '.jpg'
try:
print u"正在悄悄的保存她的一张图片", filename
u = urllib.urlopen('https:'+url)
data = u.read()
f = open(filename, 'wb')
f.write(data)
f.close()
except Exception,e:
print e
# 页面图片匹配
def matchPics(self,mmpage,name,photoPage):
# 匹配出页面中所有图片链接
pattern = re.compile('<div class="mm-photo-cell"(.*?)<div class="mm-photo-cell-middle">.*?<img'
+ ' src="(.*?)".*?</a>', re.S)
pics = re.findall(pattern,mmpage)
# 自增数字,做图片名
number = 1
for pic in pics:
try:
self.saveImage(pic[1],name,number+(photoPage-1)*12)
number += 1
except urllib2.URLError,e:
print u"一张图片失效",name
# 获取每个模特共有几页的展示相册
def getPageTotal(self, mmPage):
pattern = re.compile('<input name="totalPage".*?value="(.*?)"', re.S)
number = re.findall(pattern, mmPage)
return int(number[0])
# 使用正则表达式解析索引页面
# 获取页面中对应的个人资料信息
# pageStart(开始页) pageEnd(结束页)
def getContents(self, pageStart, pageEnd):
# 循环指定的信息页,处理所有页
for pageIndex in range(pageStart, pageEnd, 1):
page = self.getPage(pageIndex)
# 页面代码条件匹配出所有符合条件的内容
pattern = re.compile('<div class="list-item".*?lady-name.*?href=".*?user_id=(.*?)".*?>(.*?)</a>.*?'
, re.S)
# 存储所有匹配出的内容
items = re.findall(pattern, page)
for item in items:
# 依据用户名链接与相册链接间的联系,直接修改链接并跳转到相册信息 card改为album
mmpage = self.getModelPage('https://mm.taobao.com/self/album/open_album_list.htm?_charset'
+ '=utf-8&user_id=' + item[0] )
# 获取该模特相册总共有几页
number = self.getPageTotal(mmpage)
# 创建对应文件夹
self.mkPicDir('e:/pics/' + item[1] + '/')
for photoPage in range(1, number, 1):
mpage = self.getModelPage('https://mm.taobao.com/self/album/open_album_list.htm?_charset'
+ '=utf-8&user_id=' + item[0] + '&page=' + str(photoPage))
# 页面中的图片链接匹配并下载
self.matchPics(mpage, item[1],photoPage)
spider = Spider()
spider.getContents(6,7)
执行效果截图如下: