2023年6月29日发(作者:)
python⾼级——从趟过的坑中聊聊爬⾍、反爬、反反爬,附送⼀套⾼级爬⾍试题前⾔:时隔数⽉,我终于⼜更新博客了,然⽽,在这期间的粉丝数也就跟着我停更博客⽽涨停了,唉是的,我改了博客名,不知道为什么要改,就感觉现在这个名字看起来要洋⽓⼀点。那么最近到底咋不更新博客了呢?说起原因那就多了,最主要的还是没时间了,是真的没时间,前⾯的那些系列博客都还没填坑完毕的(后续都会填上的)最近有点空余就⼀直在开发我的项⽬,最近做了两个项⽬:IPproxy,看名字就知道啦,就是⼀个ip代理池,爬取了各⼤免费的代理⽹站,然后检测可⽤性, 相关的介绍github上已经说明了get_jobs,爬取了⼏⼗个招聘类⽹站的数据, 同样的,相关的介绍github上已经说明了根据以上爬取的⼤概也许可能接近上百个⽹站吧,加上我初学爬⾍的时候爬的⽹站,现在也算是爬了有接近上千个⽹站了,对爬⾍也算是⼩有⼼得了,下⾯就开始说说吧以下是总结式的解析,个⼈觉并不太适合零基础的朋友,也不会有过多的图⽂展⽰,当然我也会尽量的把问题说清楚点,⽽且我也不是爬⾍⼤佬,只是根据最近的爬⾍经历总结出的经验,我确实不太建议零基础的朋友往下看,你可以先看看我之前的博客⽂章或者看其他⼤神的⽂章之后再来看我这篇,因为爬⾍涉及了前端和后端还有前后端之间的交互等的技术,⼀些底层的原理之类的,不是说不给零基础的朋友看,是如果没这些知识做基础可能看不懂(不是瞧不起⼩⽩的意思,我也是⼩⽩过来的)。当然爬⾍界的⼤佬们如果偶然点开,那还请多多包涵,我⽬前技术确实还有待提升爬⾍前提:1.法律问题最近时不时总是冒出⼀两个因为爬⾍⼊狱的新闻不⼀⼀截图了,⾃⼰⽹上搜吧,其实现在越来越多了有朋友要说,“为什么我学个爬⾍都被抓吗?我犯法了吗?” 这个⽬前还真的不好说,主要是什么,⽬前爬⾍相关的就只有⼀个robots协议,⽽我们都知道robots协议是针对于通⽤爬⾍⽽⾔的,⽽聚焦爬⾍(就是我们平常写的爬⾍程序)则没有⼀个严格法律说禁⽌什么的,但也没有说允许,所以⽬前的爬⾍就处在了⼀个灰⾊地带,⽽很多情况下是真的不好判定你到底是违法还是不违法的。 好消息是,据说有关部门正在起草爬⾍法,不久便会颁布,后续就可以按照这个标准来进⾏了。2.爬⾍分类:上⾯说了,有通⽤爬⾍和聚焦爬⾍通⽤爬⾍:针对于百度,搜狗,⾕歌这类搜索引擎类的爬⾍程序聚焦爬⾍:⼜名定向爬⾍,就是我们平时写的针对某个需求或者某个问题⽽写的程序3.爬⾍能爬什么数据:⼀句话, 所见即所得 ,什么意思,你⽤浏览器能访问,能查看的⽹页数据,⽤爬⾍就可以爬到,反过来,你浏览器都⽆法访问的,爬⾍是⽆法爬到的,除⾮你⽤⼀些违法的⼿段获取到举个例⼦:你⽤浏览器打开百度,打开淘宝,可以看到的⼀切数据,爬⾍都可以获取到你有优酷的vip账号,你可以⽤浏览器看vip视频,那么爬⾍也可以获取到你没有优酷的vip账号,你⽆法查看vip视频,爬⾍也就⽆法获取到我知道有⼀部分圈⼦⾥的朋友之间流传着有什么破解vip之类的,那种其实也是符合所见所得的,你没有vip,别⼈有啊,假如⼀个已有vip账号的⼈把视频下载下来上传到云服务器A,然后你访问某个⽹站,⽹站后台请求的是云服务器A,最后呈现视频数据给你,不说了,扯远了爬⾍⼯具:⼀.⼯具分类:分类看以什么分了,有⾃动的,有⼿动的,有在线的,有离线的,有傻⽠式的,有⾮傻⽠式的,有分析辅助为主的,有⾃开发式的,看每个⼈怎么定义了傻⽠式的:⽐如什么 ⼋⽖鱼,爬⼭虎 ,啥啥的⼀⼤堆,在线的傻⽠式的⼯具,根据提⽰点点⿏标,输⼊⼏个字就完了,但是这种⼯具普遍得到的结果不是很理想分析类的:以下的都是作为辅助分析整个请求过程的⼯具fiddler :常⽤的抓包分析⼯具charles:和fiddler类似,优点是可以⾃定义上下⾏⽹速、代理、反向代理,且配置简单、可解析AMF协议数据wireshark:⽹络封包分析软件,功能⾮常强⼤,但是在爬⾍层⾯来说,辅助的意义不算⼤burpsuite:类似fiddler,但是功能更多更具体,且这个包在⽹络安全⾏业来说是个必不可少的⼤杀器.......⽽需要点技术的就是⾃开发式的,⽐如⾃⼰借助某个开发语⾔写爬⾍程序(或者说脚本)就是了⼆.⾃开发式的哪些开发语⾔可以作为爬⾍其实还挺多的phpjavascript —— pythongolangphp写爬⾍是可以的,但是多线程多进程不太⽀持,所以针对⼤型⼀点的项⽬不够理想nodejs的curl⼯具也是可以写爬⾍的,有什么优缺点我暂时不知道,我没⽤过java的话,听⼤佬说的,写出来的爬⾍程序很臃肿,不是说不好哈,我暂时只是有⽿闻,没⽤过golang天⽣⽀持⾼并发,性能提升很多,也可以做爬⾍,这个我暂时只是有⽿闻,没⽤过python的话写爬⾍真的是⼀种神器般的存在,⽬前⽹上的爬⾍程序,可能百分之⼋九⼗都是⽤Python写的其他语⾔只要⽀持⽹络服务应该都可以写爬⾍,这⾥就不多说了三.python的哪些相关的⼯具可以写爬⾍⾃带的库:python2下:python3下:urllib第三⽅的库:requestscrawleyprotianewspaperpyspiderpython-goosescripyscripy-redis其他相关的库:lxmljsonbeautifulsouprepyqueryexecjsjs2py⽬前就想到这么多平常的话,做⽹络交互我就⽤requests库,但是有些⼩问题,⽤多了的⼈应该都知道,requests库⾥的异常类不够全,有时候报错了⽆法捕获做数据解析的话我⽤ json,re , lxml, beautifulsoup,pyquery,execjs,js2py 都有在⽤,只要有场景需要就会⽤⼤型项⽬就上 scripy ,需要分布式就上 scripy-redis四.爬⾍中常见的问题,常见的反爬机制其实我之前转载过⼀篇爬⾍相关的⽂章 ,转载的爬⾍⼤佬崔庆才的⽂章,他的⽂章总结性就⾮常强了,各种层⾯都涉及了,我还要⾃⼰再写⼀篇的原因就是,下⾯的问题真的是我亲⾝经历的问题,以下的有些问题很可能对有些⽼哥还说不算问题,各有各的开发思路,按照我那样的思路也许就会遇到这些问题,⼀来是做个记录,⼆来是帮助那些遇到跟我同样问题的朋友。重头戏终于来了,哈哈,我也有点按奈不住了1.请求头之User-agent这个稍微接触过⼀点点爬⾍的应该都不陌⽣,不是说接触Python爬⾍,不管你⽤什么开发语⾔来写爬⾍,应该都会⽤到这个。⼤概解释⼀下,就是⼀个⾝份的象征,这个可以⽤浏览器⾃带的调试⼯具查看,访问⼀个⽹站的时候,按f12键或者⿏标右键打开调试(有的浏览器叫检查,或者查看元素),然后切换到network(⽹络),重新刷新⼀次⽹站,就会出现所有的请求,随机点击⼀个,右边出现的就是请求头信息了,如下,这是我访问某某⽹站的,我使⽤的浏览器是⽕狐,然后图上标注的就是user-agent具体怎么⽤呢?⽐如:这样就可以带上UA了如果不带的话,你的⽬标⽹站服务端是可以检测到是浏览器还是爬⾍⼯具在访问数据的,就看你的⽬标⽹站的友好度了,如果反爬机制做的很⾼效,到这⾥你就被ban了2.调试⼯具之痛很多时候我们为了查看⽹页的DOM结构可能就直接⽤浏览器⾃带的调试⼯具(就是上⾯说的按f12键)来查看,这个的话,⼤部分⽹页是可以应对的,但是,少部分⽹站⽤调试⼯具查看的DOM结构和整个⽹页的源码是不⼀致的,说个最近的事,我爬某视频⽹站,调试⼯具打开他在每个重要信息都加了⼀个css样式,这个css样式是通过定位某个html标签(假设为标签)设置上的,我解析⽹页的时候就很痛苦,调了很久,就是得不到结果,最后发现这个span标签是⽤js拼接上的,换句话说,服务端回应的是不带有这个span标签的,所以就要没有这个span标签来处理。说这么多不知道看官您能不能理解,遇到过这个问题的朋友应该明⽩我在说什么3.异步请求上⾯说的DOM结构不⼀致还有⼀种可能,就是前后端⽤的Ajax 异步请求 的,所以你打开浏览器的调试⼯具查看DOM结构和你⽤Python获取的结果也是不⼀致的,这个相信会玩爬⾍的⽼哥们都不陌⽣4.请求头之Cookies有⼀部分⽹站,当你访问⾸页时,会⾃动设置⼀个cookie,然后访问同站下的其他页⾯就会验证这个字段,如果不匹配就会禁⽌访问如下,访问百度都会⾃动设置⼀些cookie:5.请求头之特殊字段特殊字段是什么呢,就是某⽹站特有的⼀些字段,⽐如以下的boss直聘⽹:会带有这些特殊的字段。当然这⾥只是举个例⼦,,经过我的测试,我圈出来的那⼏个[:method]等的字段其实请求的时候是不⽤带上的6.请求头之Referer这个referer是⼲嘛的呢?⾸先该字段的值都是上⼀级⽹站的url,根据我的理解,它有以下作⽤:1.做前端的朋友知道,可以借⽤这个字段直接返回到上个页⾯2.还可以通过这个追踪流量来源,⽐如某某公司在百度上做了SEO(打了个推⼴⼴告),当⽤户通过百度点进来的话,就可以通过referer追踪来源,对⽤户做进⼀步的⾏为分析3.检测来源的合法性,因为都可以知道通过某某url路径过来的,那么就可以判断来源是否合法,如果异常的话就可以做拦截请求等等的有的⽹站就是因为有这个验证,所以返回的数据不正常,带上就OK了。还有的⽹站更奇怪,你不带上也不会报错,返回的数据也是希望的数据,但是⽆法和页码匹配,⽐如你请求的是第⼀页的数据,它有可能返回的是第5页的数据。遇到过这个问题的⽼哥应该知道我在说什么7.请求头之accept:不知道⽼哥您遇到过这个问题没有,在请求头⾥,如果服务端返回的结果是普通的html页⾯的话,值就应该是如下的:'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',如果返回的是json字符串(返回json字符串的话,往往是属于异步请求)的话,值就应该是这个:'Accept': 'application/json, text/javascript, */*; q=0.01',这个不知道你们有没有体会,反正我记得我爬某⽹站的时候,因为都通⽤的同⼀个请求头,有的⽹站就是返回json数据,我怎么改代码都⽆法得到正确的值,就是因为本来是json字符串的我的accept⽤的上⾯的html页⾯⽤的,导致返回数据不符合事实。8.请求头之 Connection这个字段字⾯意思就是http连接嘛,http链接最根本的就是tcp/ip连接了,什么三次握⼿,四次握⼿之类的,这些就不展开了,要说就占篇幅了。我们都知道,http请求属于短连接,访问就有,关闭浏览器就会⾃动断开的,这种就是短连接,对应的长连接就是websocket,这个就不展开了,⾃⾏百度了。这个Connection字段有两个值,⼀个是 keep-alive,⼀个是close,keep-alive的话往往就跟前⾯的带有cookie相关,他会保存session会话(如果关闭浏览器的话就没了,有的⽹站是保存⼀个字段,默认有⼏天的有效期),作为同⼀个连接来请求另⼀个页⾯,如果是close的话,就是每次访问都是重新和服务端建⽴⼀个连接,不会保存session这个问题的话,在⼀般情况下还是不会遇到,主要就是在⾼并发请求的时候,有可能同⼀个时刻请求多次来⾃同⼀个站点的数据,触发该⽹站的反爬机制的频率限制,就会出现什么t,nnection之类的错误。所以从那次之后我的爬⾍程序如果⽤了⾼并发的话,我都会把这个connection设置为close9.返回数据gzipgzip的意思就是这个⽹站的数据是做呀gzip压缩的,在浏览器(客户端)访问之后,会⾃动处理这类格式的数据。但是使⽤Python的标准款urllib的话,是不会处理这类格式的, 解决⽅法就是⽤requests库,会⾃动处理gzip格式,反正这个库真的太强⼤了ts库的弊端嘿嘿,刚说完requests很强⼤,马上说它的弊端,是的,就是这么骚⽓。它有什么弊端呢,如果经常使⽤requests库作为主要的⽹络请求的话,使⽤时间越长的⽼哥,就越会发现它有个弊端,就是它封装的异常类不够全,在报错各种各样的异常的时候,它有时候捕获不到,⽆法进⾏针对性的处理,这就是它的弊端,这个怎么解决呢,⽬前我的话,没有⼀个很好的解决⽅法,只能⽤Eception或者BaseEception类来捕获。当然这个问题也不是⼀定会遇到,有时候只是某个其他的异常爆出,导致后续的代码跟着出错,然后跟着抛出异常,所以也不能盲⽬的⽤异常基类来捕获11.登录验证有的⽹站为了解决⽹络请求的拥塞,就做了账号登录验证,你必须登录账号之后才能正常访问页⾯,⼀般的⽹站登录之后返回的就是上⾯说的cookie字段,有的也会返回⼀个特殊的字段作为验证,我记得百度登录之后⽤的字段是BAIDUID。这个不需要多说什么,找到登录接⼝,提交账号密码参数访问登录接⼝就⾏了12.请求头之token这个token在语义上就是个令牌的意思,⽤的⽐较多的地⽅就是在⼿机端上⽤token验证,此⼿机端的验证对应的电脑端⽤的session验证,⽽电脑端⽤token的情况就是,特殊字段的变异,有的⽹站就放在请求头的authorized键⾥,值就是token,⽤uuid⽣成的,有的就是⾃定义的键,⽐如boss直聘的就是__zp_stoken__,必须要带上这个字段才能爬取(因为boss直聘的反爬机制升级了,以前直接可以爬,现在必须带上这个字段才⾏,说句题外话,⽬前我还没找到boss直聘这个字段是怎么⽣成的,⽤fiddler抓包发现请求了阿⾥云的服务端,但是返回的数据是空,反正没找到它是怎么⽣产的)13.登录验证+token有的⽹站在⽤户登录之后感觉还不够安全,就会再对token验证,如果登录验证和token都通过了说明是正常登录操作,才放⾏。当然也有的⽹站不需要登录也会分配⼀个token,⽐如上⾯的boss直聘,这个就不多说了,就是以上的结合14.设备验证(⼿机,电脑)⼀般情况下,电脑能访问的页⾯,⼿机⼀定能访问,只是如果该站没有作响应式的话,⽤⼿机访问的页⾯排版很乱,因为⼿机和电脑的尺⼨不⼀样嘛。但是⼿机能访问的,电脑不⼀定能访问,⽐如某app,或者微信⼩程序,它会做设备验证,发现不是⼿机页⾯的话就会拦截或者提⽰让你⽤⼿机下载该app查看。有朋友要问了,是⽤的什么来检测你是⼿机还是电脑的呢?就是前⾯最开始说的User-agent,说到这,怎么解决这个问题不⽤多说了吧,同样的伪造成⼿机的UA就⾏了,当然如果是针对app的爬取的话,⼀般就在电脑上下载模拟器(夜神模拟器啥啥的),然后fiddler抓包分析,然后再爬取15.重定向这个跟http的状态码有关了,不多说,返回的状态码是3**的就是重定向范畴⾥的,⽐如下⾯的百度:这种⽹站怎么爬取呢,requests会⾃动处理重定向的问题,没错,requests就是这么抗打16.触发跳转到新的标签页什么意思呢,就是⽐如我在某⼀个⽹站点⼀下按钮,触发机制,⽤新的⽹页标签打开的,前端的朋友应该知道,就是a标签属性⾥加了个target='_blank',这种的话,我们⽤浏览器分析的就⽆法即使的通过调试⼯具查看了。其实习惯上我喜欢⽤浏览器⾃带的调试⼯具分析,⽅便快捷的操作,实在不⾏的话就上fiddler啥的抓包⼯具,没错,解决⽅法我已经说了,⽤抓包⼯具就可以破17.调试⼯具触发js的debug监听器这个我不知道你们遇到过没,我有⼀次抓某个⽹站,它就是为了防⽌我这类瞎jb搞的⼈分析它的代码,分析它的请求过程,所以当我⼀打开调试⼯具,就触发它的监听器,然后我就发现我电脑的CPU⽴马跑满了,⼀直在消耗我的电脑资源直到电脑卡死,所以我只能感觉关闭调试⼯具或者关闭浏览器,实在不⾏只能重启了,它就是监听的debuger,我不知道这个是⼀个函数还是⼀个类,以下是我保存的代码,看有缘⼈能不能看懂,看懂的话我就以⾝相....,不对,⾛错⽚场了,卧槽。。。var check = (function () { var callbacks = [], timeLimit = 50, open = false; setInterval(loop, 1); return { addListener: function (fn) { (fn); }, cancleListenr: function (fn) { callbacks = (function (v) { return v !== fn; }); } } function loop() { var startTime = new Date(); debugger; if (new Date() - startTime > timeLimit) { if (!open) { h(function (fn) { (null); }); } open = true; (); } else { open = false; } }})();加密cookie说到这,如果是那种监听debug⼯具的+js加密的话,那可就真的难操作了,哈哈哈,好像我还没有遇到⽹站这么⼲的库之编码有的时候如果要传递参数到服务端的话,那么就得做url编码,使⽤url编码解码就可以⽤和e,使⽤quote⽅法作编码的话,默认使⽤的是utf-8的编码,但有时候⼀些⽹站⽤的gbk,所以这是⼀个坑,你得⽤quote(kw,encoding='gbk')才能转为gbk的编码,不熟悉这个的话就很难发现这个,因为我们⼀般就直接⽤quote就⾏了,根本不在意是⽤了什么编码之痛嘿嘿,⼜是requests库的问题,准确说其实不是requests的问题,⽽是跟上⾯的quote⼀样,我们平常遇到的⽹站基本都是不会出现这个情况,当出现的时候我们就傻眼了,requests库的粉丝们,放下你们⼿上的菜⼑,我是友军啊,我也⼀直在⽤requests,只是发现了这⼀两个情况⽽已不多说了,requests做post请求时,提交的data字段会默认将data字段作url编码,且默认⽤的utf-8编码,对的,⼜是编码的锅,⽽有的⽹站⽤的并不是utf-8编码的,假如某⽹站⽤的是gbk编码,如果我们还是默认的操作的话,就会出错,解决办法就是,⼿动编码:解析tbody解析⽹页结构的⼯具很多,⽐如⼀⼤杀⽓正则表达式,然后就是xpath,再然后就是bs4,最近我痴迷于xpath,我觉得写起来异常的顺畅,⾮常有感觉,但是在其中还是遇到了问题如下,⽆法解析带有tbody标签,这个是我最近发现的,不知道是不是版本问题,只要⽹页的DOM结构⽤tbody,⽐如table标签下有tbody/tr/td时,我要取td下的数据,按理就是写的('//table/tbody/tr/td/text()'),但是这样写就是TMD的拿不到,得去掉tbody,写成这样就可以拿到:('//table/tr/td/text()'),总之就是不能带tbody,如果有就直接跳到下⼀级就⾏,我估计是这个tbody被错误的解析成body标签了元素选取⼀般情况下,我们获取某个数据的话,直接就根据class属性或者id属性,反正就⼀些⾮常特定的属性三两下就可以定位元素,但是有的元素就是什么属性都没带的,就只是⼀个标签名,⽽且这个标签⽤的还异常的多,此时此刻的话,你就可以你的⽬标元素就近的标签有没有很特殊的属性,直接就可以定位的,然后⽤following-sibling定位兄弟元素即可,⽐如:following-sibling::span[1]/text(),补充⼀个:回到上级:⽤ 【..】表⽰回到上级,再补充⼀个,⽤contains(text(),'xxx'):根据⼀个元素的内容包含某个字段来定位当然这⼏个都是很简单的,这个本来就是xpath的基础部分,但是我跟你说,这三个配套使⽤的话就没有锁定不了的元素,通通⼀杀⼀个准,真的,我感觉⽤多了xpath,⽐⽤beautifulsoup还顺⼿23.简单验证码简单验证码,⽐如⼀些⾁眼很好看出的验证码的话,可以借⽤tesseract库来识别,做ocr提取,⽐如以下就是我那个IPproxy⾥的某⼀段代码:直接就可以把简单的验证码的数据提取出来,更多的操作就不说了,⽹上⼀⼤堆24.滑动验证码滑动验证码的话,以极验的滑动验证码为典型,之前⽹上有⼀⼤堆的极验验证码破解,不过都是2.0的破解,更新到3.0之后,破解的⼈就少了,不过,嘿嘿,我还是破解了,我不多说,感兴趣的可以看看我的源码,包括腾讯系的我也破解了: (就在我的github⾥,我不说是哪个,嘿嘿,⽪⼀把)⽹易系的就不多说了,坊间传闻的,⽹易的滑动验证码本来就是抄袭极验的(不是我说的),所以破解⽅法差不多,感兴趣的可以根据我的代码⾃⾏修改代理终于说到这个问题了,稍微接触过爬⾍的⼈都知道,你知道访问频率太频繁你电脑的公⽹IP就会被ban的,那么你就需要⽤上ip代理防⽌ip被ban⽆法继续爬数据的,也不多说,各位⽼哥如果需要请⽤⿏标滑到这篇⽂章的顶部,有写好的,现成的哦,不定期更新代码哦~26.访问频率控制有的⽹站⽐较⼤型,每天的访问量很⼤,那么这个⽹站对访问频率的限制就没那么严格,如果是⼩⽹站限制就会严⼀点,当然凡是⽆绝对,这个真的就看你的感知了,你如果感觉按你的代码运⾏下去可能爬不了⼏个数据就请求超时了,多半是触发访问频率的峰值了。如何解决,就只能看你⾃⼰怎么优化代码,保证代码每次请求的都不⾛空了,这个就没法具体的说了,你可以⽤协程来回的切换啥啥的27.提升性能:提升性能的话,要说的还挺多的,我就说⼏个⽐较典型的,如果你发现你的代码运⾏是串⾏的,你可以⽤gevent协程做切换,或者⽤线程池,或者⽤线程池+异步的⽅法,然后⽹络请求属于IO操作,所以不适合上多进程的⽅式如果你还觉得速度不够快,可以弃掉requests库改⽤aiohttp库,这个也是⽹络请求的库,不过是异步请求的,requests是阻塞式的请求还觉得不够快,可以⽤JIT,即使编译技术,把你觉得⽐较耗时间的代码块⽤上JIT还觉得不够快,可以再⽤上解释器来直接解释这段代码,⽐如win平台下,直接⽤cpython对你的代码进⾏处理,其他平台的就⽤其他平台的解释器了,不多说了还觉得不够快,技术再强点的话,可以写原⽣的C代码,把⼏个关键的操作抽离出来,⽤C来重构,然后运⾏的使⽤直接调⽤这段C代码(python有直接运⾏C代码的库,很多,⽹上⾃⾏查询)还觉得不够快,升级你的硬件配置了还觉得不够快?卧槽,没完了是吧,已经这样了,还想怎么个优化法啊⽼铁?好的,以上就是我遇到的问题,在这过程中,有可能会遇到⼀些⾮常奇葩的问题,你简直⽆从下⼿的,然后慢慢找原因,找为什么,这样发散式的,⼜学到了新的东西。通过爬⾍,我也对Python有了新的理解,新的体悟,从问题中成长,得到提升还是不错的爬⾍还有没有新的技术层⾯确切的说,⼀定有的,据我⽬前的⽔平来理解的话,爬⾍研究到⼀定层⾯的话,还跟⽹络安全有联系,⽐如跟逆向⼯程就有联系,逆向分析⼀个⽹站或者app什么的,我是真的觉得爬⾍要研究透,估计得爬到上万的⽹站/app才敢说通透了。好的,以下分享⼀套爬⾍题,这个是我关注的⼀个 爬⾍⼤佬(⼈称亚⼀爬,微博:梁斌penny) 发的⼀套题,⾥⾯就有涉及⽹络安全的东西,感兴趣的可以⾃⼰做⼀下,先说明,我这⾥没有答案的哈,⾃⾏百度查看答案1. 使⽤python中的requests库时(⽬前版本v2.22),以下哪种说法不正确:A. ⽀持⾃定义请求中的headers顺序B. ⽀持不同域名使⽤不同代理C. ⽀持http2D. ⽀持socks代理2. ⼀般来说, python的函数会对传⼊的url进⾏urlencode操作. 但当如下代码中的keyword为哪个选项时, ⽆法得到预期的结果:代码:('/item/{}'.format(keyword))A. '梁斌'B. 'C# ⼊门经典'C. 'r&b'D. '川上とも⼦'3. 如果进⾏⼤规模并发抓取(⽐如1000并发+,单核单进程),下⾯哪个python的库的效率最好的:A. urllibB. requestsC. D. aiohttp4. 使⽤Chrome devtools控制单个Chrome浏览器进⾏⾃动化操作时(原⽣chrome,且不使⽤插件的情况下),以下哪个说法正确的是:A. 不能控制Chrome中的多个窗⼝B. 不能抓取来⾃⽹络层的原始数据C. 不能动态切换Chrome的代理D. 不能禁⽌图⽚加载5. 以下对于Chrome headless模式的描述中,哪个是错误的?A. headless模式的User-Agent与普通(⾮headless)模式是不⼀样的B. headless模式是有BOM和DOM的C. headless模式是不⽀持Webassembly的D. headless模式是⽀持⿏标点击事件的6. 下列那种加密⽅式能最⼤限度抵御彩虹表的爆破:A. HMAC-MD5B. MD5C. MD4D. SHA17. 现在很多app采⽤了证书锁定ssl pinning来防⽌中间⼈攻击,关于ssl pinning下列说法错误的是:A. ssl pinning是将服务端证书打包内置到移动客户端中,HTTPS连接建⽴时与服务端返回的证书对⽐⼀致性,以确定这个连接的合法性B. 采⽤ssl pinning的app,仍然可以直接使⽤mitm proxy,fiddler等抓包⼯具可获取到明⽂包C. 使⽤frida等⼯具绕过证书锁定后,抓包⼯具才能获取到明⽂HTTPS数据包D. 采⽤了ssl pinning证书锁定的app,内置证书⼀般为⾃签名证书8. 以下对xposed的描述中,正确的是:A. xposed是对内核中init进⾏修改,使其能够注⼊到任何进程中B. xposed不能hook native中的函数C. xposed中的会出现在任意apk进程的/proc/self/maps中D. xposed并不⽀持Android Oreo的版本9. 以下哪条语句能在frida中输出2019, Pet类定义如下:public class Pet {private static int kind = 2019;private static int kind(){return 9102;}}A. ( Pet._kind );B. ( );C. ( Pet._ );D. ( );10. 关于app反调试下列说法错误的是:A. app可以通过ptrace⾃⾝,来阻⽌调试器ptrace附加到app进程实现反调试B. 在对程序脱壳过程中,经常需要将/proc/pid/mem或者/proc/pid/maps下内存数据dump出来, 可以使⽤inotify对⽂件进⾏监控,如果发现⽂件系统的的打开,读写,可能程序在被破解,就可以执⾏kill进程操作C. 通过遍历程序内存段是否存在断点指令,来判断程序是否正在被调试,是则kill进程D. 程序处于被调试状态时,某些关键指令的执⾏速度变化不⼤,所以通过对⽐关键代码执⾏的前后时间差,不能够判断出进程是否被调试11. 以下关于frida的使⽤哪项不正确?A. java层的hook必须在m中执⾏B. java层同名函数的hook,可以通过不同参数数量来区分,⽽不⽤写overloadC. frida以spawn⽅式启动app可以hook app在启动时就执⾏的函数D. frida可以更改某个native函数的实现12. 下⾯通过IDA反汇编的arm指令,其中描述不正确的是?.text:0000ED72 MOVS R0, :0000ED74 POP {R0}.text:0000ED76 CMP R1, #:0000ED78 BNE loc_:0000ED7A PUSH {R0,R1,LR}.text:0000ED7C BL sub_:0000ED80 MOVS R6, :0000ED82 MOVS R0, R0A. BL是带返回的跳转指令B. 0xED7C位置进⾏的跳转后LR寄存器的值为0xED81C. sub_B2544是程序员定义的函数名,此处将调⽤sub_B2544函数D. 0xED78位置的指令含义是如果R1 != 0则进⾏跳转13. 做爬⾍难,还是做反爬难?发表下您的看法,并简单阐述下原因(100字以内,开放式题⽬,没有对错,可⾃由发挥)。1)下⾯哪种⽅式可以让爬⾍合理、合法地抓取当⽇尽可能多的数据?A. 通过漏洞进⼊他⼈计算机系统,把数据库dump出来。B. ⽤⼤量低频关键词在⽬标站点上搜索,获得当⽇更全数据。C. 找到热门的hub页,热门的话题,热门的账号,获取当⽇更全数据。D. ⽤热门关键词在百度等搜索引擎上,⽤site: + 关键词 查询,从⽽发现新数据2)以下所列出的⽅法中,浏览器web数据抓取效率最⾼的⽅法是?A. selenium + phantomjsB. 使⽤chrome或者chrome内核抓取C. 模拟web协议直接⽤wget或curl抓取3)下⾯哪项是⼿机端抓取app数据相⽐web端的优势(多选):A. ⼿机端协议简单容易分析B. ⼿机端可以使⽤模拟点击C. ⼿机端就算出新版了旧版还是可以继续使⽤,不会⽴即停掉D. 通常来说,⼿机端抓取同样信息量的数据,下载量更低4)下⾯哪些代理⽀持rawsocket连接(多选)?A. HTTP代理B. HTTPS代理C. SOCKS4代理D. SOCKS5代理5)下⾯代码请求实际访问地址url是什么?
url = "/test"params = {"xxxx":"1234"}headers = {"Host": "","Accept-Encoding": "gzip,deflate","Connection": "Keep-Alive"}(url, params, headers =headers, allow_redirects = False, verify = False)6)假如你要爬⼤量youtube视频的⼆进制内容,存储在本地,最佳的办法是?A. Mysql数据库存储B. Redis存储C. Mongodb存储D. ⽂件系统7)如果想爬⾃⼰⼿机应⽤上的HTTPS的数据,获得明⽂,下⾯哪个说法是正确的?A. ⾃⼰搭建⼀个HTTPS代理,让⼿机设置为这个代理,即可获得明⽂B. 任何HTTPS明⽂都是可以获取的C. 在PC上建⽴⼀个⽆线热点,让⼿机连这个热点,并使⽤Wireshare软件分析出HTTPS的明⽂数据D. 通过让⼿机系统信任根证书,使⽤Man-in-the-middle中间⼈攻击技术,就可以获取任何HTTPS明⽂8)以下哪个功能chromedriver协议不⽀持?A. 注⼊js⽂件B. 模拟⿏标滑动C. ⽹络请求的响应式处理D. 同个实例可以同时操作多个页⾯9)爬取数据过程中,哪个情况是最不可容忍的?A. 爬取的数据不完整,有部分数据遗失B. 爬取程序⾮法关闭,内存泄露C. 爬取的数据部分出错,⼿动修改D. 不同版本的数据合并在⼀起10)爬⾍开发不会涉及到的技术或者知识有?A. tcp,udp传输协议B. 反汇编技术C. 数据库存储D. ⾳视频流解析E. ⽹络路由协议F. 以上都会涉及1)如何获得⼤量IP资源(业界主流⽅法)2)如何获得账号资源,如何进⾏⼤量账号登陆3)抓取系统如何构建,如何可扩展4)如何探测封杀阈值5)如何将爬⾍模拟成正常⽤户6)每个模块使⽤到的最佳⼯具7)其他系统杂项trick,如何流量均衡等等1)爬⾍为什么要做DNS缓存?A:可以节约抓取带宽B:节约域名解析时间C: 减少下载数据⼤⼩D:防⽌多次DNS请求被抓取⽬标⽹站封杀2)Etag⼲什么⽤的?A:防⽌重复图⽚downloadB:节约http header的⼤⼩C:提⽰web服务可以接受压缩数据D:提⽰⽹页内容的标签信息3)Transfer-Encoding为chunked时,会出现什么情况A:通常没有Content-Type域B:通常没有Content-Length域C:⽹页数据不可能同时即是压缩数据⼜是chunked数据D:数据结尾标记是:⼀个数值(表⽰总长度)rnrn4)tcp最⼩数据载荷是多少字节(抛出协议头部)? the minimum "data" size of a TCP segment should be?A:6字节B:20字节C:24字节D:不确定5)当最后⼀个包⽐最⼩数据载荷还⼩时,TCP/IP协议如何处理是否结束?A:在最后⼀个包的末尾填充特殊字符以表⽰数据结束B:最开始协商的数据⼤⼩和已经接受的数据⼀致即可判断结束C:再发⼀个最⼩数据载荷⼤⼩的空包已表⽰数据结束D:和具体协议实现有关,并不完全确定6)下⾯那⼀项是爬⾍⼯程师不需要的A:⼈⼯智能B:系统架构C:⽹络相关D:HTTP协议E:浏览器F:数据存储G:待遇持续保持在⽐较低的⽔平
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687981941a63446.html
评论列表(0条)