python模拟登录页面下载_python模拟登陆之下载

这个Python脚本用于模拟登录某个网页,并下载订单报表。它首先设置Django环境,然后使用requests库进行登录操作。登录成功后,脚本会按指定日期范围下载Excel文件,解析订单号,并将数据插入到数据库中。如果下载或解析过程中遇到错误,脚本会记录失败的订单并尝试重新登录。
摘要由CSDN通过智能技术生成

#!/usr/bin/python#coding:utf-8importsysimportosimportdjangoreload(sys)sys.setdefaultencoding('utf8')sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #把manage.py所在目录添加到系统目录os.environ['DJANGO_SETTINGS_MODULE'] = 'business.settings' #设置setting文件django.setup() #初始化Django环境importrequestsimportreimportloggingimportbase64importxlrdimportdatetimeimporttimeimportMySQLdbimportthreadpoolfrom business importsettingsfrom train.depends.platform importPlatformfrom train.models importTbTomasOrder,TbTomasEpay,TtTicketThomas,TbTomasLinkmanfrom train importutilsfrom train.status importOrderStatusfrom django.core.mail importEmailMultiAlternativesfrom train.busi importinsert_order,insert_ticket,insert_epay,insert_linkmanlogger= logging.getLogger('django')classTbTomas(object): succ_number=0 fail_number=0 fail_order=[]def __init__(self,thread_num = 3):#配置初始化 self.session_obj =requests.session() self.fail_order=[] self.succ_number=0 self.fail_number=0 self.thread_num=thread_num self.start_date= ''self.end_date= ''self.trade_date=utils.now()deflogin_thomas(self,thomas_username,thomas_password): hello_url= 'https://huoche.alitrip.com/hello.htm'hello_response=self.session_obj.get(hello_url) h_u_s= re_search('', hello_response.text) h_u_s=base64.b64encode(h_u_s) headers={'Accept': 'text/html, application/xhtml+xml, image/jxr, */*','Referer': 'https://huoche.alitrip.com/hello.htm','Accept-Language': 'zh-CN','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586','Content-Type': 'application/x-www-form-urlencoded','Accept-Encoding': 'gzip, deflate','Host': 'huoche.alitrip.com','Content-Length': '73','Connection': 'Keep-Alive','Cache-Control': 'no-cache'} post_data={'h_u_s': base64.b64encode(h_u_s),'h_u_n': thomas_username,'h_u_p': base64.b64encode(thomas_password) } index_url= 'https://huoche.alitrip.com/index.htm'index_response= self.session_obj.post(index_url, headers=headers, data=post_data) logger.info(u'登陆成功,等待下载文件...')defdownload_file(self,thomas_username,thomas_password,args):for _ in xrange(3):try: self.login_thomas(thomas_username,thomas_password)break exceptException as e: logger.error(e)continue #处理时间 all_time =self.date_time_handle(args)if notall_time: logger.error(u'日期格式错误!!')return for trade_date inall_time:try: self.trade_date=trade_date post_data={'orderExportDate': trade_date } download_url= 'https://huoche.alitrip.com/orderlistexp.do'sheet_content= '' for _ in xrange(3):try:#得到exal文件流 download_response = self.session_obj.post(download_url, data=post_data)#打开exal文件 xls_content = xlrd.open_workbook(file_contents=download_response.content) sheet_content=xls_content.sheets()[0] logger.info(u'下载文件成功,正在拿取订单号')break exceptException as e: logger.error(u'下载文件超时,正在等待重新登录后下载...') self.login_thomas(thomas_username, thomas_password)continueorder_item=[]if notsheet_content: logger.error(u'下载文件失败,正在重新登录...')continue for line_num inrange(sheet_content.nrows): line_item=sheet_content.row_values(line_num)if line_item[2] and line_item[2] not inorder_item: order_item.append(line_item[2], ) #订单号 order_no #获取到所有订单号 order_item = order_item[1:]#根据订单号去拿订单详情 logger.info(u'正在写入数据库')#多线程去执行 pool =threadpool.ThreadPool(self.thread_num) reqs=threadpool.makeRequests(self.create_order_info, order_item) [pool.putRequest(req)for req inreqs] pool.wait() logger.info(u'写入完成,完成时间为:%s'%self.trade_date) content=self.add_content(len(order_item), self.succ_number, self.fail_number, self.fail_order) self.send_mail(content=content) self.succ_number,self.fail_order=0,0 self.fail_order=[]#self.create_order_info(order_item) exceptException as e: logger.error(e)defdate_time_handle(self,args): all_time=[]ifargs:if len(args) == 1: self.start_date= datetime.datetime.strptime(args[0], '%Y-%m-%d').date() self.end_date= datetime.datetime.strptime(datetime.datetime.now().strftime('%Y-%m-%d'), '%Y-%m-%d').date()elif len(args) == 2: self.start_date= datetime.datetime.strptime(args[0], '%Y-%m-%d').date() self.end_date= datetime.datetime.strptime(args[1], '%Y-%m-%d').date()elif len(args) == 3: self.start_date= datetime.datetime.strptime(args[0], '%Y-%m-%d').date() self.end_date= datetime.datetime.strptime(args[1], '%Y-%m-%d').date() self.thread_num= int(args[2])else: logger.error(u'传入参数错误,请重新执行')returni=0whileTrue: tomoary= self.start_date + datetime.timedelta(days=i) trade_date= tomoary.strftime('%Y-%m-%d') all_time.append(trade_date) i+= 1 if tomoary ==self.end_date:break else: today=datetime.datetime.now() yesterday= today + datetime.timedelta(days=-1) trade_date= yesterday.strftime('%Y-%m-%d') all_time.append(trade_date)returnall_timedefcreate_order_info(self, order): platform_obj=Platform() order_info=platform_obj.get_order(order)if notorder_info: self.fail_order.append(order) self.fail_number+= 1logger.error('获取订单号:[%s]失败'%order)return try:#插入order表 if TbTomasOrder.objects.filter(order_no=order).exists(): logger.error('订单号:[%s]已经存在于TbTomasOrder'%order) self.fail_order.append(order) self.fail_number+= 1 return else: insert_order(order_info,order,self.trade_date) self.succ_number+= 1 #插入ticket表insert_ticket(order_info,order,self.trade_date)#插入联系人 if TbTomasLinkman.objects.filter(order_no=order).exists(): logger.error('订单号:[%s]已经存在于TbTomasLinkman'%order)else: insert_linkman(order_info,order,self.trade_date)#插入epay表 if TbTomasEpay.objects.filter(order_no=order).exists(): logger.error('订单号:[%s]已经存在于TbTomasEpay'%order)else: insert_epay(order_info,order,self.trade_date)exceptException as e: logger.error(e) self.fail_number+=1 defadd_content(self,total,succ_number,fail_number,fail_order): content= u'''

