python爬虫(14)获取淘宝MM个人信息及照片(中)

python爬虫(14)获取淘宝MM个人信息及照片(中)



python爬虫(14)获取淘宝MM个人信息及照片(上)


python爬虫(14)获取淘宝MM个人信息及照片(下)(windows版本)


在上篇文章中,已经有了基本的爬取策略,这一篇,直接就是整个爬去淘宝MM的所有内容

不过本文也有几个缺点:

1.只是利用单线程爬去,所以爬取比较慢

2.没有设置控制功能

3.缺少选择功能

4.没有图形显示功能

但是用这个代码拿来练手,或者学习爬虫的逻辑思维是很不错的选择


代码如下:

#!/usr/bin/python
#coding=utf-8
__author__ = 'Jimy_fengqi'

import os,sys,time,urllib,uuid
from selenium import webdriver

reload(sys)
sys.setdefaultencoding('utf-8')

class TaoBaoSpider:
	def __init__(self):
		#自定义页面起始页
		self.page=1
		#定义存储的文件夹名字
		self.dirName='Jimy_fengqi'
		#创建两个webdriver,防止后续页面抢资源,一个顾不过来
		self.driver = webdriver.PhantomJS()
		self.driver_detail=webdriver.PhantomJS()
	
	#自定义打印函数
	def my_print(self,is_print,content):
		#通过变量is_print决定是否打印log
		if is_print:
			print content
		else:
			return
	#页面加载入口	
	def getContent(self,maxPage):
		#根据传入的maxPage爬取指定的页面数量
		for index in range(1,maxPage+1):
			self.my_print(1,u'正在爬取第%d页' % index)
			self.getMMurl(index)
		self.driver.quit()
		self.driver_detail.quit()
	
	#获取页面内容,同时找到MM的个人主页入口
	def getMMurl(self,index):
		url="https://mm.taobao.com/json/request_top_list.htm?page="+str(index)
		#获取页面内容
		self.driver.get(url)
		#找到当前页面所有的个人主页入口
		items=self.driver.find_elements_by_xpath('//div[@class="list-item"]/div[1]/div[1]/p/a')
		mmUrls=[]
		for item in items:
			#对获得到的url进行处理,否则将会访问到错误的页面
			MMurl= item.get_attribute('href').replace("model_card","model_info")
			#将获得到的MM主页地址存贮并传到下一个函数中处理
			mmUrls.append(MMurl)
			#print MMurl
			#获取个人页面详情
			self.getMMdetail(MMurl)
	#获取个人页面详情		
	def getMMdetail(self,mmUrl):
		#获取MM个人主页的网页内容
		self.driver_detail.get(mmUrl)
		self.my_print(0,self.driver_detail.current_url)
		
		#获取MM名字
		name=self.driver_detail.find_element_by_xpath('//div[@class="mm-p-model-info-left-top"]/dl/dd/a').text
		self.my_print(1,u'发现一位MM 名字叫 %s 坐标 %s 正在爬取...' % (name,mmUrl))
		
		#获取MM个人头像地址
		mmicon=self.driver_detail.find_element_by_xpath('//div[@class="mm-p-model-info-left-top"]/dl/dt/a/img').get_attribute('src')
		self.my_print(0, mmicon)
		
		#获取个人简介信息
		base_msg=self.driver_detail.find_elements_by_xpath('//div[@class="mm-p-info mm-p-base-info"]/ul/li')	
		brief=''
		for item in base_msg:
			brief+=item.text+'\n'
		
		#保存信息
		path=self.dirName+'/'+name
		path=path.strip()	
		self.saveBriefInfo(path,name,mmicon,str(brief),mmUrl)
		
		#获取相册地址,并跳转过去
		images_url=self.driver_detail.find_element_by_xpath('//ul[@class="mm-p-menu"]//a').get_attribute('href')
		self.my_print(1,'个人相册地址是:%s' % images_url)
		
		#获取所有的相册地址,以及相册名字
		album_urls_and_name=self.getAllAlum(images_url,name)
		#获取单个相册内所有的图片地址,并将起存贮起来
		img_urls=self.getSingelAlumImageUrl(album_urls_and_name,path)
		
	#判断是否是到达最后一页相册
	def isEndPage(self):
		try:
			#判断是否到达最后一页,最后一页只有通过下面的表达式会找到,因此不到最后一页将找不到,代码就会走到except语句
			nextpages=self.driver.find_element_by_xpath('//div[@class="pagination"]/a[@class="page-end"]')
			self.my_print(1, u"已经到达最后一页")
			return None
		except:
			return 1
	#获取个人相册当前页面下一页内容	
	def getPage(self):
		try:
			#获取下一页的位置元素,通过click的方法能够到达下一页
			nextpages=self.driver_detail.find_element_by_xpath('//div[@class="pagination"]/a[@class="page-next J_AjaxifyTrigger"]')
			return nextpages
		except:
			self.my_print(1, u"相册爬取完毕。。。")
			return None
	
	#获取所有的相册地址,以及相册名字
	def getAllAlum(self,images_url,name):
		try:
			#定义存贮相册地址url和相册名字的变量
			album_urls_and_name=[]
			self.driver_detail.get(images_url)
			
			#定义相册页面
			album_num_page=1
			#定义相册数量
			album_num=1
			while self.isEndPage():
				#如果相册页面到达最后一页就退出
				if album_num_page == 0:
					break;
				#获取当前页面内的相册
				photos=self.driver_detail.find_elements_by_xpath('//div[@class="mm-photo-cell"]/div/h4/a')
				for alum_url in photos:
					#临时变量,存贮相册地址url和相册名字的变量
					url_name={}
					#获取相册地址url
					album_url=alum_url.get_attribute('href')
					#获取相册名字
					url_name['album_name']= alum_url.text
					#self.my_print(1,u'发现第%d个相册:%s' % (album_num,url_name['album_name']))
					#将相册地址url,相册名字,第几个相册放入变量中,以作后续处理
					
					url_name['url']=album_url#相册地址
					url_name['album_num']=album_num_page#相册在第几页
					url_name['url_album_name']=name#MM 的名字
					album_urls_and_name.append(url_name)
					album_num+=1

				#当前页面获取完毕,继续获取下一个页面的相册
				album_num_page +=1	
				#获取个人相册当前页面下一页内容				
				nextpages=self.getPage()
				#到达最后一页就将相册页面重置为0,否则通过点击事件进入下一个页面
				if nextpages == None:
					album_num_page = 0
				else:
					nextpages.click()
			#将获取到的内容返回
			return album_urls_and_name
		except Exception,e:
			self.my_print(1,e)
	#获取单个相册内所有的图片地址	
	def getSingelAlumImageUrl(self,album_urls_and_name,path):
		#定义全局变量,存贮照片地址rul
		img_urls=[]
		#获取相册数量
		album_len=len(album_urls_and_name)
		self.my_print(1,u'总共发现%d个相册' % album_len)
		#如果相册数额为空,直接返回
		if not album_len:
			self.my_print(1,u'这个MM很懒,一个相册都没有')
		#遍历每一个相册
		for sigelmm in album_urls_and_name:
			#获取单个相册页面内容
			self.driver_detail.get(sigelmm['url'])
			#防止页面没有加载完毕,这样就能获得当前页面所有的照片
			js = "var q=document.body.scrollTop=100000" 
			for i in range(10):
				self.driver_detail.execute_script(js)
				time.sleep(0.1)
			#得到当前页面所有的照片
			images_all=self.driver_detail.find_elements_by_xpath('//div[@class="mm-photoW-cell-middle"]/div/a/img')
			self.my_print(1, (sigelmm['url']+str(len(images_all))))
			#定义相册地址
			img_path=path+'/'+str(sigelmm['album_num'])+'/'+sigelmm['album_name']
			self.my_print(1,img_path)
			#创建相册目录
			if not os.path.exists(img_path):
				os.makedirs(img_path)
			#遍历所有的照片,并进行存贮
			img_count=1
			for imgurl in images_all:
				#获得每一张照片的地址
				imgurl= imgurl.get_attribute('src')
				#print imgurl
				#为每一张照片命名
				filename =img_path+"/%s.jpg" % str(uuid.uuid1())
				img_urls.append(imgurl)
				#存贮每一个照片
				urllib.urlretrieve(imgurl, filename)#将图片下载到指定路径中
				#防止照片存贮错误,休眠0.1s
				time.sleep(0.1)
				self.my_print(1,'保存%s的%s相册中的的第%s个图片到\t%s\t完毕' % (sigelmm['url_album_name'],sigelmm['album_name'],img_count,img_path))
				img_count +=1
		
		return img_urls
		
	#保存信息
	def saveBriefInfo(self,path,name,mmicon,brief,mmUrl):
		#创建目录
		try:
			if not os.path.exists(path):
				os.makedirs(path)
			#保存个人头像
			iconpath=path+'/'+name+'.jpg'
			urllib.urlretrieve(mmicon, iconpath)
			
			#保存个人简介信息到文本中
			fileName=path+'/'+name+'.txt'
			with open(fileName,'w+') as f:
				self.my_print(1,u'正在保存%s的个人信息到%s'%(name,path))
				f.write(brief.encode('utf-8'))
				mmLocation=u"个人主页地址为:" + mmUrl
				f.write(mmLocation)
		except Exception,e:
			self.my_print(1,e)
			return False
		return True
			
