爬虫521错误(又是一次和可爱的前端vs的故事)

起因:

  今天突然想重构一下代理池,并且想扩充一下代理,所以就想着爬点代理IP,然后就有了下面的故事

 

一上来先进行了一顿操作:

def get_xxdaili(url):headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36',"Host": 'www.66ip.cn',"Referer": 'http://www.66ip.cn/index.html',"Upgrade-Insecure-Requests": '1',}res = requests.get(url=url, headers=headers)

然后看都没看状态码直接xpath取:过了一会黑人问号??????,喵喵喵,为啥是空,点开源代码,啥都有,哦,可能是xpath写的有问题,又进行了微调,还是取不到,突然感觉这个网站好骚,怎么就取不到呢.有重新分析了一次源代码与Network, 然后看了眼返回状态码,521,进过分析以后得出了问题的原因:

  发生 521 错误是因为源服务器拒绝来自 Cloudflare 的连接。更具体地说,Cloudflare 尝试通过端口 80 或 443 连接到您的源服务器,但却收到连接被拒绝的错误。

 

我发现cookie的参数很有问题,所以估计是cookie的问题(之前没遇到521,所以一开始也不清楚哪里的问题),网上整理了一下资料,原来是进行了cookie加密(js),所以接下来思路是很清晰了,就是分析js,然后拿到加密后的数据.所以我直接拿到相应信息

<script>var x="27@@attachEvent@var@substr@May@function@@0@href@while@@Array@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@3@@f@fromCharCode@GMT@@return@@pathname@try@hvw@BxG@innerHTML@@Y@@@else@e@onreadystatechange@@a@toLowerCase@20@toString@@@@@new@@593@@@@charAt@1@reverse@Expires@@headless@D@@eval@gYw@1558952840@firstChild@@charCodeAt@8@parseInt@@@for@@window@if@join@false@11@String@@@search@@h@captcha@@0xFF@RegExp@DOMContentLoaded@https@B@replace@@JgSe0upZ@length@split@div@@addEventListener@__jsl_clearance@@1500@d@@@@challenge@@@catch@Mon@@36@@chars@0xEDB88320@match@createElement@@Path@setTimeout@document@@mX@@g@@19@cookie@@@location".replace(/@*$/,"").split("@"),y="4 49=7(){4l('58.a=58.n+58.36.3g(/[\\?|&]39-47/,\\'\\')',42);4m.55='40=2c.1m|9|'+(7(){4 49=[[(+!~~[])]+[-~{}-~{}],[f+f],[(+!~~[])]+((-~-~[])*[-~-~[]]+[]+[[]][9]),[(+!~~[])]+[-~{}+(-~-~[]<<-~!{})],[(+!~~[])]+[~~{}],[(+!~~[])]+[-~[]+(-~!{}+[(-~~~{}<<-~~~{})])/[(-~~~{}<<-~~~{})]],[(+!~~[])]+((-~-~[]^(+!~~[]))+[[]][9]),[~~{}],((-~-~[]^(+!~~[]))+[[]][9]),[-~[]+(-~!{}+[(-~~~{}<<-~~~{})])/[(-~~~{}<<-~~~{})]],[(+!~~[])]+[(+!~~[])],[-~{}-~{}],[(+!~~[])]+[f+f],[(-~-~[]^(+!~~[]))+(-~-~[]^(+!~~[]))+(-~-~[]^(+!~~[]))],[(+!~~[])],((-~-~[])*[-~-~[]]+[]+[[]][9]),[-~{}+(-~-~[]<<-~!{})],[(+!~~[])]+[(-~{}<<(-~-~[]^(+!~~[])))],[(-~{}<<(-~-~[]^(+!~~[])))]],c=d(49.3j);2k(4 45=9;45<49.3j;45++){c[49[45]]=['%','15','3f',[-~{}+(-~-~[]<<-~!{})]+[{}+[[]][9]][9].22(2g),'50',((-~-~[]^(+!~~[]))+[[]][9]),[-~{}-~{}],'2b',[-~{}-~{}],(+[~~[], ~~[]]+[]).22((+[]))+[~~{}]+([-~{}-~{}]/(+![])+[]+[[]][9]).22(-~-~[]+(-~-~[])*[-~-~[]])+[!{}+[]+[[]][9]][9].22(-~{}-~{}),(2m.27+[]).22(-~((-~-~[]^(+!~~[])))-~((-~-~[]^(+!~~[])))),'%','11%',((f)/(+[])+[]).22(~~{})+({}+[]+[]).22([(+!~~[])]+[~~{}]),[-~[]+(-~!{}+[(-~~~{}<<-~~~{})])/[(-~~~{}<<-~~~{})]]+[(+!~~[])],'12',[!-{}+[]+[]][9].22((-~~~{}<<-~~~{}))+[-~{}+(-~-~[]<<-~!{})],'28','38'][45]};l c.30('')})()+';25=4b, 1-6-54 32:1:1e j;4k=/;'};2n((7(){10{l !!2m.3n;}4a(19){l 31;}})()){4m.3n('3d',49,31)}18{4m.3('1a',49)}",f=function(x,y){var a=0,b=0,c=0;x=x.split("");y=y||99;while((a=x.shift())&&(b=a.charCodeAt(0)-77.5))c=(Math.abs(b)<13?(b+48.5):parseInt(a,36))+y*c;return c},z=f(y.match(/\w/g).sort(function(x,y){return f(x)-f(y)}).pop());while(z++)try{eval(y.replace(/\b\w+\b/g, function(y){return x[f(y,z)-1]||("_"+y)}));break}catch(_){}</script>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

