VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • python高级—— 从趟过的坑中聊聊爬虫、反爬、反反爬,附送一套高级爬虫试题(2)

  

 

 

18.js加密cookie

这个大概的原理就是,访问该网站的时候会访问两次,第一次服务端返回响应头里给了一段加密的js代码,前端(浏览器)自动调用js然后反解出cookie,然后第二次访问的时候带上cookie去访问,才会返回一个正常的值,这个我在写IPproxy项目的时候遇到的66ip(http://www.66ip.cn/)网站就是这样的,而且很多同类的网站都是类似的操作。解决方法就是打开浏览器的调试工具,然后打断点测试,看看流程,基本都会有一系列的操作然后赋值给一个变量,找到这个变量名被如果的替换就行了,主要的破解难点就在js的部分,有的是做了js混淆加密的,有的是做了自定义处理的,这个就只有多尝试了

 

说到这,如果是上面的监听debug工具的+js加密的话,那可就真的难操作了,你一打开调试工具想打断点分析,结果就立马卡死了。哈哈哈,好像我还没有遇到网站这么干的

相关的js加密cookie破解教程,可以移步这里:https://www.cnblogs.com/zdfbk/p/8806282.html

 

19.urllib库之编码

有的时候如果要传递参数到服务端的话,那么就得做url编码,使用url编码解码就可以用urllIb.parse.quote和urlib.parse.unquote,使用quote方法作编码的话,默认使用的是utf-8的编码,但有时候一些网站用的gbk,所以这是一个坑,你得用quote(kw,encoding='gbk')才能转为gbk的编码,不熟悉这个的话就很难发现这个,因为我们一般就直接用quote就行了,根本不在意是用了什么编码

 

  

20.request.post之痛

嘿嘿,又是requests库的问题,准确说其实不是requests的问题,而是跟上面的quote一样,我们平常遇到的网站基本都是不会出现这个情况,当出现的时候我们就傻眼了,requests库的粉丝们,放下你们手上的菜刀,我是友军啊,我也一直在用requests,只是发现了这一两个情况而已

 

不多说了,requests做post请求时,提交的data字段会默认将data字段作url编码,且默认用的utf-8编码,对的,又是编码的锅,而有的网站用的并不是utf-8编码的,假如某网站用的是gbk编码,如果我们还是默认的操作的话,就会出错,解决办法就是,手动编码:

 

 

 

21.xpath解析tbody

解析网页结构的工具很多,比如一大杀气正则表达式,然后就是xpath,再然后就是bs4,最近我痴迷于xpath,我觉得写起来异常的顺畅,非常有感觉,但是在其中还是遇到了问题如下,无法解析带有tbody标签,这个是我最近发现的,不知道是不是版本问题,只要网页的DOM结构用tbody,比如table标签下有tbody/tr/td时,我要取td下的数据,按理就是写的response.xpath('//table/tbody/tr/td/text()'),但是这样写就是TMD的拿不到,得去掉tbody,写成这样就可以拿到:response.xpath('//table/tr/td/text()'),总之就是不能带tbody,如果有就直接跳到下一级就行,我估计是这个tbody被错误的解析成body标签了

 

22.xpath元素选取

一般情况下,我们获取某个数据的话,直接就根据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 (就在我的github里,我不说是哪个,嘿嘿,皮一把)

 

网易系的就不多说了,坊间传闻的,网易的滑动验证码本来就是抄袭极验的(不是我说的),所以破解方法差不多,感兴趣的可以根据我的代码自行修改

 

25.ip代理

终于说到这个问题了,稍微接触过爬虫的人都知道,你知道访问频率太频繁你电脑的公网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. 支持http2

D. 支持socks代理

 

 

2. 一般来说, python的requests.get函数会对传入的url进行urlencode操作. 但当如下代码中的keyword为哪个选项时, 无法得到预期的结果:

代码:requests.get('https://baike.baidu.com/item/{}'.format(keyword))

A. '梁斌'

B. 'C# 入门经典'

C. 'r&b'

D. '川上とも子'

 

 

3. 如果进行大规模并发抓取(比如1000并发+,单核单进程),下面哪个python的库的效率最好的:

A. urllib

B. requests

C. http.client

D. aiohttp

 

 

4. 使用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-MD5

B. MD5

C. MD4

D. SHA1

 

 

7. 现在很多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中的XposedBridge.jar会出现在任意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. console.log( Pet._kind );

B. console.log( Pet.kind );

C. console.log( Pet._kind.value );

D. console.log( Pet.kind.value );

 

 

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必须在java.perform中执行

B. java层同名函数的hook,可以通过不同参数数量来区分,而不用写overload

C. frida以spawn方式启动app可以hook app在启动时就执行的函数

D. frida可以更改某个native函数的实现

 

 

12. 下面通过IDA反汇编的arm指令,其中描述不正确的是?

.text:0000ED72  MOVS            R0, R0

.text:0000ED74  POP             {R0}

.text:0000ED76  CMP             R1, #0

.text:0000ED78  BNE             loc_ED84

.text:0000ED7A  PUSH            {R0,R1,LR}

.text:0000ED7C  BL              sub_B2544

.text:0000ED80  MOVS            R6, R1

.text:0000ED82  MOVS            R0, R0

 

A. BL是带返回的跳转指令

B. 0xED7C位置进行的跳转后LR寄存器的值为0xED81

C. sub_B2544是程序员定义的函数名,此处将调用sub_B2544函数

D. 0xED78位置的指令含义是如果R1 != 0则进行跳转

 

13. 做爬虫难,还是做反爬难?

发表下您的看法,并简单阐述下原因(100字以内,开放式题目,没有对错,可自由发挥)。

 

 

 

 

 

1)下面哪种方式可以让爬虫合理、合法地抓取当日尽可能多的数据?

A. 通过漏洞进入他人计算机系统,把数据库dump出来。

B. 用大量低频关键词在目标站点上搜索,获得当日更全数据。

C. 找到热门的hub页,热门的话题,热门的账号,获取当日更全数据。

D. 用热门关键词在百度等搜索引擎上,用site:www.website.com + 关键词 查询,从而发现新数据

 

2)以下所列出的方法中,浏览器web数据抓取效率最高的方法是?

A. selenium + phantomjs

B. 使用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 = "https://test.cn/test"

 

params = {

   "xxxx":"1234"

}

 

headers = {

   "Host": "www.test.cn",

   "Accept-Encoding": "gzip,deflate",

   "Connection": "Keep-Alive"

}

 

requests.get(url, params, headers =headers, allow_redirects = False, verify = False)

 

假设http://test.cn/test?xxxx=1234返回的状态码302且response header里有Location:http://www.test.cn/dpool/ttt/domain.php?d=test&xxxx=1234

 

A. https://test.cn/test

B. https://test.cn/test?xxxx=1234

C. https://www.test.cn/test?xxxx=1234

D.http://www.test.cn/dpool/ttt/domain.php?d=test&xxxx=1234

 

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:防止重复图片download

B:节约http header的大小

C:提示web服务可以接受压缩数据

D:提示网页内容的标签信息

 

3)Transfer-Encoding为chunked时,会出现什么情况

A:通常没有Content-Type域

B:通常没有Content-Length域

C:网页数据不可能同时即是压缩数据又是chunked数据

D:数据结尾标记是:一个数值(表示总长度)\r\n\r\n

 

4)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:待遇持续保持在比较低的水平


相关教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号