if __name__ == '__main__':
	print ''''
			***************************************** 
			**    Welcome to Spider for TaobaoMM   ** 
			**      Created on 2017-3-17           ** 
			**      @author: Jimy_fengqi           ** 
			*****************************************
		http://blog.csdn.net/qiqiyingse/article/details/62894826
			'''	
	spider=TaoBaoSpider()
	spider.getContent(1)

运行结果:

            ***************************************** 
            **    Welcome to Spider for TaobaoMM   ** 
            **      Created on 2017-3-17           ** 
            **      @author: Jimy_fengqi           ** 
            *****************************************
正在爬取第1页
发现一位MM 名字叫 田媛媛 坐标 https://mm.taobao.com/self/model_info.htm?user_id=687471686 正在爬取...
正在保存田媛媛的个人信息到Jimy_fengqi/田媛媛
个人相册地址是:https://mm.taobao.com/self/model_album.htm?user_id=687471686
相册爬取完毕。。。
总共发现59个相册
https://mm.taobao.com/self/album_photo.htm?user_id=687471686&album_id=10000702574&album_flag=045
Jimy_fengqi/田媛媛/1/2016年春夏韩国...
保存田媛媛的2016年春夏韩国...相册中的的第1个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第2个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第3个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第4个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第5个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第6个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第7个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第8个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第9个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第10个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第11个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第12个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕
保存田媛媛的2016年春夏韩国...相册中的的第13个图片到	Jimy_fengqi/田媛媛/1/2016年春夏韩国...	完毕

后续增加 exe程序

posted @ 2017-03-17 19:12  枫奇丶宛南  阅读(62)  评论(0编辑  收藏  举报