经过js优化:

<script>var x = "@@DOMContentLoaded@P@length@location@new@a@S@RegExp@19@document@0@@pathname@@@@replace@0xEDB88320@@8@reverse@@36@try@GMT@Expires@@@cookie@@27@String@vwpBT@while@chars@parseInt@BpU@charCodeAt@@@return@f@addEventListener@Path@@@@@captcha@div@@href@@D@@function@0xFF@if@substr@@1@@attachEvent@JgSe0upZ@join@firstChild@@w@@@@Array@search@@@Mon@else@BqA@13@@@fromCharCode@onreadystatechange@@@@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@charAt@09@e@May@@@1500@match@window@25@https@var@__jsl_clearance@@1558945513@@toLowerCase@@3@false@@053@d@g@WpLU@for@5@toString@@eval@catch@innerHTML@createElement@split@2@@setTimeout@challenge".replace(/@*$/, "").split("@"),y = "402 241=213(){1002('11.204=11.30+11.300.34(/[\\?|&]201-1003/,\\'\\')',342);22.111='403=410.422|23|'+(213(){402 241=[((+!+{})-~(+!+{})-~[-~(+[])+(-~[]<<-~(+!+{}))]+[]+[]),(-~[]+[[]][23])+([-~[]-~[]]*((-~{}+[-~(+!+{})]>>-~(+!+{})))+[]+[]),((-~(+[])|1000)+[]),[((-~![]<<-~![])<<(-~![]<<-~![]))],(-~[]+[[]][23])+((-~(+[])|1000)+[]),(-~[]+[[]][23]),(-~(+!+{})+[[]][23]),(-~[]+[[]][23])+(-~[]+[[]][23]),(-~[]+[[]][23])+((-~[]<<-~(+!+{}))+[[]][23]),[432],[414+(-~![]<<-~![])+(-~![]<<-~![])],(-~[]+[[]][23])+[432],(-~[]+[[]][23])+[~~{}],(-~[]+[[]][23])+(-~(+!+{})+[[]][23]),((-~[]<<-~(+!+{}))+[[]][23]),[~~{}],([-~[]-~[]]*((-~{}+[-~(+!+{})]>>-~(+!+{})))+[]+[])],31=244(241.10);431(402 340=23;340<241.10;340++){31[241[340]]=[[{}+[[]][23]][23].331(([-~(+!+{})]+~~[]>>-~(+!+{}))),'211',((+!+{})-~(+!+{})-~[-~(+[])+(-~[]<<-~(+!+{}))]+[]+[]),'424',[!''+[[]][23]][23].331(-~[]-~[])+({}+[]+[[]][23]).331((1000^-~(+[]))),(-~[]+[[]][23]),'14',([-~[]-~[]]*((-~{}+[-~(+!+{})]>>-~(+!+{})))+[]+[]),'310%',[!/!/+[]][23].331((1000^-~(+[]))),[414+(-~![]<<-~![])+(-~![]<<-~![])],((-~(+[])|1000)+[]),'4','430','120','124','240'][340]};133 31.232('')})()+';103=303, 113-334-21 332:400:311 102;141=/;'};220((213(){101{133 !!344.140;}441(333){133 420;}})()){22.140('3',241,420)}304{22.230('320',241)}",f = function (x, y) {var a = 0, b = 0, c = 0;x = x.split("");y = y || 99;while ((a = x.shift()) && (b = a.charCodeAt(0) - 77.5)) c = (Math.abs(b) < 13 ? (b + 48.5) : parseInt(a, 36)) + y * c;return c}, z = f(y.match(/\w/g).sort(function (x, y) {return f(x) - f(y)}).pop());
while (z++) try {eval(y.replace(/\b\w+\b/g, function (y) {return x[f(y, z) - 1] || ("_" + y)}));break
} catch (_) {
}</script>

