[python 爬虫02] 淘宝MM

2017-04-06  本文已影响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] 邪恶动态图

上一篇下一篇

猜你喜欢

热点阅读