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

来源:互联网 发布:美国令人感动的 知乎 编辑:程序博客网 时间:2024/05/23 14:56

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


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


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


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

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


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

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

pip install selenium

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

F:\Python>pythonPython 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32Type "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,datetimefrom selenium import webdriverreload(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决定是否打印logif is_print:print contentelse: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').textself.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+'/'+namepath=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 Noneexcept: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 nextpagesexcept: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=1while 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={}#获取相册地址urlalbum_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 = 0else:nextpages.click()#将获取到的内容返回return album_urls_and_nameexcept Exception,e:self.my_print(1,e)#获取单个相册内所有的图片地址def getSingelAlumImageUrl(self,album_urls_and_name,path):#定义全局变量,存贮照片地址rulimg_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=1for 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.1stime.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 +=1except 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"个人主页地址为:" + mmUrlf.write(mmLocation)except Exception,e:self.my_print(1,e)return Falsereturn Trueif __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)





1 0