先模拟登录
再爬取照片

# -*- coding:utf-8 -*-import urllib
import urllib2
import cookielib
import re
import webbrowser
import tool
import os#模拟登录淘宝类
class Taobao:#初始化方法def __init__(self):#登录的URLself.siteURL = 'http://mm.taobao.com/json/request_top_list.htm'self.loginURL = "https://login.taobao.com/member/login.jhtml"#代理IP地址,防止自己的IP被封禁self.proxyURL = 'http://120.193.146.97:843'#登录POST数据时发送的头部信息self.loginHeaders =  {'Host':'login.taobao.com','User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0','Referer' : 'https://login.taobao.com/member/login.jhtml','Content-Type': 'application/x-www-form-urlencoded','Connection' : 'Keep-Alive'}#用户名self.username = 'xxxxxxxxxxxxxxxxxx'#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息self.ua = '008#JxEAdwAWAjoAAAAAADM4AAcBABQ5AQEBFaNLXlJ0Y2xodVJ1YHVoYgUBABo5BcsAuAEBAQES6QFLXlJ0Y2xodVJ1YHVoYhYBAAQ3AQEBBAEACTcEBgCuAQEBxwQBAAk3BD0AoAEBAaMWAQAENwEBAQ0BABo+AQ9WaG9lbnZyITZWSE8hMDgtMS0xLTMzNwwBADcBMDU1NjAwOTY1NDM2OTsyZ2U5ZGQ1ZDViZGNlZTM4OTA5MDdkYDkyMzA5NmU2YDUzNzczNWBjFAEABjcDJe08pBcBAAQ3AQH8AQEACDcBAFHv/q+/AgEABjQBAwA1MxMBABY2BI4BEHRzKXJzKUZkKSMjKmBzZnRsCwEApjeKARZpdXVxcjsuLm1uZmhvL3VgbmNgbi9ibmwubGRsY2RzLm1uZmhvL2tpdWxtPnJxbDxgMzBjbi82NjM1ODMzLzA4ODY0NzIzNzgvMC9PUEw4ZnYnZzx1bnEnc2RlaHNkYnVUU008aXV1cXIkMzQyQCQzNDNHJDM0M0d2dnYvdWBuY2BuL2JubCQzNDNHaXV1cXI7Li52dnYvdWBuY2BuL2JubC4DAQAoNwEBYAEBAQEBAQZuAQECfAEBBoEBAQU5AQEGgQEBBREBAQEBAQEBAQQBAAk3BHgAhQEBAV8EAQAJNwRjAJABAQF+BAEACTcF6AC1AQEB8AUBABQ3BcgAVgEBAQENqAAFZQHoAecB5xYBAAQ3AQEBBwEAFDkAAQES80teUnRjbGh1UnVgdWhiBwEABjcBAQEVrA=='#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码self.password2 = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx每个人不一样哦'self.post = post = {'ua':self.ua,'TPL_checkcode':'','CtrlVersion': '1,0,0,7','TPL_password':'','TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443','TPL_username':self.username,'loginsite':'0','newlogin':'0','from':'tb','fc':'default','style':'default','css_style':'','tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A','support':'000001','loginType':'4','minititle':'','minipara':'','umto':'NaN','pstrong':'3','llnick':'','sign':'','need_sign':'','isIgnore':'','full_redirect':'','popid':'','callback':'','guf':'','not_duplite_str':'','need_user_id':'','poy':'','gvfdcname':'10','gvfdcre':'','from_encoding ':'','sub':'','TPL_password_2':self.password2,'loginASR':'1','loginASRSuc':'1','allp':'','oslanguage':'zh-CN','sr':'1366*768','osVer':'windows|6.1','naviVer':'firefox|35'}#将POST的数据进行编码转换self.postData = urllib.urlencode(self.post)#设置代理self.proxy = urllib2.ProxyHandler({'http':self.proxyURL})#设置cookieself.cookie = cookielib.LWPCookieJar()#设置cookie处理器self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)#设置登录时用到的opener,它的open方法相当于urllib2.urlopenself.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)#赋值J_HTokenself.J_HToken = ''#登录成功时,需要的Cookieself.newCookie = cookielib.CookieJar()#登陆成功时,需要的一个新的openerself.newOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.newCookie))#引入工具类self.tool = tool.Tool()#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要def needCheckCode(self):#第一次登录获取验证码尝试,构建requestrequest = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)#得到第一次登录尝试的相应response = self.opener.open(request)#获取其中的内容content = response.read().decode('gbk')#获取状态吗status = response.getcode()#状态码为200,获取成功if status == 200:print u"获取请求成功"#\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801这六个字是请输入验证码的utf-8编码pattern = re.compile(u'\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801',re.S)result = re.search(pattern,content)#如果找到该字符,代表需要输入验证码if result:print u"此次安全验证异常,您需要输入验证码"return content#否则不需要else:#返回结果直接带有J_HToken字样,表明直接验证通过tokenPattern = re.compile('id="J_HToken" value="(.*?)"')tokenMatch = re.search(tokenPattern,content)if tokenMatch:self.J_HToken = tokenMatch.group(1)print u"此次安全验证通过,您这次不需要输入验证码"return Falseelse:print u"获取请求失败"return None#得到验证码图片def getCheckCode(self,page):#得到验证码的图片pattern = re.compile('<img id="J_StandardCode_m.*?data-src="(.*?)"',re.S)#匹配的结果matchResult = re.search(pattern,page)#已经匹配得到内容,并且验证码图片链接不为空if matchResult and matchResult.group(1):return matchResult.group(1)else:print u"没有找到验证码内容"return False#输入验证码,重新请求,如果验证成功,则返回J_HTokendef loginWithCheckCode(self):#提示用户输入验证码checkcode = raw_input('请输入验证码:')#将验证码重新添加到post的数据中self.post['TPL_checkcode'] = checkcode#对post数据重新进行编码self.postData = urllib.urlencode(self.post)try:#再次构建请求,加入验证码之后的第二次登录尝试request = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)#得到第一次登录尝试的相应response = self.opener.open(request)#获取其中的内容content = response.read().decode('gbk')#检测验证码错误的正则表达式,\u9a8c\u8bc1\u7801\u9519\u8bef 是验证码错误五个字的编码pattern = re.compile(u'\u9a8c\u8bc1\u7801\u9519\u8bef',re.S)result = re.search(pattern,content)#如果返回页面包括了,验证码错误五个字if result:print u"验证码输入错误"return Falseelse:#返回结果直接带有J_HToken字样,说明验证码输入成功,成功跳转到了获取HToken的界面tokenPattern = re.compile('id="J_HToken" value="(.*?)"')tokenMatch = re.search(tokenPattern,content)#如果匹配成功,找到了J_HTokenif tokenMatch:print u"验证码输入正确"self.J_HToken = tokenMatch.group(1)return tokenMatch.group(1)else:#匹配失败,J_Token获取失败print u"J_Token获取失败"return Falseexcept urllib2.HTTPError, e:print u"连接服务器出错,错误原因",e.reasonreturn False#通过token获得stdef getSTbyToken(self,token):tokenURL = 'https://passport.alipay.com/mini_apply_st.js?site=0&token=%s&callback=stCallback6' % tokenrequest = urllib2.Request(tokenURL)response = urllib2.urlopen(request)#处理st,获得用户淘宝主页的登录地址pattern = re.compile('{"st":"(.*?)"}',re.S)result = re.search(pattern,response.read())#如果成功匹配if result:print u"成功获取st码"#获取st的值st = result.group(1)return stelse:print u"未匹配到st"return False#利用st码进行登录,获取重定向网址def loginByST(self,st,username):stURL = 'https://login.taobao.com/member/vst.htm?st=%s&TPL_username=%s' % (st,username)headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0','Host':'login.taobao.com','Connection' : 'Keep-Alive'}request = urllib2.Request(stURL,headers = headers)response = self.newOpener.open(request)content =  response.read().decode('gbk')#检测结果,看是否登录成功pattern = re.compile('top.location = "(.*?)"',re.S)match = re.search(pattern,content)if match:print u"登录网址成功"location = match.group(1)return Trueelse:print "登录失败"return Falsedef getPage(self,pageIndex):url = self.siteURL + "?page=" + str(pageIndex)request = urllib2.Request(url)response = urllib2.urlopen(request)return response.read().decode('gbk')#获取索引界面所有MM的信息,list格式def getContents(self,pageIndex):page = self.getPage(pageIndex)pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S)items = re.findall(pattern,page)contents = []for item in items:contents.append([item[0],item[1],item[2],item[3],item[4]])return contents#获取MM个人详情页面def getDetailPage(self,infoURL):infoURL = 'http:' + infoURLresponse = urllib2.urlopen(infoURL)return response.read().decode('gbk')#获取个人文字简介def getBrief(self,page):pattern = re.compile('<div class="mm-aixiu-content".*?>(.*?)<!--',re.S)result = re.search(pattern,page)return self.tool.replace(result.group(1))#获取页面所有图片def getAllImg(self,page):pattern = re.compile('<div class="mm-aixiu-content".*?>(.*?)<!--',re.S)#个人信息页面所有代码content = re.search(pattern,page)#从代码中提取图片patternImg = re.compile('<img.*?src="(.*?)"',re.S)images = re.findall(patternImg,content.group(1))return images#保存多张写真图片def saveImgs(self,images,name):number = 1print u"发现",name,u"共有",len(images),u"张照片"for imageURL in images:splitPath = imageURL.split('.')fTail = splitPath.pop()if len(fTail) > 3:fTail = "jpg"fileName = name + "/" + str(number) + "." + fTailself.saveImg(imageURL,fileName)number += 1# 保存头像def saveIcon(self,iconURL,name):splitPath = iconURL.split('.')fTail = splitPath.pop()fileName = name + "/icon." + fTailself.saveImg(iconURL,fileName)#保存个人简介def saveBrief(self,content,name):fileName = name + "/" + name + ".txt"f = open(fileName,"w+")print u"正在偷偷保存她的个人信息为",fileNamef.write(content.encode('utf-8'))#传入图片地址,文件名,保存单张图片def saveImg(self,imageURL,fileName):imageURL = 'http:' + imageURLu = urllib.urlopen(imageURL)data = u.read()f = open(fileName, 'wb')f.write(data)print u"正在悄悄保存她的一张图片为",fileNamef.close()#创建新目录def mkdir(self,path):path = path.strip()# 判断路径是否存在# 存在     True# 不存在   FalseisExists=os.path.exists(path)# 判断结果if not isExists:# 如果不存在则创建目录print u"偷偷新建了名字叫做",path,u'的文件夹'# 创建目录操作函数os.makedirs(path)return Trueelse:# 如果目录存在则不创建,并提示目录已存在print u"名为",path,'的文件夹已经创建成功'return False#将一页淘宝MM的信息保存起来def savePageInfo(self,pageIndex):#获取第一页淘宝MM列表contents = self.getContents(pageIndex)for item in contents:#item[0]个人详情URL,item[1]头像URL,item[2]姓名,item[3]年龄,item[4]居住地print u"发现一位模特,名字叫",item[2],u"芳龄",item[3],u",她在",item[4]print u"正在偷偷地保存",item[2],"的信息"print u"又意外地发现她的个人地址是",item[0]#个人详情页面的URLdetailURL = item[0]#得到个人详情页面代码detailPage = self.getDetailPage(detailURL)#获取个人简介brief = self.getBrief(detailPage)#获取所有图片列表images = self.getAllImg(detailPage)self.mkdir(item[2])#保存个人简介self.saveBrief(brief,item[2])#保存头像self.saveIcon(item[1],item[2])#保存图片self.saveImgs(images,item[2])#传入起止页码,获取MM图片def savePagesInfo(self,start,end):for i in range(start,end+1):print u"正在偷偷寻找第",i,u"个地方,看看MM们在不在"self.savePageInfo(i)#程序运行主干def main(self):#是否需要验证码,是则得到页面内容,不是则返回FalseneedResult = self.needCheckCode()#请求获取失败,得到的结果是Noneif not needResult ==None:if not needResult == False:print u"您需要手动输入验证码"checkCode = self.getCheckCode(needResult)#得到了验证码的链接if not checkCode == False:print u"验证码获取成功"print u"请在浏览器中输入您看到的验证码"webbrowser.open_new_tab(checkCode)self.loginWithCheckCode()#验证码链接为空,无效验证码else:print u"验证码获取失败,请重试"else:print u"不需要输入验证码"else:print u"请求登录页面失败,无法确认是否需要验证码"#判断token是否正常获取到if not self.J_HToken:print "获取Token失败,请重试"return#获取st码st = self.getSTbyToken(self.J_HToken)#利用st进行登录result = self.loginByST(st,self.username)if result:#获得所有宝贝的页面page = self.savePageInfo(1)else:print u"登录失败"taobao = Taobao()
taobao.main()

