当前位置: 首页 > 科技观察

这些常见的反爬虫方法,你能攻破几个?

时间:2023-03-21 17:44:08 科技观察

在爬取对方网站和APP应用的相关数据时,经常会遇到一系列的方法来防止爬虫。网站APP之所以这样做,一是为了保证服务质量,减轻服务器负载,二是为了保护数据不被获取。爬虫与反爬虫的斗争由来已久。这里总结一下我们在爬取数据时常用的反爬虫方法。1.User-Agent在网络请求中,User-Agent是一种表明身份的方式。该网站可以使用User-Agent来确定用户正在使用什么浏览器访问。不同浏览器的User-Agent是不同的。比如我们的Chrome浏览器在Windows上的User-Agent是:但是如果我们使用Python的Requests直接访问网站,除了URL不提供其他信息,那么网站ReceivedUser-Agent是空的。这时候网站就知道我们不是用浏览器访问的,所以可以拒绝我们的访问。fromfake_useragentimportUserAgentforiinrange(1,11):ua=UserAgent().randomprint(f'第{i}次的ua是',ua)'''第一次的ua是Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/29.0.1547.62Safari/537.36第二个ua是Mozilla/5.0(WindowsNT6.1;rv:21.0)Gecko/20130401Firefox/21.0第三个ua是Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_6;es-es)A??ppleWebKit/533.20.25(KHTML,likeGecko)Version/5.0.4Safari/533.20.274thuaisMozilla/5.0(X11;CrOSi6864319.74.0)AppleWebKit/537.36(KHTML,likeGecko)Chrome/29.0.1547.57Safari/537.365thuaisMozilla/5.0(Macintosh;U;IntelMacOSX10_6_6;fr-ch)AppleWebKit/533.19.4(KHTML,likeGecko)Version/5.0.3Safari/533.19.46thuaisMozilla/5.0(X11;OpenBSDi386)AppleWebKit/537.36(KHTML,likeGecko)Chrome/36.0.1985.125Safari/537.36的7thuaisMozilla/5.0(X11;NetBSD)AppleWebKit/537.36(KHTML,likeGecko)Chrome/27.0.1453.116Safari/537.36的第8个ua是Mozilla/5.0(X11;Linuxi586;rv:31.0)Gecko/20100101Firefox/31.09thua是Mozilla/4.0(兼容;MSIE8.0;WindowsNT6.1;WOW64;Trident/4.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;Zune3.0)10thua是Mozilla/5.0(WindowsNT5.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.16Safari/537.36'''2.RefererHTTPReferer是header的一部分。浏览器向web服务器发送请求时,一般会带上一个Referer,表示该网页是从哪里跳过的。这是一种防止网页盗链的方法,有时用于反爬虫,如果网站会检查Referer,请确保您的Referer始终正确(跳转到该网页之前的网页URL)。3.ajax应该算不算反爬吧?当网站使用ajax异步获取数据时,我们无法直接从网页源代码中获取想要的数据。这时候我们就需要使用Network工具栏来解析API请求,然后使用Python模拟调用API直接从API中获取数据。.(大部分是POST类型的请求,少部分是GET请求)当然也可以使用Selenium等自动化测试工具直接渲染网页,然后从渲染后的网页源码中解析数据。4.Cookie在网站中,http请求通常是无状态的(第一次连接服务器登录后,服务器知道此时是哪个用户,但是第二次请求服务器时,服务器仍然不知道knowthecurrentrequest.whichuser),cookie就是为了解决这个问题。首次登录服务器后,服务器会将刚才与用户相关的数据(即cookie)返回给浏览器,浏览器会将cookie保存在本地。当用户第二次请求服务器时,会把上次保存的数据自动携带到服务器,服务器通过这个cookie知道当前是哪个用户。在一些爬虫中,我们需要先登录才能进入一个页面,比如人人网。如果我们要浏览人人网的首页,必须先注册登录后才能浏览,所以在爬取的时候,需要保持登录状态。需要在请求头中添加cookies。Cookies是指网站为了识别用户身份和进行会话跟踪而存储在本地终端上的数据。Cookie通常以文本形式存储在计算机上的文件中。Cookie实际上是由键值对组成的,如下图所示:5.验证码验证码有很多种。说说常见的三种:字母验证码、拼图验证码、点击验证码。字母验证码就是给你一张图片,里面有几个字母或者数字,让你识别里面的内容,然后在文本框中输入。比如这个:这是最简单的验证码,可以通过写一个深度学习模型训练或者直接使用打码平台来解决。给出拼图验证码、图片和滑动组件。拖动滑动组件时,画面会出现空隙,拖动滑动组件,填补空隙,过关卡。比例类似这样:比较常见的方法是通过图片之间的比对,计算出拼图中缝隙的位置,然后用特定的轨迹拖动滑块完成验证。你提交验证有两种方式,一种是使用Selenium调用浏览器,另一种是直接破解JS,使用POST模拟提交。点击验证码会给出一个小图片(有的是图片,有的不是,不同的验证码平台不同),依次显示几个汉字。再给一张大图,上面有这些汉字,不过汉字的分布是随机的。您需要按照汉字在小图片中出现的先后顺序点击大图片中的汉字。与此类似:最常见的方法是借助编码平台计算出相对坐标,然后使用Selenium等自动化工具依次点击。当然,自己训练模型也是可行的,只是比较麻烦。验证码可以使用OCR图片识别。Github上有很多大神分享的代码可以使用,大家可以去看看。简单OCR识别验证码:fromPILimportImageimporttesserocr#tesserocr2种识别图片的方法img=Image.open("code.jpg")verify_code1=tesserocr.image_to_text(img)#print(verify_code1)verify_code2=tesserocr.file_to_text("代码.jpg")6.代理IP池如果您频繁使用同一个IP访问某个网站,可能会被该网站认为是恶意攻击,您的IP将被封禁。这时候使用代理IP池就是一个很好的解决方案。在一些网站服务中,除了检测user-agent的身份信息。客户端的ip地址也有限制。如果同一个客户端访问web服务器的次数过多,就会被识别为爬虫。因此,限制对其客户端ip的访问。这样的限制给我们的爬虫带来了麻烦,所以在爬虫中使用代理ip是非常有必要的。这里我给大家提供两个网站供大家参考。66代理:http://www.66ip.cn/6.html极速代理:https://www.kuaidadaili.com/free/7.RequestInterval两次请求之间,最好设置一定的间隔。原因如下:请求过于频繁,远远超出人工频率,容易被识别。请不要给对方服务器太大的压力,间隔时间不要固定。在一定范围内波动是比较合适的选择。过于机械的间隔也可能让网站认为你是爬虫。importtimeimportrandomforiinrange(1,11):time=random.random()*5print(f'Sleepforthe{i}thtime:',time,'s')'''第一次睡觉:0.6327309035891232s第2次睡了:0.037961811128097045s第3次睡了:0.7443093721610153s第4次睡了:0.564336149517787s第5次睡了:0.39922345839757245s第6次睡了:0.13724989845026703s第7次睡了:0.7877693301824763s第8次睡眠:0.5641490602064826s第9次睡眠:0.05517343036931721s第10次睡眠:0.3992618299505627s'''8.还有一种字体反爬的特例,你在浏览器页面上看到过,但是你看源码的时候,根本找不到相关数据或者数据和你看到的不一致。你怀疑这个数据是通过接口异步加载的,但是你查看请求,过程中并没有异步请求数据的接口。发生了什么?您可能遇到过字体爬行。即目标网站已经通过CSS样式、字体映射等方式完成了对特定数据的隐藏,你无法直接从源代码中提取相关数据,但不会影响网页的显示效果。那么,如何解决呢?有两种方法。第一个是破解字体映射关系,从源代码中提取错误的数据,通过特定的映射关系将其翻译成正确的数据。第二种是偷懒法,使用Selenium等自动化测试工具渲染页面,截取数据内容图片,通过OCR程序识别图片内容。9、页面分析最强大的正则表达式当然是正则表达式了。这个对于不同网站的不同用户来说是不一样的,就不用过多解释了。附上两个比较好的网站:正则表达式入门:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html正则表达式在线测试:http://tool.oschina.net/regex/其次是解析库,常用的有两个lxml和BeautifulSoup,介绍两个使用这两个比较好的网站:lxml:http://my.oschina.net/jhao104/blog/639448BeautifulSoup:http://cuiqingcai.com/1319.htmlfor这两个库,我的评价是,都是HTML/XML处理库。Beautifulsoup是用纯python实现的,效率低但功能强大。例如,您可以使用搜索结果来获取HTML节点的源代码;高效并支持XPath。10.pprint这个在pycharm里勾选,看效果。print()打印出来,不知道你是什么感觉,一头雾水。importrequestsurl='https://www.douyu.com/gapi/rknc/directory/yzRec/1'resp=requests.get(url).json()print(resp)pprint()打印,这个结构看起来怎么样?frompprintimportpprintimportrequestsurl='https://www.douyu.com/gapi/rknc/directory/yzRec/1'resp=requests.get(url).json()pprint(resp)现在除了使用pprint,冰淇淋icecream也是不错的选择