Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持。

 

本篇内容

1. python模拟登录淘宝网页

2. 获取登录用户的所有订单详情

3. 学会应对出现验证码的情况

4. 体会一下复杂的模拟登录机制

 

探索部分成果

 

1. 淘宝的密码用了AES加密算法,最终将密码转化为256位,在POST时,传输的是256位长度的密码。

2. 淘宝在登录时必须要输入验证码,在经过几次尝试失败后最终获取了验证码图片让用户手动输入来验证。

3. 淘宝另外有复杂且每天在变的 ua 加密算法,在程序中我们需要提前获取某一 ua 码才可进行模拟登录。

4. 在获取最后的登录 st 码时,历经了多次请求和正则表达式提取,且 st 码只可使用一次。

 

整体思路梳理

 

1. 手动到浏览器获取 ua 码以及 加密后的密码,只获取一次即可,一劳永逸。

2. 向登录界面发送登录请求,POST 一系列参数,包括 ua 码以及密码等等,获得响应,提取验证码图像。

3. 用户输入手动验证码,重新加入验证码数据再次用 POST 方式发出请求,获得响应,提取 J_Htoken。

4. 利用 J_Htoken 向 alipay 发出请求,获得响应,提取 st 码。

5. 利用 st 码和用户名,重新发出登录请求,获得响应,提取重定向网址,存储 cookie。

6. 利用 cookie 向其他个人页面如订单页面发出请求,获得响应,提取订单详情。

 

是不是没看懂?没事,下面我将一点点说明自己模拟登录的过程,希望大家可以理解。

 

前期准备

 

由于淘宝的 ua 算法和 aes 密码加密算法太复杂了,ua 算法在淘宝每天都是在变化的,不过,这个内容你获取之后一直用即可,经过测试之后没有问题,一劳永逸。

 

那么 ua 和 aes 密码怎样获取呢?

 

我们就从浏览器里面直接获取吧,打开浏览器,找到淘宝的登录界面,按 F12 或者浏览器右键审查元素。

 

在这里我用的是火狐浏览器,首先记得在浏览器中设置一下显示持续日志,要不然页面跳转了你就看不到之前抓取的信息了。在这里截图如下:

 

 

好,那么接下来我们就从浏览器中获取 ua 和 aes 密码

 

点击网络选项卡,这时都是空的,什么数据也没有截取。这时你就在网页上登录一下试试吧,输入用户名啊,密码啊,有必要时需要输入验证码,点击登录。

等跳转成功后,你就可以看到好多日志记录了,点击图中的那一行 login.taobo.com,然后查看参数,你就会发现表单数据了,其中就包括 ua 还有下面的 password2,把这俩复制下来,我们之后要用到的。这就是我们需要的 ua 还有 aes 加密后的密码。

恩,读到这里,你应该获取到了属于自己的 ua 和 password2 两个内容。

 

输入验证码并获取J_HToken

 

经过博主本人亲自验证,有时候,在模拟登录时你并不需要输入验证码,它直接返回的结果就是前面所说的下一步用到的 J_Token,而有时候你则会需要输入验证码,等你手动输入验证码之后,重新请求登录一次。

 

博主是边写程序边更新文章的,现在写完了是否有必要输入验证码的检验以及在浏览器中呈现验证码。

 

代码如下

 

__author__ = 'CQC'

# -*- coding:utf-8 -*-

 

import urllib

import urllib2

import cookielib

import re

import webbrowser

 

#模拟登录淘宝类

class Taobao:

 

#初始化方法

def __init__(self):

#登录的URL

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:35.0) Gecko/20100101 Firefox/35.0',

'Referer' : 'https://login.taobao.com/member/login.jhtml',

'Content-Type': 'application/x-www-form-urlencoded',

'Connection' : 'Keep-Alive'

}

#用户名

self.username = 'cqcre'

#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息

self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThu9a==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='

#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码

self.password2 = '7511aa68sx629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'

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})

#设置cookie

self.cookie = cookielib.LWPCookieJar()

#设置cookie处理器

self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)

#设置登录时用到的opener,它的open方法相当于urllib2.urlopen

self.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)

 

#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要

def needIdenCode(self):

#第一次登录获取验证码尝试,构建request

request = 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:

print u"此次安全验证通过,您这次不需要输入验证码"

return False

else:

print u"获取请求失败"

 

#得到验证码图片

def getIdenCode(self,page):

#得到验证码的图片

pattern = re.compile('<img id="J_StandardCode_m.*?src=" (.*?)"',re.s)<="" p="" data-bd-imgshare-binded="1" style="box-sizing: border-box; border: 0px; vertical-align: middle;">

#匹配的结果

matchResult = re.search(pattern,page)

#已经匹配得到内容,并且验证码图片链接不为空

if matchResult and matchResult.group(1):

