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

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

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


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

网上看到有获取淘宝MM照片的python程序,于是自己也忍不住照着学习一下

不得不说,淘宝网站的网页有所变化,只是纯粹把之前网上的程序down下来,程序还真的运行不起来。

有鉴于此,这里就使用新的方法来重新编码,获取淘宝MM的图片

思路是 访问主页面    获取当前页面每一个模特的主页url,  在模特的主页 获取个人信息以及头像保存好,同时获取个人相册地址

在个人相册获取相册数量,获取每一个相册名字以及该相册的照片数量,进入每一个相册获取每一个相册的相片地址

1.获取入口地址

#!/usr/bin/python
#coding=utf-8
__author__ = 'Jimy_fengqi'

from selenium import webdriver

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

class TaoBaoSpider:
	def __init__(self):
		#自定义页面起始页
		self.page=1
		#定义存储的文件夹名字
		self.dirName='Jimy_fengqi'
		#创建webdriver全局变量
		self.driver = webdriver.PhantomJS()

	#页面加载入口	
	def getContent(self,maxPage):
		for index in range(1,maxPage+1):
			print '当前是第%d页' % index
			self.getMMurl(index)
		self.driver.quit()
	#获取页面内容,同时找到MM的个人主页入口
	def getMMurl(self,index):
		url="https://mm.taobao.com/json/request_top_list.htm?page="+str(index)
		#获取页面内容
		self.driver.get(url)
		#找到当前页面所有的个人主页入口,通过xpath的方式来匹配
		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")
			mmUrls.append(MMurl)
			print MMurl

spider=TaoBaoSpider()
spider.getContent(1)

结果如下:

当前是第1页
https://mm.taobao.com/self/model_info.htm?user_id=687471686
https://mm.taobao.com/self/model_info.htm?user_id=405095521
https://mm.taobao.com/self/model_info.htm?user_id=631300490
https://mm.taobao.com/self/model_info.htm?user_id=414457129
https://mm.taobao.com/self/model_info.htm?user_id=141234233
https://mm.taobao.com/self/model_info.htm?user_id=96614110
https://mm.taobao.com/self/model_info.htm?user_id=37448401
https://mm.taobao.com/self/model_info.htm?user_id=74386764
https://mm.taobao.com/self/model_info.htm?user_id=523216808
https://mm.taobao.com/self/model_info.htm?user_id=46599595

2.加载MM的个人主页

接着上面的函数继续写就OK了,代码如下:

#!/usr/bin/python
#coding=utf-8
__author__ = 'Jimy_fengqi'

import urllib2,re,os,datetime,sys,time
from selenium import webdriver
from bs4 import BeautifulSoup as BS

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 getContent(self,maxPage):
		for index in range(1,maxPage+1):
			print '当前是第%d页' % index
			self.getMMurl(index)
		self.driver.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")
			mmUrls.append(MMurl)
			print MMurl
			self.getMMdetail(MMurl)
	#获取个人页面详情		
	def getMMdetail(self,mmUrl):
		self.driver.get(mmUrl)
		print self.driver.current_url	
spider=TaoBaoSpider()
spider.getContent(1)

代码逻辑什么的也挺合理的,但是现在问题来了,代码运行之后,显示如下:

当前是第1页
https://mm.taobao.com/self/model_info.htm?user_id=687471686
https://mm.taobao.com/self/model_info.htm?user_id=687471686
Traceback (most recent call last):
  File "12.get_taobao_pic.py", line 49, in <module>
    spider.getContent(1)
  File "12.get_taobao_pic.py", line 27, in getContent
    self.getMMurl(index)
  File "12.get_taobao_pic.py", line 39, in getMMurl
    MMurl= item.get_attribute('href').replace("model_card","model_info")
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 141, in get_attribute
    resp = self._execute(Command.GET_ELEMENT_ATTRIBUTE, {'name': name})
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 494, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: {"errorMessage":"Element does not exist in cache","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:46191","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"GET","url":"/attribute/href","urlParsed":{"anchor":"","query":"","file":"href","directory":"/attribute/","path":"/attribute/href","relative":"/attribute/href","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/attribute/href","queryKey":{},"chunks":["attribute","href"]},"urlOriginal":"/session/810afa50-0ab8-11e7-bd22-c72625d9ecf4/element/:wdc:1489717323088/attribute/href"}}
Screenshot: available via screen

什么意思呢?

其实原因是这样的,当在函数 getMMdetail里面再次使用 self.driver来访问页面的时候, 之前的那个页面没有退出呢,因此造成了页面的访问冲突

我们可以再次定义一个webdriver来访问新的页面

	def getMMdetail(self,mmUrl):
		self.driver_detail.get(mmUrl)
		print self.driver_detail.current_url

这样就能正常访问了

3.获取个人信息

个人主页能够访问了,那么我们接下来就获取MM的一些个人信息了

	def getMMdetail(self,mmUrl):
		#获取个人页面详情
		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'

通过这个函数,就捕获到了MM的名字, 个人头像,和她的个人简介

4.保存信息

信息获取完毕,就开始将捕获到的信息,保存下来 整体代码如下:

#!/usr/bin/python
#coding=utf-8
__author__ = 'Jimy_fengqi'

import re,os,datetime,sys,time,urllib
from selenium import webdriver
from bs4 import BeautifulSoup as BS

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):
		if is_print:
			print content
		else:
			return
	#页面加载入口	
	def getContent(self,maxPage):
		for index in range(1,maxPage+1):
			self.my_print(1,u'当前是第%d页' % index)
			self.getMMurl(index)
		self.driver.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")
			mmUrls.append(MMurl)
			#print MMurl
			self.getMMdetail(MMurl)
	#获取个人页面详情		
	def getMMdetail(self,mmUrl):
		#获取个人页面详情
		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.saveBriefInfo(name,mmicon,str(brief),mmUrl)
		
	def saveBriefInfo(self,name,mmicon,brief,mmUrl):
		path=self.dirName+'/'+name
		path=path.strip()
		#创建目录
		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)
		return path
		
		
if __name__ == '__main__':
	print ''''' 
            ***************************************** 
            **    Welcome to Spider for TaobaoMM   ** 
            **      Created on 2017-3-17           ** 
            **      @author: Jimy_fengqi           ** 
            *****************************************'''	
	spider=TaoBaoSpider()
	spider.getContent(1)

运行结果:

            ***************************************** 
            **    Welcome to Spider for TaobaoMM   ** 
            **      Created on 2017-3-15           ** 
            **      @author: Jimy_fengqi           ** 
            *****************************************
当前是第1页
发现一位MM 名字叫田媛媛 坐标https://mm.taobao.com/self/model_info.htm?user_id=687471686 正在爬取。。。
正在保存田媛媛的个人信息到Jimy_fengqi/田媛媛
发现一位MM 名字叫v悦悦 坐标https://mm.taobao.com/self/model_info.htm?user_id=405095521 正在爬取。。。
正在保存v悦悦的个人信息到Jimy_fengqi/v悦悦
发现一位MM 名字叫崔辰辰 坐标https://mm.taobao.com/self/model_info.htm?user_id=631300490 正在爬取。。。
正在保存崔辰辰的个人信息到Jimy_fengqi/崔辰辰
发现一位MM 名字叫大猫儿 坐标https://mm.taobao.com/self/model_info.htm?user_id=414457129 正在爬取。。。
正在保存大猫儿的个人信息到Jimy_fengqi/大猫儿
发现一位MM 名字叫金甜甜 坐标https://mm.taobao.com/self/model_info.htm?user_id=141234233 正在爬取。。。
正在保存金甜甜的个人信息到Jimy_fengqi/金甜甜
发现一位MM 名字叫紫轩 坐标https://mm.taobao.com/self/model_info.htm?user_id=96614110 正在爬取。。。
正在保存紫轩的个人信息到Jimy_fengqi/紫轩
发现一位MM 名字叫谢婷婷 坐标https://mm.taobao.com/self/model_info.htm?user_id=37448401 正在爬取。。。
正在保存谢婷婷的个人信息到Jimy_fengqi/谢婷婷
发现一位MM 名字叫夏晨洁 坐标https://mm.taobao.com/self/model_info.htm?user_id=74386764 正在爬取。。。
正在保存夏晨洁的个人信息到Jimy_fengqi/夏晨洁
发现一位MM 名字叫Cherry 坐标https://mm.taobao.com/self/model_info.htm?user_id=523216808 正在爬取。。。
正在保存Cherry的个人信息到Jimy_fengqi/Cherry
发现一位MM 名字叫雪倩nika 坐标https://mm.taobao.com/self/model_info.htm?user_id=46599595 正在爬取。。。
正在保存雪倩nika的个人信息到Jimy_fengqi/雪倩nika

    原文作者:python爬虫
    原文地址: https://blog.csdn.net/qiqiyingse/article/details/62427155
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