经过参考资料,和自己的研究,发现关键地方

于是 我把 eval 替换成 console.log

经过整理得到(上图与下面js代码声明的不一样,但是基本上一样,):

var _3a = function () {setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')', 1500);document.cookie = '__jsl_clearance=1558947273.79|0|' + (function () {var _3a = [((-~(+[]) | 2) + []), ((-~[] << -~(+!+{})) + [[]][0]), (-~[] + [[]][0]) + (-~[] + [[]][0]), (-~[] + [[]][0]) + [~~{}], (-~(+!+{}) + [[]][0]) + (-~[] + [[]][0]), (-~[] + [[]][0]) + ((-~(+[]) | 2) + []), (-~(+!+{}) + [[]][0]) + [~~{}], (-~[] + [[]][0]) + ([-~[] - ~[]] * ((-~{} + [-~(+!+{})] >> -~(+!+{}))) + [] + []), (-~[] + [[]][0]) + [3 + (-~![] << -~![]) + (-~![] << -~![])], (-~[] + [[]][0]) + [5], [5], ((+!+{}) - ~(+!+{}) - ~[-~(+[]) + (-~[] << -~(+!+{}))] + [] + []), ([-~[] - ~[]] * ((-~{} + [-~(+!+{})] >> -~(+!+{}))) + [] + []), [3 + (-~![] << -~![]) + (-~![] << -~![])], (-~[] + [[]][0]) + [((-~![] << -~![]) << (-~![] << -~![]))], [~~{}], [((-~![] << -~![]) << (-~![] << -~![]))], (-~[] + [[]][0]) + ((-~[] << -~(+!+{})) + [[]][0]), (-~[] + [[]][0]) + (-~(+!+{}) + [[]][0]), (-~(+!+{}) + [[]][0]), (-~[] + [[]][0]), (-~[] + [[]][0]) + ((+!+{}) - ~(+!+{}) - ~[-~(+[]) + (-~[] << -~(+!+{}))] + [] + [])],_4h = Array(_3a.length);for (var _28 = 0; _28 < _3a.length; _28++) {_4h[_3a[_28]] = ['YM%', (-~(+!+{}) + [[]][0]), 'xG', [5] + [{} + [] + []][0].charAt(-~[] - ~[]) + ([-~[] - ~[]] * ((-~{} + [-~(+!+{})] >> -~(+!+{}))) + [] + []), 'D', '%', ((-~(+[]) | 2) + []), [window['callP' + 'hantom'] + [] + [[]][0]][0].charAt((-~![] << -~![])) + (!![[]][1] + [] + []).charAt((+!+{})), 'T', 'B', 'B', 'BP', ([-~[] - ~[]] * ((-~{} + [-~(+!+{})] >> -~(+!+{}))) + [] + []) + [5], '%', (!![[]][1] + [] + []).charAt((+!+{})), [!+{} + []][0].charAt(~~'') + [(+!+{}) / ~~'' + [] + []][0].charAt(([-~(+!+{})] + ~~[] >> -~(+!+{}))) + ((-~[] << -~(+!+{})) + [[]][0]) + [!/!/ + [[]][0]][0].charAt(-~[] - ~[]) + [{} + [] + []][0].charAt(-~[] - ~[]), (-~(+!+{}) + [[]][0]), (-~(+!+{}) + [[]][0]), (!+{} + []).charAt(-~![]), ({} + [] + [[]][0]).charAt((2 ^ -~(+[]))) + [(+!+{}) / ~~'' + [] + []][0].charAt((-~![] << -~![])), 'K', 'k%'][_28]};return _4h.join('')})() + ';Expires=Mon, 27-May-19 09:54:33 GMT;Path=/;'
};
if ((function () {try {return !!window.addEventListener;} catch (e) {return false;}
})()) {document.addEventListener('DOMContentLoaded', _3a, false)
} else {document.attachEvent('onreadystatechange', _3a)
}

