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程序