python模拟登录爬淘宝模特信息
先模拟登录
再爬取照片
# -*- 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模拟登录爬淘宝模特信息相关推荐
- 解决selenium + chromedriver模拟登录被淘宝反爬
解决selenium + chromedriver模拟登录被淘宝反爬 问题 使用 selenium + webdriver 模拟淘宝登录时,出现滑动验证码反爬,尝试程序模拟滑动滑块,以及在程序打开的 ...
- python模拟登录爬取数据_python 模拟登录爬取淘宝数据
淘宝现在需要登录才能爬取搜索商品,首先在登录页面登录chrome F12 开发者模式抓包 登录请求 发现有一个post请求,这个就是登录的请求了,看下面的from data 登录信息 由from da ...
- selenium + Chrome 模拟浏览器爬淘宝信息
环境: ubuntu16.04 python3.5.2 版本 67.0.3396.87(正式版本) (64 位) chromedriver 2.40 安装所需工具: 1 selenium三方库安装 p ...
- Python爬虫之获取淘宝商品信息
首先需要先导入webdriver from selenium import webdriver 复制代码 webdriver支持主流的浏览器,比如说:谷歌浏览器.火狐浏览器.IE浏览器等等 然后可以创 ...
- Python网络爬虫爬淘宝无法爬取问题的解决方法
看了嵩天教授的[Python网络爬虫与信息提取].MOOC. 北京理工大学 课程,里面有一段演示如何从淘宝爬取价格信息,但实际操作却不行,问题在于淘宝19年开始实行搜索必须登录,但是Python爬 ...
- Selenium模拟登录系列 | 淘宝滑块验证码破解!不难嘛!
导 语 好久没更新了,上来冒个泡吧.各位小伙伴还记得前段时间号主挖过的一个坑嘛(虽然我曾经挖过无数个坑T_T): Selenium模拟登录系列 | B站滑块验证码破解 今天随手更新了一下Seleniu ...
- python 爬取淘宝模特信息
通过本篇博文,介绍一下我对指定信息进行爬取的时候的思路,顺便贴一下代码. 一.首先获取想要爬取的网站的url链接的规则变化 可以看出来该网站页面的url结构简单,变化的只是https://mm.tao ...
- 爬取淘宝模特信息并自动保存图片
环境:Ubuntu 16.04 工具:python 3.5+,scrapy1.1,pycharm import scrapy, re, os, lxml, urllib.request from sc ...
- 爬虫——BeautifulSoup 淘宝模特信息爬取
(仅供参考) import os import requests from bs4 import Beautif ...
最新文章
- 3D图形学的线性代数的通俗解释。
- WEB接口测试之Jmeter接口测试自动化 (二)(数据分离)
- jQuery 效果 - 动画 animate() 方法
- cnn 句向量_深度学习目标检测Fast R-CNN论文解读
- Depth-first Search深度优先搜索专题5
- Spring mvc介绍
- Android4.4点击无响应,webview某些超链接点击无响应的问题
- 辅助驾驶等级_BBA霸榜、特斯拉折戟 E-NCAP辅助驾驶评测结果公布
- Julia科学记数法格式输出问题
- EXCEL多项式曲线拟合很好实际验算误差大的解决办法
- 机器人学基础(二):机器人运动学
- flex布局完整示例
- 2022年郑州市初级焊工考试模拟试题及答案
- 工赋开发者社区 | (案例)中译语通:差别化纺纱柔性智慧工厂
- 什么是VGA、QVGA、CIF、QCIF。。。?
- MATLAB feof和~feof函数用法
- IOT_WIFI/LORA/THREAD/ZIGBEE/NFC/RFID/EnOcean
- 安卓镜像刻录软件_安卓8.0开发者预览版镜像系统下载-Android O开发者预览版镜像官方正式版-东坡下载...
- Check It Again:论文整理
- Microsemi SmartFusion系列FPGA简介