python爬虫(14)获取淘宝MM个人信息及照片(中)
2017-03-17 19:12
686 查看
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: 4000 #对获得到的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程序
相关文章推荐
- python爬虫(14)获取淘宝MM个人信息及照片(下)(windows版本)
- python爬虫(14)获取淘宝MM个人信息及照片(上)
- python爬虫获取淘宝妹子信息和相片
- Python爬虫模拟登录京东获取个人信息
- Python 爬虫获取 URP 教务系统学籍信息-你的个人信息正暴露在互联网中!
- Python爬虫实战:抓取淘宝MM照片
- Python爬虫实战(4):抓取淘宝MM照片
- Python爬虫实战:抓取淘宝MM照片
- Python爬虫实战(4):抓取淘宝MM照片
- Python爬虫实战(4):抓取淘宝MM照片
- python爬虫获取全国天气信息
- windows下使用python的scrapy爬虫框架,爬取个人博客文章内容信息
- Python爬虫框架Scrapy实战教程---定向批量获取职位招聘信息
- python 爬虫实战--登陆学校教务系统获取成绩信息
- Python 淘宝系列(三): 模拟登陆成功后获取购物车信息
- Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
- Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
- Python爬虫框架Scrapy实战之定向批量获取职位招聘信息
- Python爬虫实战五之模拟登录淘宝并获取所有订单
- python 爬虫获取网站信息(一)