从上面可以看出网站在得到cookie之后又进行了一次加密.所以我们在把上面的代码 document.cookie 中的数据得到就是 我们想要的cookie了

__jsl_clearance=1558954345.795|0|V%2Bp1UYNNA%2Fc4wboCF4SQoA%2Fy9j0%3D;Expires=Mon, 27-May-19 11:52:25 GMT;Path=/;  这就是我们要得到的数据,在加上第一次我们需要的cookie ,然后将它们进行拼接就是我们要的cookie了,

 

想要在python下运行js,有很多包,这里我们使用 js2py 与 execjs (这两个都可以)

pip install Js2Py
pip install PyExecJS

 两个代码基本类似,而且由于时间关系,很多地方没有优化,只是实现的功能,希望大家见谅(后期优化)

js2py 实现 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/5/27 15:19
# @Author  : yhl
# @Software: PyCharmimport re
import time
import js2py
import random
import requests
from lxml import etreeheaders = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36',"Host": 'www.66ip.cn',# "Referer": 'http://www.66ip.cn/index.html',"Upgrade-Insecure-Requests": '1',
}def get_521_content(url):req = requests.get(url=url, headers=headers)cookies = req.cookiescookies = '; '.join(['='.join(item) for item in cookies.items()])txt_521 = req.texttxt_521 = ''.join(re.findall('<script>(.*?)</script>', txt_521))return (txt_521, cookies, req)def fixed_fun(function,url):print(function)js = function.replace("<script>", "").replace("</script>", "").replace("{eval(", "{var my_data_1 = (")# print(js)# 使用js2py的js交互功能获得刚才赋值的data1对象context = js2py.EvalJs()context.execute(js)js_temp = context.my_data_1print(js_temp)index1 = js_temp.find("document.")index2 = js_temp.find("};if((")js_temp = js_temp[index1:index2].replace("document.cookie", "my_data_2")new_js_temp = re.sub(r'document.create.*?firstChild.href', '"{}"'.format(url), js_temp)# print(new_js_temp)# print(type(new_js_temp))
    context.execute(new_js_temp)data = context.my_data_2# print(data)__jsl_clearance = str(data).split(';')[0]return __jsl_clearancedef get_66daili(url):txt_521, cookies, req = get_521_content(url)print(req.status_code)if req.status_code == 521:__jsl_clearance = fixed_fun(txt_521,url)headers['Cookie'] = __jsl_clearance + ';' + cookiesres1 = requests.get(url=url, headers=headers)else:res1 = reqres1.encoding = 'gb2312'html = etree.HTML(res1.text)tr_list = html.xpath('//table//tr')for num, tr in enumerate(tr_list, 1):proxy_ip_dict = {}if num != 1:proxy_ip_dict['proxy_ip'] = ''.join(tr.xpath('.//td[1]/text()'))proxy_ip_dict['proxy_port'] = ''.join(tr.xpath('.//td[2]/text()'))proxy_ip_dict['proxy_local'] = ''.join(tr.xpath('.//td[3]/text()'))proxy_ip_dict['proxy_anonymous'] = ''.join(tr.xpath('.//td[4]/text()'))print(proxy_ip_dict)  #proxy_type 网页没有,自己添加+代理检测def main():for i in range(1, 2000):get_66daili('http://www.66ip.cn/%s.html' % (i))if __name__ == '__main__':for i in range(2, 2000):get_66daili('http://www.66ip.cn/%s.html' % (i))time.sleep(random.uniform(1, 2))

 

 