结果如下:


学习参考:http://cuiqingcai.com/1001.html (加入了模拟登录)

python模拟登录爬淘宝模特信息相关推荐

  1. 解决selenium + chromedriver模拟登录被淘宝反爬

    解决selenium + chromedriver模拟登录被淘宝反爬 问题 ​使用 selenium + webdriver 模拟淘宝登录时,出现滑动验证码反爬,尝试程序模拟滑动滑块,以及在程序打开的 ...

  2. python模拟登录爬取数据_python 模拟登录爬取淘宝数据

    淘宝现在需要登录才能爬取搜索商品,首先在登录页面登录chrome F12 开发者模式抓包 登录请求 发现有一个post请求,这个就是登录的请求了,看下面的from data 登录信息 由from da ...

  3. selenium + Chrome 模拟浏览器爬淘宝信息

    环境: ubuntu16.04 python3.5.2 版本 67.0.3396.87(正式版本) (64 位) chromedriver 2.40 安装所需工具: 1 selenium三方库安装 p ...

  4. Python爬虫之获取淘宝商品信息

    首先需要先导入webdriver from selenium import webdriver 复制代码 webdriver支持主流的浏览器,比如说:谷歌浏览器.火狐浏览器.IE浏览器等等 然后可以创 ...

  5. Python网络爬虫爬淘宝无法爬取问题的解决方法

    看了嵩天教授的[Python网络爬虫与信息提取].MOOC. 北京理工大学   课程,里面有一段演示如何从淘宝爬取价格信息,但实际操作却不行,问题在于淘宝19年开始实行搜索必须登录,但是Python爬 ...

  6. Selenium模拟登录系列 | 淘宝滑块验证码破解!不难嘛!

    导 语 好久没更新了,上来冒个泡吧.各位小伙伴还记得前段时间号主挖过的一个坑嘛(虽然我曾经挖过无数个坑T_T): Selenium模拟登录系列 | B站滑块验证码破解 今天随手更新了一下Seleniu ...

  7. python 爬取淘宝模特信息

    通过本篇博文,介绍一下我对指定信息进行爬取的时候的思路,顺便贴一下代码. 一.首先获取想要爬取的网站的url链接的规则变化 可以看出来该网站页面的url结构简单,变化的只是https://mm.tao ...

  8. 爬取淘宝模特信息并自动保存图片

    环境:Ubuntu 16.04 工具:python 3.5+,scrapy1.1,pycharm import scrapy, re, os, lxml, urllib.request from sc ...

  9. 爬虫——BeautifulSoup 淘宝模特信息爬取

                                                (仅供参考) import os import requests from bs4 import Beautif ...

