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

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

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


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

前面基本上将爬取淘宝MM的所有代码都弄完了,但是还有一个问题,那个代码只能再linux系统下面跑,那在windows上怎么办呢

本文就讲解一下怎么再windows下面跑通这个代码

首先需要在windows下面安装好 selenium

这个比较简单,直接实用pip命令就可以了

pip install selenium

安装好之后测试一下,到底安装成功没有:

F:\Python>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from selenium import webdriver
>>>

即在python 终端 尝试一下能否导入这个包,没有报错就OK了。

那其次呢,需要安装一个工具:PhantomJS

它的官网下载地址如下:

点击  http://phantomjs.org/

当然官网访问下载的比较慢,也可以在下面的地址来下载

http://download.csdn.net/detail/qiqiyingse/9785222

下载完成之后,将phantomjs-2.1.1-windows\bin\phantomjs.exe复制一份到 Python27\Scripts 这个目录下

这样比较方便我们找到它

然后呢,我们需要把上一篇的代码做一个小小的调整

#指明PhantomJS的访问路径
self.driver = webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe')
self.driver_detail=webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe')

同时下面这里也需要改变一下

			#定义相册地址
			img_path=path+'/'+str(sigelmm['album_num'])+'/'+sigelmm['album_name']+str(datetime.date(2017,3,17))

把相册目录的名字后面加上了一个时间,其实加什么都行,但是不加这里会抱一个错误:

再windows下面, 当调用 os.makedirs(img_path)  去创建目录的时候,她会把目录名字 “2016年春夏韩国…”  自动省略为“2016年春夏韩国”

也就是说末尾的三个句号被省略了,但是在这个字符串后面随便加点什么的话,就OK了

整体代码如下:

#coding=utf-8
__author__ = 'Jimy_fengqi'

import os,sys,time,urllib,uuid,datetime
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(executable_path=r'C:\Python27\Scripts\phantomjs.exe')
		self.driver_detail=webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe')
	
	#自定义打印函数
	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,u'个人相册地址是:%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很懒,一个相册都没有')
		#遍历每一个相册
		try:
			for sigelmm in album_urls_and_name:
				#获取单个相册页面内容
				self.driver_detail.get(sigelmm['url'])
				#防止页面没有加载完毕,这样就能获得当前页面所有的照片
				js = "var q=document.body.scrollTop=100000" 
				try:
					for i in range(15):
						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')
					current_info= u'在%s相册中得到了%s张照片 ' % (sigelmm['album_name'],str(len(images_all)))
					self.my_print(1,current_info)

					#定义相册地址
					img_path=path+'/'+str(sigelmm['album_num'])+'/'+sigelmm['album_name']+str(datetime.date(2017,3,17))
					self.my_print(0,img_path)
					
					#创建相册目录
					if not os.path.exists(img_path):
						os.makedirs(img_path)
				except Exception,e:
					self.my_print(1,e)

				#遍历所有的照片,并进行存贮
				img_count=1
				for imgurl in images_all:
					#获得每一张照片的地址
					imgurl= imgurl.get_attribute('src')

					#为每一张照片命名
					filename =img_path+"/"+str(uuid.uuid1())+".jpg"
					#filename =img_path+"/"+str(img_count)+".jpg"
					self.my_print(0,filename)
					self.my_print(0,imgurl)
					img_urls.append(imgurl)
					#存贮每一个照片,将图片下载到指定路径中
					try:
						urllib.urlretrieve(imgurl, filename)
						#防止照片存贮错误,休眠0.1s
						time.sleep(0.1)
					except Exception,e:
						self.my_print(1,e)
					self.my_print(1,u'保存【%s】的【%s】相册中的的第%s个图片到\t【%s】\t完毕' % (sigelmm['url_album_name'],sigelmm['album_name'],img_count,img_path))
					img_count +=1
		except Exception,e:
			self.my_print(1,e)

		
		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)

    原文作者:python爬虫
    原文地址: https://blog.csdn.net/qiqiyingse/article/details/62985485
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