美文网首页
[python 爬虫02] 淘宝MM

[python 爬虫02] 淘宝MM

作者: 自由快挂 | 来源:发表于2017-04-06 10:49 被阅读0次

    代码

    #coding=utf-8
    
    '''
    原作者: http://cuiqingcai.com/1001.html
    
    更新日志:
        2017-04-06, 修正获取相册 url
    '''
    
    import urllib2,re,os,datetime
    from selenium import webdriver
    
    class Spider:
        def __init__(self):
            self.page=1
            self.dirName='MMSpider'
            #这是一些配置 关闭loadimages可以加快速度 但是第二页的图片就不能获取了打开(默认)
            cap = webdriver.DesiredCapabilities.PHANTOMJS
            cap["phantomjs.page.settings.resourceTimeout"] = 1000
            #cap["phantomjs.page.settings.loadImages"] = False
            #cap["phantomjs.page.settings.localToRemoteUrlAccessEnabled"] = True
            self.driver = webdriver.PhantomJS(desired_capabilities=cap)
    
        def getContent(self,maxPage):
            for index in range(1, maxPage+1):
                self.LoadPageContent(index)
    
        #获取页面内容提取
        def LoadPageContent(self,page):
            #记录开始时间
            begin_time=datetime.datetime.now()
            url="https://mm.taobao.com/json/request_top_list.htm?page="+str(page)
            self.page+=1;
    
            USER_AGENT='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36'
            headers = {'User-Agent':USER_AGENT }
    
            request=urllib2.Request(url,headers=headers)
            response=urllib2.urlopen(request)
    
            #正则获取
            pattern_link=re.compile(r'<div.*?class="pic-word">.*?<img src="(.*?)".*?'
                                r'<a.*?class="lady-name".*?href="(.*?)".*?>(.*?)</a>.*?'
                                r'<em>.*?<strong>(.*?)</strong>.*?'
                                r'<span>(.*?)</span>'
                                 ,re.S)
            items=re.findall(pattern_link,response.read().decode('gbk'))
    
            for item in items:
                #头像,个人详情,名字,年龄,地区
                print u'发现一位MM 名字叫%s 年龄%s 坐标%s'%(item[2],item[3],item[4])
                print u'%s的个人主页是 %s'%(item[2],item[1])
                print u'继续获取详情页面数据...'
                #详情页面
                detailPage=item[1]
                name=item[2]
                self.getDetailPage(detailPage,name,begin_time)
    
        def getDetailPage(self,url,name,begin_time):
            url='http:'+url
            self.driver.get(url)
    
            print u'获取个人信息'
            base_msg=self.driver.find_elements_by_xpath('//div[@class="mm-p-info mm-p-base-info"]/ul/li')
            brief=''
            for item in base_msg:
                print item.text
                brief+=item.text+'\n'
                #保存个人信息
    
            dir=self.dirName+'/'+name
            self.mkdir(dir)
    
            #保存头像
            try:
                icon_url=self.driver.find_element_by_xpath('//div[@class="mm-p-model-info-left-top"]//img')
                icon_url=icon_url.get_attribute('src')
                self.saveIcon(icon_url,dir,name)
            except Exception,e:
                print u'保存头像失败 %s'%e.message
    
            #保存高清图
            try:
                img_url=self.driver.find_element_by_xpath('//*[@id="J_MmInfo"]/div[2]/div/a/img')
                img_url=img_url.get_attribute('src')
                self.saveImg(img_url, os.path.join(dir, name+"_hd.jpg"))
            except Exception,e:
                print u' 保存高清图失败 %s'%e.message
    
            try:
                website = self.driver.find_element_by_xpath('//*[@id="J_MmInfo"]/div[1]/div[3]/ul/li/span')
                website = 'http:' + website.text
                print u' 个性域名', website
                brief += website + '\n'
            except Exception,e:
                print u'获取个性域名失败 %s' % e.message
    
            images_url=self.driver.find_element_by_xpath('//ul[@class="mm-p-menu"]//a')
            images_url=images_url.get_attribute('href')
            print u'相册页面', images_url
            try:
                self.getAllImage(images_url,name)
            except Exception,e:
                print u'获取所有相册异常 %s'%e.message
    
            end_time=datetime.datetime.now()
    
            #保存个人信息 以及耗时
            try:self.saveBrief(brief,dir,name,end_time-begin_time)
            except Exception,e:
                print u'保存个人信息失败 %s'%e.message
    
        #获取所有图片
        def getAllImage(self,images_url,name):
            self.driver.get(images_url)
    
            #只获取第一个相册
            photos=self.driver.find_element_by_xpath('//div[@class="mm-photo-cell-middle"]//h4/a')
            photos_url=photos.get_attribute('href')
            print u'第一个相册链接', photos_url
    
            #进入相册页面获取相册内容
            self.driver.get(photos_url)
            images_all=self.driver.find_elements_by_xpath('//div[@class="mm-photoimg-area"]//img')
    
            self.saveImgs(images_all,name)
    
    
        def saveImgs(self,images,name):
            index=1
            print u'%s 的相册有%s张照片, 尝试全部下载....'%(name,len(images))
    
            for imageUrl in images:
                splitPath = imageUrl.get_attribute('src').split('.')
                fTail = splitPath.pop()
                if len(fTail) > 3:
                    fTail = "jpg"
                fileName = self.dirName+'/'+name +'/'+name+ str(index) + "." + fTail
                print u'下载照片地址%s '%fileName
    
                self.saveImg(imageUrl.get_attribute('src'),fileName)
                index+=1
    
    
        def saveIcon(self,url,dir,name):
            print u'头像地址%s %s '%(url,name)
    
            splitPath=url.split('.')
            fTail=splitPath.pop()
            fileName=dir+'/'+name+'.'+fTail
            print fileName
            self.saveImg(url,fileName)
    
        #写入图片
        def saveImg(self,imageUrl,fileName):
            print imageUrl
            u=urllib2.urlopen(imageUrl)
            data=u.read()
            f=open(fileName,'wb')
            f.write(data)
            f.close()
    
        #保存个人信息
        def saveBrief(self,content,dir,name,speed_time):
            speed_time=u'当前MM耗时 '+str(speed_time)
            content=content+'\n'+speed_time
    
            fileName=dir+'/'+name+'.txt'
            f=open(fileName,'w+')
            print u'正在获取%s的个人信息保存到%s'%(name,fileName)
            f.write(content.encode('utf-8'))
    
        #创建目录
        def mkdir(self,path):
            path=path.strip()
            print u'创建目录%s'%path
            if os.path.exists(path):
                return False
            else:
                os.makedirs(path)
                return True
    
    def main():
        spider = Spider()
        #获取前 n 页
        spider.getContent(1)
    
    if __name__ == '__main__':
        main()
    

    日志

    发现一位MM 名字叫田媛媛 年龄27 坐标广州市
    田媛媛的个人主页是 //mm.taobao.com/self/model_card.htm?user_id=687471686
    继续获取详情页面数据...
    获取个人信息
    昵 称:田媛媛
    生  日: 公历  06月22日
    所在城市:广州市
    职  业:平面模特 设计师 T台、展模特
    血  型:
    学校/专业:广东纺织职业技术学院    服装设计与展示
    风  格:欧美 韩版 街头
    168.0CM
    46.0KG
    83-62-89
    34
    38码
    创建目录MMSpider/田媛媛
    头像地址https://gtd.alicdn.com/sns_logo/i6/TB1EjxDKXXXXXXhaXXXSutbFXXX_120x120.jpg 田媛媛
    MMSpider/田媛媛/田媛媛.jpg
    https://gtd.alicdn.com/sns_logo/i6/TB1EjxDKXXXXXXhaXXXSutbFXXX_120x120.jpg
    https://gtd.alicdn.com/imgextra/i5/T16COKXA4fXXb1upjX.jpg
     个性域名 http://mm.taobao.com/tyy6160
    相册页面 https://mm.taobao.com/self/model_album.htm?user_id=687471686
    第一个相册链接 https://mm.taobao.com/self/album_photo.htm?user_id=687471686&album_id=10000702574&album_flag=0
    田媛媛 的相册有16张照片, 尝试全部下载....
    下载照片地址MMSpider/田媛媛/田媛媛1.jpg
    https://img.alicdn.com/imgextra/i2/687471686/TB1cK23LVXXXXXjXVXXXXXXXXXX_!!0-tstar.jpg_290x10000.jpg
    下载照片地址MMSpider/田媛媛/田媛媛2.jpg
    https://img.alicdn.com/imgextra/i1/687471686/TB1NmL0LVXXXXbQXVXXXXXXXXXX_!!0-tstar.jpg_290x10000.jpg
    下载照片地址MMSpider/田媛媛/田媛媛3.jpg
    https://img.alicdn.com/imgextra/i2/687471686/TB1ueQeLVXXXXcOXXXXXXXXXXXX_!!0-tstar.jpg_290x10000.jpg
    

    后记

    跑几次就被反扒了-,-,
    xpath 需要好好学习一下,这种浏览器的方式抓数据真的很慢(时间成本)。

    [python 爬虫01] 邪恶动态图

    相关文章

      网友评论

          本文标题:[python 爬虫02] 淘宝MM

          本文链接:https://www.haomeiwen.com/subject/stwfattx.html