最近看了一段时间Python,练习写了一个抓取淘女郎的爬虫,话不多说,上代码

# _*_ 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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值