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)