print matchResult.group(1)

return matchResult.group(1)

else:

print u"没有找到验证码内容"

return False

 

#程序运行主干

def main(self):

#是否需要验证码,是则得到页面内容,不是则返回False

needResult = self.needIdenCode()

if not needResult == False:

print u"您需要手动输入验证码"

idenCode = self.getIdenCode(needResult)

#得到了验证码的链接

if not idenCode == False:

print u"验证码获取成功"

print u"请在浏览器中输入您看到的验证码"

webbrowser.open_new_tab(idenCode)

#验证码链接为空,无效验证码

else:

print u"验证码获取失败,请重试"

else:

print u"不需要输入验证码"

 

taobao = Taobao()

taobao.main()

 

恩,请把里面的 ua 和 password2 还有用户名换成自己的进行尝试,用我的可能会产生错误的。

 

运行结果

然后会蹦出浏览器,显示了验证码的内容,这个需要你来手动输入。

在这里有小伙伴向我反映有这么个错误

经过查证,竟然是版本问题,博主本人用的是 2.7.7,而小伙伴用的是 2.7.9。后来换成 2.7.7 就好了…,我也是醉了,希望有相同错误的小伙伴,可以尝试换一下版本…

好啦,运行时会弹出浏览器,如图

那么,我们现在需要手动输入验证码,重新向登录界面发出登录请求,之前的post数据内容加入验证码这一项,重新请求一次,如果请求成功,则会返回 下一步我们需要的 J_HToken,如果验证码输入错误,则会返回验证码输入错误的选项。好,下面,我已经写到了获取J_HToken的进度,代码如下,现在运行程序,会 蹦出浏览器,然后提示你输入验证码,用户手动输入之后,则会返回一个页面,我们提取出 J_Htoken即可。

注意,到现在为止,你还没有登录成功,只是获取到了J_HToken的值。

目前写到的代码如下

 

__author__ = 'CQC'

# -*- coding:utf-8 -*-

 

import urllib

import urllib2

import cookielib

import re

import webbrowser

 

#模拟登录淘宝类

class Taobao:

 

#初始化方法

def __init__(self):

#登录的URL

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:35.0) Gecko/20100101 Firefox/35.0',

'Referer' : 'https://login.taobao.com/member/login.jhtml',

'Content-Type': 'application/x-www-form-urlencoded',

'Connection' : 'Keep-Alive'

}

#用户名

self.username = 'cqcre'

#ua字符串,经过淘宝ua算法计算得出,包含了时间戳,浏览器,屏幕分辨率,随机数,鼠标移动,鼠标点击,其实还有键盘输入记录,鼠标移动的记录、点击的记录等等的信息

self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThuOA==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='

#密码,在这里不能输入真实密码,淘宝对此密码进行了加密处理,256位,此处为加密后的密码

self.password2 = '7511aa6854629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e0a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'

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})

#设置cookie

self.cookie = cookielib.LWPCookieJar()

#设置cookie处理器

self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)

#设置登录时用到的opener,它的open方法相当于urllib2.urlopen

self.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)

 

#得到是否需要输入验证码,这次请求的相应有时会不同,有时需要验证有时不需要

def needCheckCode(self):

#第一次登录获取验证码尝试,构建request

request = 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)

print content

#如果找到该字符,代表需要输入验证码

if result:

print u"此次安全验证异常,您需要输入验证码"

return content

#否则不需要

else:

#返回结果直接带有J_HToken字样,表明直接验证通过

tokenPattern = re.compile('id="J_HToken"')

tokenMatch = re.search(tokenPattern,content)

if tokenMatch:

print u"此次安全验证通过,您这次不需要输入验证码"

return False

else:

print u"获取请求失败"

return None

 

#得到验证码图片

def getCheckCode(self,page):

#得到验证码的图片

pattern = re.compile('<img id="J_StandardCode_m.*?src=" (.*?)"',re.s)<="" p="" data-bd-imgshare-binded="1" style="box-sizing: border-box; border: 0px; vertical-align: middle;">

#匹配的结果

matchResult = re.search(pattern,page)

#已经匹配得到内容,并且验证码图片链接不为空

if matchResult and matchResult.group(1):

print matchResult.group(1)

return matchResult.group(1)

else:

print u"没有找到验证码内容"

return False

 

#输入验证码,重新请求,如果验证成功,则返回J_HToken

def 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 False

else:

#返回结果直接带有J_HToken字样,说明验证码输入成功,成功跳转到了获取HToken的界面

tokenPattern = re.compile('id="J_HToken" value="(.*?)"')

tokenMatch = re.search(tokenPattern,content)

#如果匹配成功,找到了J_HToken

if tokenMatch:

print u"验证码输入正确"

print tokenMatch.group(1)

return tokenMatch.group(1)

else:

