# _*_ coding:utf-8 _*_
# 该程序还需要增加异常的处理
import urllib.request
import json
import re
# 获取某一页中所有模特的信息列表
def get_url_list(current_page):
"""
:param current_page: 当前页
:return:模特数据
"""
# 网页通过ajax返回的模特json数据url
url = "https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8¤tPage={}".format(current_page)
# 常规操作
user_agent = "Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)" \
"Chrome/17.0.963.56Safari/535.11"
headers = {"User-Agent": user_agent}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
html = response.read()
# 网页是gbki编码,需要转换成utf-8
html = html.decode("gbk").encode("utf-8")
# 从json数据中获取模特的信息
model_list = json.loads(html)["data"]["searchDOList"]
# 返回模特数据
return model_list
# 获取某位模特的所有相册
def get_album_list(user_id):
"""
:param user_id:模特的id
:return: 相册url列表
"""
# 在网页上找到的ajax返回的html数据url
url = "https://mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20={}".format(user_id)
# 应该需要加上,没想好
# user_agent = "Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)" \
# "Chrome/17.0.963.56Safari/535.11"
# headers = {"User-Agent": user_agent}
# 正常操作
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
html = response.read()
# 转码
html = html.decode("gbk").encode("utf-8")
# 根据正则表达式,来过滤有用的信息
pattern = re.compile(r'<a class="mm-first" href="(.*?)" target="_blank"', re.S)
# 所有的相册url
album_url_list = pattern.findall(str(html))
return album_url_list
# 获取相册所有照片url地址
def get_photo(user_id, ablum_id):
"""
:param user_id: 模特id
:param ablum_id:相册id
:return:返回所有照片url地址,是一个列表
"""
# 我们在一个jsonp调用文件中找到了相册url地址,需要相册id,这就是之前切出相册id的原因
url = "https://mm.taobao.com/album/json/get_album_photo_list.htm?user_id={}&album_id={}&top_pic_id=0&cover=%2F%2Fimg.alicdn.com%2Fimgextra%2Fi1%2F176817195%2FTB1jFcMKFXXXXblXFXXXXXXXXXX_!!0-tstar.jpg&page=1&_ksTS=1517917818779_155&callback=jsonp156".format(user_id, ablum_id)
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
html = response.read()
# 这个地方我不太明白,如果不加decode("utf-8"),会输出字节(应该是),不会输出中文
html = html.decode("gbk").encode("utf-8").decode("utf-8")
# 处理jsonp,去掉开头的jsonp156(),这样我们就可以使用json类库了
return json.loads(str(html).strip()[9:-2])["picList"]
# 保存每张照片
def write_to_file(imageUrl, count):
"""
将照片保存到本地
:param imageUrl:照片地址
:param count: 用数字做文件名
:return:
"""
# 访问照片地址,保存到本地
bytes = urllib.request.urlopen("http:" + imageUrl)
f = open("E:/images/"+str(count)+".jpg", "wb")
f.write(bytes.read())
f.flush()
f.close()
# 文件名
count = 0
# 遍历某一页所有模特信息
for i in get_url_list(1):
# 拿到模特id
userId = i["userId"]
# 该模特所有相册url
album_list = get_album_list(userId)
for url in album_list[::2]:
# 我们需要获取模特相册的id,从url中切出相册id
temp_index = url.find("album_id=")
start_index = temp_index + len("album_id=")
end_index = url.find("&", start_index)
album_id = url[start_index:end_index]
# 获取该相册中的所有照片url
photo_list = get_photo(userId, album_id)
# 遍历相册中所有url,写入本地
for mm_list in photo_list:
# 每一张照片url
imageUrl = mm_list["picUrl"]
print(imageUrl)
# 写入本地
write_to_file(imageUrl, count)
count += 1
最近看了一段时间Python,练习写了一个抓取淘女郎的爬虫,话不多说,上代码
最新推荐文章于 2020-12-04 00:22:03 发布