托马斯导入订单报表

日期总单数成功单数失败单数失败订单号
%s%s%s%s%s
'''%(datetime.datetime.now().strftime('%Y-%m-%d %H:%M'),total,succ_number,fail_number,fail_order)returncontentdefsend_mail(self, content): time_target=self.trade_date subject= u'托马斯数据抓取邮件 %s' %(time_target) logger.info(u'准备发送邮件....%s', subject) mail_address=settings.mail_address_thomas to_addr=[]ifisinstance(mail_address, list): to_addr+=mail_addresselifisinstance(mail_address, str): to_addr.append(mail_address) logger.debug(to_addr) from_email=settings.DEFAULT_FROM_EMAIL msg= EmailMultiAlternatives(subject, 'result', from_email, to_addr) msg.attach_alternative(content,'text/html') flag=msg.send()ifflag: logger.info(u'%s发送成功', subject)else: logger.error(u'%s发送失败', subject)return defrun(self, username,passwd,args):#登陆托马斯后台 for _ in xrange(3):try: self.download_file(username,passwd,args)break exceptException as e: logger.error(e)continuedefre_search(regex, subject): subject=str(subject) obj=re.compile(regex) match=obj.search(subject)ifmatch: result= match.group(1)else: result= '' returnresultdefmain(): username=base64.b64decode(settings.THOMAS_USERNAME) passwd=base64.b64decode(settings.THOMAS_PASSWORD) args= sys.argv[1:] if sys.argv[1:] else ''TbTomas().run(username,passwd,args)if __name__ == '__main__': main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值