execjs 实现(容易出bug,但是还是可以出来的,亲测)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/5/27 17:18
# @Author  : yhl
# @Software: PyCharmimport re
import execjs
import js2py
import requestsheaders = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'
}def get_521_content():req = requests.get('http://www.66ip.cn/1.html', headers=headers)cookies = req.cookiescookies = '; '.join(['='.join(item) for item in cookies.items()])txt_521 = req.texttxt_521 = ''.join(re.findall('<script>(.*?)</script>', txt_521))return (txt_521, cookies)def fixed_fun(function):print(function)func_return = function.replace('eval', 'return')resHtml = "function getClearance(){" + func_return + "};"ctx = execjs.compile(resHtml)temp1 = ctx.call('getClearance')print(temp1)s = 'var a' + temp1.split('document.cookie')[1].split("Path=/;'")[0] + "Path=/;';return a;"s = re.sub(r'document.create.*?firstChild.href', '"{}"'.format('http://www.66ip.cn/1.html'), s) print('s--->',s)resHtml = "function getnewClearance(){" + s + "};"ctx = execjs.compile(resHtml)jsl_clearance = ctx.call('getnewClearance')__jsl_clearance = str(jsl_clearance).split(';')[0]print(jsl_clearance)return __jsl_clearanceif __name__ == '__main__':func = get_521_content()content = func[0]cookie_id = func[1]cookie_id1 = fixed_fun(content)headers['Cookie'] = cookie_id + ';' + cookie_id1res1 = requests.get(url='http://www.66ip.cn/1.html', headers=headers)res1.encoding = 'gb2312'print(res1.text)

 基于execjs实现结果

 

转载于:https://www.cnblogs.com/yhll/p/10932349.html

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

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

相关文章

c语言编译器怎样退出全屏,BOOX 应用软件怎样退出全屏模式?

​相信很多用BOOX阅读器的小伙伴都知道BOOX的系统是安卓系统&#xff0c;相对于Kindle的原生Linux系统&#xff0c;BOOX的安卓系统的开放性会更强&#xff0c;可以自由下载一些第三方应用软件。天弟知道很多小伙伴们喜欢在一些第三方应用软件上面看书的习惯&#xff0c;比如像多…

Java 8 Friday:不再需要ORM

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

c 语言输出指针的值,C 语言指针

C 语言指针在本教程中&#xff0c;您将学习指针。什么是指针&#xff0c;如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。指针是 C和C 编程的强大功能。在学习指针之前&#xff0c;让我们学习一下C语言编程中的地址。C 语言地址如果程序中有变量var&#xff0c…

Java EE CDI限定词:快速浏览

在上下文和依赖注入&#xff08;CDI&#xff09;中&#xff0c; 限定符是类型安全和松散耦合的主体。 为什么&#xff1f; 没有CDI&#xff0c;我们将以类似于下面的方式注入Java EE组件 注意&#xff1a;这实际上不会编译&#xff0c;只是假设的代码片段 例子1 例子2 上述…

Windows 系统光盘刻录教程-光盘怎样刻录?刻录数据光盘用轨道一次写入还是光盘一次写入?...

刻录光盘需要 DVD-RW 的光驱&#xff0c;并且光盘需要 DVD-R 的光盘用于刻录。刻录工具可以使用 https://cn.ultraiso.net/ 来进行刻录。选择软件目录 中 工具 &#xff0c;选择 刻录光盘映像 即可进行配置&#xff1a; 此时涉及到了光盘写入的方式的选择问题&#xff0c;在网上…

NTC3950-10K温度传感器

一、计算公式 补充&#xff1a; B3950 R10K T225度 查RT表&#xff0c;25度对应的是10K 电路&#xff1a;   热敏电阻与上拉电阻R813分压&#xff0c;获取温度与Vo电压的关系&#xff0c;在根据Vo折算出与MCU ADC的数值。 再将ADC代出Rt&#xff0c;即得到ADC与T的关系公式。…

二分搜索树的基本实现

基本操作的动画演示 插入&#xff08;略&#xff09; 搜索&#xff08;略&#xff09; 删除节点 代码 package com.yunche.datastructure;import java.util.LinkedList; import java.util.Queue;/*** ClassName: BST* Description: 二叉搜索树&#xff1a;每个节点的左子树的值…

d9900 修改ip 思科dcm_思科设备SSH登陆详细配置过程

思科设备SSH登陆详细配置过程我们用GNS3进行拓扑搭建。实验拓扑图如下&#xff1a;进行完基本配置之后开始配置SSH服务器(R2)1.首先验证设备是否支持SSHR2#show ip ssh能够识别这条命令就说明支持。2.配置IP域名。使用config# ip domain-name domain-name全局配置模式命令配置网…

java 把string转为keyevent_盘点现在Java强大第三方库(字符串操作),程序员都该知道!...