#匹配失败,J_Token获取失败

print u"J_Token获取失败"

return False

except urllib2.HTTPError, e:

print u"连接服务器出错,错误原因",e.reason

return False

 

#程序运行主干

def main(self):

#是否需要验证码,是则得到页面内容,不是则返回False

needResult = self.needCheckCode()

#请求获取失败,得到的结果是None

if not needResult ==None:

if not needResult == False:

print u"您需要手动输入验证码"

idenCode = self.getCheckCode(needResult)

#得到了验证码的链接

if not idenCode == False:

print u"验证码获取成功"

print u"请在浏览器中输入您看到的验证码"

webbrowser.open_new_tab(idenCode)

J_HToken = self.loginWithCheckCode()

print "J_HToken",J_HToken

#验证码链接为空,无效验证码

else:

print u"验证码获取失败,请重试"

else:

print u"不需要输入验证码"

else:

print u"请求登录页面失败,无法确认是否需要验证码"

 

taobao = Taobao()

taobao.main()

 

现在的运行结果是这样的,我们已经可以得到 J_HToken 了,离成功又迈进了一步。

 

 

好,到现在为止,我们应该可以获取到J_HToken的值啦。

 

 

请接下来看第二部分。

 

原文:http://sanliangzhi.com/hot/4063.html

经典:http://sanliangzhi.com/Ittext/Index/tag_list/ftag/python.html

 

转载于:https://www.cnblogs.com/sanliangzhi/p/5216154.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python逻辑流程图_python-程序流程图

原博文 2020-06-03 12:24 − 程序流程图 1、流程图的基本要素&#xff1a; 表示相应操作的框 带箭头的流程线 框内外必要的文字说明 起止框 判断...01055 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对象的动态类型语言…

linux差分包升级流程,OTA 差分升级包的制作

OTA 升级是 Android 系统提供的标准软件升级方式。 它功能强大&#xff0c;提供了完全升级、增量升级模式&#xff0c;可以通过 SD卡升级&#xff0c;也可以通过网络升级。那如何生成差分升级包呢&#xff1f;Android源码的根目录下有以下两个命令&#xff1a;1、make ——会生…

wps for linux alpha 15 语言包,WPS Office for Linux Alpah 7发布

WPS Office for Linux A7终于出来了&#xff0c;想当年做了一个ppt给老大发过去&#xff0c;后来发现没人能打开。。。先不看功能上的改进&#xff0c;光bug就修复了将近3千条&#xff0c;可见wps4linux团队的付出。版本摘要&#xff1a;增加et组建和主干同步至10月15日和v9分支…

50 个 Bootstrap 插件

Bootstrap是快速开发Web应用程序的前端工具包。它是一个CSS和HTML的集合&#xff0c;它使用了最新的浏览器技术&#xff0c;给你的Web开发提供了时尚的版式&#xff0c;表单&#xff0c;buttons&#xff0c;表格&#xff0c;网格系统等等。 本文向你推荐 50 个 Bootstrap 的插件…

python能和c语音交互吗_Python和C语言交互--ctypes,struct

python和c语言进行数据交互&#xff0c;涉及类型转换&#xff0c;字节对齐&#xff0c;字节序大小端转换等。相关模块ctypes&#xff0c;struct&#xff0c;memoryview。 一.ctypes:python和c语言使用结构体数据进行交互 场景&#xff1a;有一个C语言生成的动态链接库&#xff…

python3获取网页内容_python3获取一个网页特定内容

我们今天要爬取的网址为&#xff1a;https://www.zhiliti.com.cn/html/luoji/list7_1.html 一、目标&#xff1a;获取下图红色部分内容即获取所有的题目以及答案。 二、实现步骤。 分析&#xff1a; 1&#xff0c;首先查看该网站的结构。分析网页后可以得到&#xff1a; 我们需…

Linux64位steam,这下没得玩了! Steam无奈抛弃Linux用户

众所周知&#xff0c;Linux被公认为最安全的操作系统&#xff0c;近日&#xff0c;网络有消息传出Linux发行版Ubuntu确认将从今年下半年的19.10版本开始不再支持传统32位&#xff0c;而仅支持64位&#xff0c;而没有了32位系统的存在&#xff0c;许多游戏将不能支持。据了解&am…

远程主机http协议版本信息泄漏_Web基础之http协议

Http协议介绍&#xfffc;HTTP 全称&#xff1a;Hyper Text Transfer Protocol 中文名&#xff1a;超文本传输协议什么是超文本包含有超链接(Link)和各种多媒体元素标记(Markup)的文本。这些超文本文件彼此链接&#xff0c;形成网状(Web)&#xff0c;因此又被称为网页(Web Page…

c语言opengles程序,OpenGL ES _ 着色器_程序

