zoukankan      html  css  js  c++  java
  • 简单的python爬虫--爬取Taobao淘女郎信息

    最近在学Python的爬虫,顺便就练习了一下爬取淘宝上的淘女郎信息:手法简单,由于淘宝网站本上做了很多的防爬措施,应此效果不太好!

    爬虫的入口:https://mm.taobao.com/json/request_top_list.htm?type=0&page=0

    本人代码如下:请各位高人多指教,请留言,不胜感激!!Light bulb

    #_*_coding:utf-8_*_
    import unicodedata
    import urllib.request
    import re
    import os
    root_url="https://mm.taobao.com/json/request_top_list.htm?type=0&page="
    
    def HexStr2Unicode(Hex_Str):
        Unicde_Str = ""
        for i in range(0,len(Hex_Str)//4):
            chr(int(Hex_Str[i*4:i*4+4], 16))
            Unicde_Str += chr(int(Hex_Str[i*4:i*4+4], 16))
        return Unicde_Str
    def getSiteSet(url):
        '''根据传入的roo_url获取到每个淘女郎的个人网址,以及每个淘女郎的名字'''
        page=urllib.request.urlopen(url)
        cont=page.read()
        cont=cont.decode(encoding="gbk")#很关键,原网页淘宝的是gbk编码
        # print(cont)
        pattern1=r'href=".{1,35}.htm" target='#匹配个人网址的正则表达式
        pattern2=r'class="lady-name" href=".{1,100}</a>'#匹配个人名字的表达式
        # print(cont)
        SiteSet={}
        i=1
        try:
            while len(cont)>5:
                matchObj=re.search(pattern1,cont,re.M).group()
                nameObj=re.search(pattern2,cont,re.M).group()
                # print("------->",matchObj)
                if matchObj:
                    site='https:'+(matchObj[6:-9])
                    id1=nameObj.find(">")
                    id2=nameObj.find("<")
                    # print(name)
                    name=nameObj[id1+1:id2]
                    # print("网站地址%d: "%i,site)
                    # print("淘女郎名字:",name)
                    SiteSet[name]=site
                    index=cont.find(nameObj)
                    i+=1
                else:
                    print("没有匹配上")
    
                cont=cont[index+2:]
        except:
            # import traceback
            # traceback.print_exc()
            print("*********Match error****************")
        return SiteSet
    
    # SiteSet=getSiteSet("https://mm.taobao.com/json/request_top_list.htm?type=0&page=0")
    
    
    def getImgSet(site_url):
        '''根据某个具体的网址,获取该网址中所有图片的路径'''
        page=urllib.request.urlopen(site_url)
        cont=page.read().decode("gbk").encode("utf-8")
        cont=str(cont,encoding="utf-8")
        pattern=r'src="//.{0,150}(.jpg|.png)"'
        ImgSet=[]
        index=0
        i=1
        try:
            while len(cont)>100:
    
                matchObj=re.search(pattern,cont,re.M).group()
                # print("------->",matchObj)
                if matchObj:
                    img='https:'+(matchObj[5:-1])
                    # print("图片地址%d: "%i,img)
                    ImgSet.append(img)
                    index=cont.find(matchObj)
                    i+=1
                else:
                    print("没有匹配上")
    
                cont=cont[index+len(matchObj[5:-1]):]
        except:
            print("-----------------------")
    
        return ImgSet
    
    # ImgSet=getImgSet("https://mm.taobao.com/434479822.htm")
    # ImgSet=set(list(ImgSet))#集合元素去重
    
    def getIconSet(url):
        '''根据roo_url,获取每个淘女郎的头像icon图片'''
        page=urllib.request.urlopen(url)
        cont=page.read()
        cont=str(cont)
        head="<img src="
        tail=".jpg"
        k=1
        IconSet=[]
        while k!=0:
            id1=cont.find(head)
            id2=cont.find(tail,id1)
            if id1==-1 or id2==-1:
                k=0
                break
            else:
                icon="https:"+cont[id1+len(head)+1:id2+len(tail)]
                cont=cont[id2:]
                IconSet.append(icon)
                print(icon)
        return IconSet
    #我们可以使用自己定义的auto_down()来代替python的urllib.urlretrieve()函数,实现我们自动重新下载的目标。
    #    tips:新下载的文件会覆盖原来下载不完全的文件。
    def auto_down(url,filename):
        '''使用自定义的方法进行下载文件,如果下载失败,还可以继续下载覆盖原来的文件'''
        try:
            # 添加头部信息,模仿浏览器,但是淘宝对于爬虫的爬取,做了很多防爬的措施,因此,及时添加了header头部信息,效果也并不好
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
            req = urllib.request.Request(url=url, headers=headers)
            urllib.request.urlretrieve(url,filename)
        except urllib.request.ContentTooShortError:
            print('Network conditions is not good.Reloading.')
            auto_down(url,filename)
    
    
    
    # urllib.request.urlopen(req).read()
    base =r"C:UserswujianDesktoppython学习TaobaoGirlImg\"
    for i in range(1,6):
        url=root_url+str(i)
        SiteSet=getSiteSet(url)
        for site in SiteSet.keys():
            i=1
            filename=base+site
            os.mkdir(filename)# 创建文件夹
            print(filename)
            ImgSet=getImgSet(SiteSet[site])
            ImgSet=set(list(ImgSet))
            for imgurl in ImgSet:
                # print(imgurl)
                file_name=filename+"\"+str(i)+".jpg"
                auto_down(imgurl,file_name)
                i+=1
    
    
    
    爬虫--爬取淘宝信息
  • 相关阅读:
    2804 最大最小数质因数
    5429 多重背包
    1851 越狱
    Gvim使用
    3622 假期
    4906 删数问题
    2845 排序的代价
    poj 3352
    常用正则表达式汇总
    功能简单例子
  • 原文地址:https://www.cnblogs.com/jean925/p/7774828.html
Copyright © 2011-2022 走看看