最新文章

  1. 3D图形学的线性代数的通俗解释。
  2. WEB接口测试之Jmeter接口测试自动化 (二)(数据分离)
  3. jQuery 效果 - 动画 animate() 方法
  4. cnn 句向量_深度学习目标检测Fast R-CNN论文解读
  5. Depth-first Search深度优先搜索专题5
  6. Spring mvc介绍
  7. Android4.4点击无响应,webview某些超链接点击无响应的问题
  8. 辅助驾驶等级_BBA霸榜、特斯拉折戟 E-NCAP辅助驾驶评测结果公布
  9. Julia科学记数法格式输出问题
  10. EXCEL多项式曲线拟合很好实际验算误差大的解决办法
  11. 机器人学基础(二):机器人运动学
  12. flex布局完整示例
  13. 2022年郑州市初级焊工考试模拟试题及答案
  14. 工赋开发者社区 | (案例)中译语通:差别化纺纱柔性智慧工厂
  15. 什么是VGA、QVGA、CIF、QCIF。。。?
  16. MATLAB feof和~feof函数用法
  17. IOT_WIFI/LORA/THREAD/ZIGBEE/NFC/RFID/EnOcean
  18. 安卓镜像刻录软件_安卓8.0开发者预览版镜像系统下载-Android O开发者预览版镜像官方正式版-东坡下载...
  19. Check It Again:论文整理
  20. Microsemi SmartFusion系列FPGA简介

热门文章

  1. java currenthread_java-Intellij IDEA评估表达式窗口和Thread.curren...
  2. Java编程高手教你写出完美代码
  3. 传奇3私服架设技术教程
  4. 实例操作:Python提取雅虎财经数据,并做数据分析和可视化
  5. acm中的概率和期望类题目 挖坑
  6. 全国排名前十技术大牛,被裁只要十分钟
  7. 小球自由落体_自由落体瀑布
  8. java投票_java做投票系统
  9. 手动安装Eclipse插件
  10. 美工(一)网页颜色搭配技巧 文字字体、字号、字体排版等