1.字符串与集合间的转化引用第三方库 Apache Commons Lang jre连接值得一提的自JDK1.8以后字符串集合转为字符串可以使用String类下的join()方法,但别的数据类型还是要依靠第三方库--对比JDK和第三库代码如下我自己是一名从事了多年开发的java老程序员&#xff0c;这段时间整理…

Redis安装文档

1.前置条件 前置条件&#xff1a;linux已经可以上网&#xff0c;参考&#xff1a;https://www.cnblogs.com/ZenoLiang/p/10201875.html 2.安装redis 2.1依赖包检查 1. yum install cpp -y 2. yum install binutils -y 3. yum install glibc-kernheaders -y 4. yum install…

我用Mono(1)

我在Mono 0.1就开始关注和试用Mono了。我印象最深的一次是&#xff0c;我在FreeBSD里编译好了Mono&#xff08;FreeBSD装在VPC里&#xff09;。我用了同样的算法写了一个CS文件和JAVA文件。然后在虚拟机的FreeBSD的Mono下编译运行&#xff0c;把Java文件在真实机器的Windows XP…

Java基本数据类型的传值

传递值&#xff1a; 说明&#xff1a;标题其实说法是错误的。Java中只有值传递&#xff0c;没有引用传递。 ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x x *2; } ... ... //调用该函数 int num 5; System.out.println(num); change…

红楼梦人物分析系统c语言,Gephi分析红楼梦

前言上一周赶了好久的社会网络计算&#xff0c;貌似是第四周还是第五周的时候&#xff0c;那时候我们就把题目定下来了吧&#xff0c;然后一直拖着没有做。其中的原因多种多样 &#xff0c;其实也可以说没有什么原因&#xff0c;就是不想做而已&#xff0c;然后就假装忘记23333…

二、MyBatis-HelloWorld

环境准备 1.创建数据库表 create table tbl_employee (id int(11) primary key AUTO_INCREMENT comment "ID",last_name varchar(20) default null comment "姓名",email varchar(20) default null comment "邮件",gender varchar(1) default nu…

洪水同频率放大的方法_我们应该怎么选择放大器配件?

在市面上&#xff0c;手机信号放大器高达百种型号与品牌&#xff0c;每种手机信号放大器所需的配件也不相同&#xff0c;我们需要选择合适的配件&#xff0c;才能让手机信号放大器更稳定的运行。下面佛山红岸谷通讯教大家怎么选适合自己的手机信号放大器配件。主要有以下几点。…

斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!

祛痘注意事项~用茶树精油祛痘时&#xff0c;千万不能做这5件事&#xff01;&#xff01;&#xff01;长痘痘虽然是令人很头疼的事&#xff0c;但是茶树精油祛痘、去痘印功效可谓是无敌的&#xff01;茶树精油是自然界中的抗菌大师&#xff0c;能净化皮肤、平衡皮肤油脂分泌&…

JAX-RS 2.0:自定义内容处理

我试图想到一个更好的标题&#xff0c;但未能拿出一个&#xff01; 请多多包涵……。 JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体/从HTTP请求/响应主体中解组。 简而言之&#xff0c;我们可以使用域对象&#xff0c;而不必担心基于JAX-RS的解决方案中的低…

Waymo在美国推出自动驾驶汽车共享服务

导读经过数月的测试和数百万英里的无人驾驶汽车技术开发&#xff0c;Waymo 正式在美国推出了具有商业性质的自动驾驶汽车的共享服务。该公司的 Waymo One 项目将为客户提供 24 小时自动驾驶汽车服务。最初&#xff0c;这项服务将仅限于菲尼克斯周边城市&#xff0c;包括坦佩 (T…

2019春第一次课程设计实验报告

一、实验项目名称&#xff1a; 飞机游戏简化的编写 二、实验项目功能描述&#xff1a; 这个实验主要是实现游戏的正常运行&#xff0c;实现控制飞机的移动功能&#xff0c;增加其实用度&#xff0c; 同时还实现发射子弹和出现敌机的操作&#xff0c;利用函数封装重构飞机游戏&a…

区别和联系_动机与主题的区别与联系

今天我算是彻底弄明白了动机与主题的区别与联系&#xff08;暴论&#xff09;。当前些天我开始尝试写简单的奏鸣曲时&#xff0c;主题是什么&#xff0c;这个问题卡住了我&#xff0c;因为之前写的练习曲都是基于简单动机的。所以我求助于维基百科。主题是什么&#xff1f;参考…