演示图你不知道这个东西&#xff0c;请不要看了,请看我的其他文章先了解一下O!学习目标掌握着色器程序的执行过程简单的例子uniform float t; // 时间uniform mat4 gl_ModelViewMatrix; // 模型视图矩阵attribute vec4 vel;const vec4 g vec4(0.0,-9.8,0.0) // 重力加速度void…

spring IOC加载流程

看了网上、书上很多对于spring IOC容器加载过程的分析。大多都只是粗略的讲一下加载流程。其实这样也不错&#xff0c;简单粗暴。清晰记得之前和一个前辈交流时他说的一句话&#xff1a;什么设计模式、设计框架都是扯淡&#xff0c;能实现这个功能就是最好的。其实这样的说法是…

pytorch 模型可视化_【深度学习】高效使用Pytorch的6个技巧:为你的训练Pipeline提供强大动力...

作者&#xff1a;Eugene Khvedchenya 编译&#xff1a;ronghuaiyang导读只报告模型的Top-1准确率往往是不够的。将train.py脚本转换为具有一些附加特性的强大pipeline每一个深度学习项目的最终目标都是为产品带来价值。当然&#xff0c;我们想要最好的模型。什么是“最好的”…

tstringlist怎么查看是否存在该数据_注意!研究生招生信息只公开1个月!应该怎么用?...

请注意&#xff01;全国硕士研究生招生信息公开平台&#xff08;以下简称“研招信息公开平台”&#xff09;已于2019年7月1日开放-2019年7月30日结束。招生信息怎么看&#xff1f;老师在线教你看懂研究生招生信息&#xff01;本篇目录&#xff1a;1.全国硕士研究生招生信息公开…

delphi读取xml中的内容property name传递参数_Python 进阶知识全篇-XML 解析

什么是 XML&#xff1f;XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;&#xff0c;标准通用标记语言的子集&#xff0c;是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 XML 教程XML 被设计用来传输和存储数据。XML 是一套定…

c语言编写网页图形界面代码,「分享」C语言如何编写图形界面

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼贴吧内经常有人问C语言是不是只能用于字符终端界面开发&#xff0c;不能用于图形界面。大家也都有回答&#xff0c;需要其他的库。MFC&#xff0c;GTK&#xff0c;QT。本人近期刚用GTK库加上纯C写成了第一个LINUX实用程序。现在与大…

python 读取word_教你怎么使用 Python 对 word文档 进行操作

使用Python对word文档进行操作一、安装Python-docxPython-docx是专门针对于word文档的一个模块&#xff0c;只能读取docx 不能读取doc文件。说白了&#xff0c;python就相当于windows操作系统&#xff0c;QQ就是跑在windows操作系统上的软件&#xff0c;QQ最大的作用是可以去聊…

stm32cubemx adc_STM32CubeMX__Exp5_ADC1_2CH_DMA_TIM3_Trig__简明指导文件__jyb

用定时器TIM3触发DMA方式的双通道ADC定时采样&#xff1a;拷贝STM32CubeMX工程文件LED_Flash_PC12.ioc&#xff0c;修改为&#xff1a;Exp5_ADC1_2CH_DMA_TIM3_Trig.ioc(1)配置ADC1的通道和参数配置ADC通道参数(2)配置ADC1的DMA①通过点"Add"按钮&#xff0c;添加ADC…

JS 实现 jQuery的$(function(){});

1、浏览器渲染引擎的HTML解析流程 何谓“渲染”&#xff0c;其实就是浏览器把请求到的HTML内容显示出来的过程。渲染引擎首先通过网络获得所请求文档的内容&#xff0c;通常以8K分块的方式完成。下面是渲染引擎在取得内容之后的基本流程&#xff1a; 1&#xff0c;解析html以构…

html 分页_MySQL——优化嵌套查询和分页查询

Java识堂&#xff0c;一个高原创&#xff0c;高收藏&#xff0c;有干货的微信公众号&#xff0c;欢迎关注优化嵌套查询嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果&#xff0c;然后把这个结果作为过滤条件用在另一个查询中。嵌套查询写起来简单&#xff0c;也…

从原理上搞定编码-- Base64编码

开发者对Base64编码肯定很熟悉&#xff0c;是否对它有很清晰的认识就不一定了。实际 上Base64已经简单到不能再简单了&#xff0c;如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容&#xff0c;花几分钟时间就可以彻底理解它。文 章下边贴了一个Base64的编…

docker mysql总是退出_Docker提升测试效率之路

现如今&#xff0c;Docker已经成为了很多公司部署应用、服务的首选方案。依靠容器技术&#xff0c;我们能在不同的体系结构之上轻松部署几乎任何种类的应用。作为测试一方&#xff0c;我们应与时俱进&#xff0c;将Docker容器技术应用到测试工作中。为了让小伙伴们可以快速上手…