代码
#coding=utf-8
'''
原作者: http://cuiqingcai.com/1001.html
更新日志:
2017-04-06, 修正获取相册 url
'''
import urllib2,re,os,datetime
from selenium import webdriver
class Spider:
def __init__(self):
self.page=1
self.dirName='MMSpider'
#这是一些配置 关闭loadimages可以加快速度 但是第二页的图片就不能获取了打开(默认)
cap = webdriver.DesiredCapabilities.PHANTOMJS
cap["phantomjs.page.settings.resourceTimeout"] = 1000
#cap["phantomjs.page.settings.loadImages"] = False
#cap["phantomjs.page.settings.localToRemoteUrlAccessEnabled"] = True
self.driver = webdriver.PhantomJS(desired_capabilities=cap)
def getContent(self,maxPage):
for index in range(1, maxPage+1):
self.LoadPageContent(index)
#获取页面内容提取
def LoadPageContent(self,page):
#记录开始时间
begin_time=datetime.datetime.now()
url="https://mm.taobao.com/json/request_top_list.htm?page="+str(page)
self.page+=1;
USER_AGENT='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36'
headers = {'User-Agent':USER_AGENT }
request=urllib2.Request(url,headers=headers)
response=urllib2.urlopen(request)
#正则获取
pattern_link=re.compile(r'<div.*?class="pic-word">.*?<img src="(.*?)".*?'
r'<a.*?class="lady-name".*?href="(.*?)".*?>(.*?)</a>.*?'
r'<em>.*?<strong>(.*?)</strong>.*?'
r'<span>(.*?)</span>'
,re.S)
items=re.findall(pattern_link,response.read().decode('gbk'))
for item in items:
#头像,个人详情,名字,年龄,地区
print u'发现一位MM 名字叫%s 年龄%s 坐标%s'%(item[2],item[3],item[4])
print u'%s的个人主页是 %s'%(item[2],item[1])
print u'继续获取详情页面数据...'
#详情页面
detailPage=item[1]
name=item[2]
self.getDetailPage(detailPage,name,begin_time)
def getDetailPage(self,url,name,begin_time):
url='http:'+url
self.driver.get(url)
print u'获取个人信息'
base_msg=self.driver.find_elements_by_xpath('//div[@class="mm-p-info mm-p-base-info"]/ul/li')
brief=''
for item in base_msg:
print item.text
brief+=item.text+'\n'
#保存个人信息
dir=self.dirName+'/'+name
self.mkdir(dir)
#保存头像
try:
icon_url=self.driver.find_element_by_xpath('//div[@class="mm-p-model-info-left-top"]//img')
icon_url=icon_url.get_attribute('src')
self.saveIcon(icon_url,dir,name)
except Exception,e:
print u'保存头像失败 %s'%e.message
#保存高清图
try:
img_url=self.driver.find_element_by_xpath('//*[@id="J_MmInfo"]/div[2]/div/a/img')
img_url=img_url.get_attribute('src')
self.saveImg(img_url, os.path.join(dir, name+"_hd.jpg"))
except Exception,e:
print u' 保存高清图失败 %s'%e.message
try:
website = self.driver.find_element_by_xpath('//*[@id="J_MmInfo"]/div[1]/div[3]/ul/li/span')
website = 'http:' + website.text
print u' 个性域名', website
brief += website + '\n'
except Exception,e:
print u'获取个性域名失败 %s' % e.message
images_url=self.driver.find_element_by_xpath('//ul[@class="mm-p-menu"]//a')
images_url=images_url.get_attribute('href')
print u'相册页面', images_url
try:
self.getAllImage(images_url,name)
except Exception,e:
print u'获取所有相册异常 %s'%e.message
end_time=datetime.datetime.now()
#保存个人信息 以及耗时
try:self.saveBrief(brief,dir,name,end_time-begin_time)
except Exception,e:
print u'保存个人信息失败 %s'%e.message
#获取所有图片
def getAllImage(self,images_url,name):
self.driver.get(images_url)
#只获取第一个相册
photos=self.driver.find_element_by_xpath('//div[@class="mm-photo-cell-middle"]//h4/a')
photos_url=photos.get_attribute('href')
print u'第一个相册链接', photos_url
#进入相册页面获取相册内容
self.driver.get(photos_url)
images_all=self.driver.find_elements_by_xpath('//div[@class="mm-photoimg-area"]//img')
self.saveImgs(images_all,name)
def saveImgs(self,images,name):
index=1
print u'%s 的相册有%s张照片, 尝试全部下载....'%(name,len(images))
for imageUrl in images:
splitPath = imageUrl.get_attribute('src').split('.')
fTail = splitPath.pop()
if len(fTail) > 3:
fTail = "jpg"
fileName = self.dirName+'/'+name +'/'+name+ str(index) + "." + fTail
print u'下载照片地址%s '%fileName
self.saveImg(imageUrl.get_attribute('src'),fileName)
index+=1
def saveIcon(self,url,dir,name):
print u'头像地址%s %s '%(url,name)
splitPath=url.split('.')
fTail=splitPath.pop()
fileName=dir+'/'+name+'.'+fTail
print fileName
self.saveImg(url,fileName)
#写入图片
def saveImg(self,imageUrl,fileName):
print imageUrl
u=urllib2.urlopen(imageUrl)
data=u.read()
f=open(fileName,'wb')
f.write(data)
f.close()
#保存个人信息
def saveBrief(self,content,dir,name,speed_time):
speed_time=u'当前MM耗时 '+str(speed_time)
content=content+'\n'+speed_time
fileName=dir+'/'+name+'.txt'
f=open(fileName,'w+')
print u'正在获取%s的个人信息保存到%s'%(name,fileName)
f.write(content.encode('utf-8'))
#创建目录
def mkdir(self,path):
path=path.strip()
print u'创建目录%s'%path
if os.path.exists(path):
return False
else:
os.makedirs(path)
return True
def main():
spider = Spider()
#获取前 n 页
spider.getContent(1)
if __name__ == '__main__':
main()
日志
发现一位MM 名字叫田媛媛 年龄27 坐标广州市
田媛媛的个人主页是 //mm.taobao.com/self/model_card.htm?user_id=687471686
继续获取详情页面数据...
获取个人信息
昵 称:田媛媛
生 日: 公历 06月22日
所在城市:广州市
职 业:平面模特 设计师 T台、展模特
血 型:
学校/专业:广东纺织职业技术学院 服装设计与展示
风 格:欧美 韩版 街头
168.0CM
46.0KG
83-62-89
34
38码
创建目录MMSpider/田媛媛
头像地址https://gtd.alicdn.com/sns_logo/i6/TB1EjxDKXXXXXXhaXXXSutbFXXX_120x120.jpg 田媛媛
MMSpider/田媛媛/田媛媛.jpg
https://gtd.alicdn.com/sns_logo/i6/TB1EjxDKXXXXXXhaXXXSutbFXXX_120x120.jpg
https://gtd.alicdn.com/imgextra/i5/T16COKXA4fXXb1upjX.jpg
个性域名 http://mm.taobao.com/tyy6160
相册页面 https://mm.taobao.com/self/model_album.htm?user_id=687471686
第一个相册链接 https://mm.taobao.com/self/album_photo.htm?user_id=687471686&album_id=10000702574&album_flag=0
田媛媛 的相册有16张照片, 尝试全部下载....
下载照片地址MMSpider/田媛媛/田媛媛1.jpg
https://img.alicdn.com/imgextra/i2/687471686/TB1cK23LVXXXXXjXVXXXXXXXXXX_!!0-tstar.jpg_290x10000.jpg
下载照片地址MMSpider/田媛媛/田媛媛2.jpg
https://img.alicdn.com/imgextra/i1/687471686/TB1NmL0LVXXXXbQXVXXXXXXXXXX_!!0-tstar.jpg_290x10000.jpg
下载照片地址MMSpider/田媛媛/田媛媛3.jpg
https://img.alicdn.com/imgextra/i2/687471686/TB1ueQeLVXXXXcOXXXXXXXXXXXX_!!0-tstar.jpg_290x10000.jpg
后记
跑几次就被反扒了-,-,
xpath 需要好好学习一下,这种浏览器的方式抓数据真的很慢(时间成本)。
网友评论