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

可能是目前最全的反爬虫及解决方案

时间:2023-03-15 20:23:59 科技观察

爬虫是Python常见的应用场景,很多实践项目都是针对大家爬取某个网站的。在抓取网页的时候,多半会遇到一些反抓取措施。你如何处理这种情况?本文整理了常见的防爬措施和解决方法。通过User-Agent控制访问无论是浏览器还是爬虫程序,在向服务器发起网络请求时,都会发送一个头文件:headers,比如知乎的requestsheaders,里面大部分字段都是浏览器的爬虫程序,最需要关注的字段是:User-Agent很多网站都会建立user-agent白名单,只有属于正常范围的user-agent才能正常访问。爬虫方法:你可以自己设置user-agent,或者更好的是,你可以从一系列符合条件的user-agents中随机选择一个。缺点:容易伪造表头。github上有人分享了开源库fake-useragent。实现难点:IP限制如果一个固定的IP在短时间内快速大量访问一个网站,后台管理员可以写IP限制。让IP继续访问。爬虫方法:比较成熟的方法是:IP代理池简单来说就是通过ip代理从不同的ip访问,这样ip就不会被屏蔽了。但是获取ipproxy本身就是一件很麻烦的事情。网上有免费的也有收费的,但是质量参差不齐。如果企业有需要,可以自行购买集群云服务搭建代理池。缺点:免费/付费代理可用于绕过检测。实现难点:★SESSION访问限制后台统计登录用户操作,如短时点击事件,请求数据事件,与正常值比较,区分用户是否处理异常状态,如果所以,限制登录用户的操作权限。缺点:需要增加数据埋点功能,阈值设置不好,容易造成误操作。爬虫方法:注册多个账号,模拟正常运行。实现难度:★★★SpiderTrap使网络爬虫陷入无限循环,浪费蜘蛛的资源,降低其生产力,在爬虫编写得不好的情况下,可能导致程序崩溃。礼貌的蜘蛛在不同的主机之间交替请求,不会每隔几秒多次向同一服务器请求文档,这意味着“礼貌”的爬虫比“不礼貌”的爬虫受到的影响要小得多。反爬虫方法:1、创建无限深的目录结构HTTP://example.com/bar/foo/bar/foo/bar/foo/bar/1、动态页面,为网络爬虫生成无限数量的文档。比如算法生成的乱七八糟的文章页面。2.文档中充满了太多的字符,导致解析文档的词法分析器崩溃。此外,带有蜘蛛陷阱的站点通常有robots.txt告诉机器人不要进入陷阱,因此合法的“礼貌”机器人不会落入陷阱,而忽略robots.txt设置的“不礼貌”机器人将受到影响陷阱。爬虫方法:根据引用的css文件对网页进行集群,通过控制一个类中最多可以收录的网页数,防止爬虫进入陷阱后出不来。不包含css的网页将受到惩罚,以限制它可以生成的链接数量。从理论上讲,这种方法并不能保证爬虫不会陷入死循环,但实际上这种解决方案非常有效,因为大多数网页都使用css,尤其是动态网页。缺点:反爬方法1和2会添加很多无用的目录或文件,造成资源浪费,对正常的SEO也很不友好,可能会被惩罚。实现难度:★★★验证码(CAPTCHA)是“CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart”(完全自动区分计算机和人类的图灵测试)的缩写,是一种区分方法用户和计算机之间。还是人民群众的全自动程序。可防止:恶意破解密码、刷票、泛滥论坛,有效防止黑客以特定程序暴力破解方式对特定注册用户进行连续登录尝试。其实使用验证码是现在很多网站常用的方式。我们使用一种比较简单的方式来实现这个功能。这个问题可以由计算机生成和判断,但只有人才能回答。由于计算机无法回答CAPTCHA问题,因此回答问题的用户可以被视为人类。1.图像验证码复杂的编码平台需要人工帮助人们识别验证码。识别完成后,返回结果。整个过程不到几秒钟。这样的编码平台还具有记忆功能。图片被识别为“铲子”后,下次再次出现该图片时,系统会直接判断为“铲子”。时间一长,图片验证码服务器里的图片就被标记出来了,机器可以自动识别。以上两种简单类型无需处理,直接用OCR识别技术(使用python第三方库-tesserocr)识别即可。背景模糊但清晰可见。经过灰度化和二值化后,验证码的背景由模糊的验证码变为清晰可见的验证码。容易混淆的图片验证码。对于这种验证码,语言一般自带图形库,加个麻花就变成了这个样子。我们可以使用90,000张图片进行训练,达到类人的准确率,实现识别验证。代码的效果2、短信验证码利用Webbrowser技术模拟用户打开短信的行为,最终得到短信验证码。3.计算题目的图片验证码。所有可能的汉字都被手动取出并保存为黑白图片。验证码根据字体颜色进行二值化去除噪声,然后将所有图片相互比较,计算相似度。值,找到最相似的图片4.滑动验证码对于滑动验证码,我们可以以图片的像素点为线索,判断基本属性值,检查位置之间的差异。如果差异超过了基本属性值,我们就可以判断图像的大致位置。5.每次拖动图案验证码顺序不同,结果不同。我们如何识别它?用机器学习学习所有的拖动序列,用10000张图片进行训练,完成一个类人操作,最后识别出来。利用selenium技术模拟人的拖动顺序,穷尽所有拖动方式,从而达到其他效果。6、我们来分析一下倒排文字的验证码:多年庞大的文字库,加上文字的不同字体,文字失真和噪音,难度更大。方法:先点击前两个倒置的字符,确定7个字符的坐标。确定了验证码中7个汉字的位置。你只需要事先确认好每个字符的坐标并放入列表中,然后手动确定倒排文字的文字序号,输入列表中序号对应的坐标即可登录成功。爬虫方式:接入第三方验证码平台实时破解网站验证码。缺点:影响正常的用户体验操作,验证码越复杂,网站体验越差。实现难点:★★通过robots.txt限制爬虫robots.txt(统一小写)是存放在网站根目录下的ASCII编码的文本文件,通常告诉网络搜索引擎的机器人(又称网络蜘蛛)),本网站哪些内容不应该被搜索引擎机器人获取,哪些内容可以被搜索引擎机器人获取。由于某些系统的URL是区分大小写的,所以robots.txt的文件名应该统一小写。robots.txt应该放在网站的根目录下。如果你想单独定义搜索引擎机器人在访问子目录时的行为,你可以将你的自定义设置合并到根目录下的robots.txt中,或者使用机器人元数据(Metadata,也称为元数据)。robots.txt协议不是规范,只是约定,因此不能保证网站的隐私。注意robots.txt是通过字符串比较来判断是否获取到URL的,所以会出现目录末尾有无斜杠“/”的不同URL。robots.txt允许通配符,例如“Disallow:*.gif”。itunes的robots.txt缺点:君子协定而已。它适用于搜索引擎等优秀的爬虫,但不适用于有目的的爬虫。爬虫方法:如果使用scrapy框架,只需将settings文件中ROBOTSTXT_OBEY的值设置为False实现难度:★动态数据加载Python的requests库只能爬取静态页面,不能爬取动态加载的页面。使用JS加载数据可以提高爬虫门槛。爬虫方法:抓包获取数据url通过抓包获取数据的请求url,然后通过解析修改url参数来爬取数据。示例:1、查看https://image.baidu.com中的包。可以看到,在这部分包中,search下的url和我们访问的地址完全一样,但是它的response中包含js代码。2.当你在动物图片首页向下滑动想要看更多的时候,会出现更多的包裹。从图中可以看出,页面下滑后得到的是一系列的json数据。在数据中,您可以看到thumbURL等字样。它的值是一个url。这是图片的链接。3.打开浏览器页面,访问thumbURL="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1968180540,4118301545&fm=27&gp=0.jpg",在搜索结果中找到图片。4、根据前面的分析我们可以知道请求URL="https://image.baidu.com/search/acjsontn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%8A%A8%E7%89%A9%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf8&oe=utf8&adpicid=&st=-1&z=&ic=0&word=%E5%8A%A8%E7%89%A9%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=30&rn=30&gsm=1e&1531038037275=",用浏览器访问这个链接,确保它是公开的。5、最后可以找到url的规则,构造url就可以得到所有的照片。使用selenium通过selenium模拟用户对浏览器的操作,然后结合BeautifulSoup等包解析网页。通过这种方式获取数据简单直观,缺点是速度比较慢。缺点:如果数据API不加密,容易暴露接口,让爬虫用户更容易获取数据。实现难点:★数据加密——使用加密算法前端加密通过对查询参数、user-agent、验证码、cookie等前端数据进行加密,生成一系列加密指令,然后通过加密指令请求服务端数据为参数。如果加密参数为空或错误,服务器将不会响应请求。服务器端加密在服务器端也有一段加密逻辑,生成一串代码,并与请求的代码进行匹配。如果匹配通过,则返回数据。爬虫方法:JS加密破解方法是找到JS的加密代码,然后使用第三方库js2py在Python中运行JS代码,获取对应的代码。案例参考:https://blog.csdn.net/lsh19950928/article/details/81585881缺点:加密算法是用JS明文写的,爬虫用户还是可以解析的。实现难度:★★★数据加密——使用字体文件映射服务端先将客户端查询到的数据根据??字体映射文件进行转换后传回前端,前端根据字体文件。映射的方式可以是数字随机显示,这样爬虫可以爬取数据,但是数据是错误的。破解方法:其实如果能看懂JS代码,这种方法还是很容易破解的,所以需要做以下操作来增加破解难度。使用多个不同的字体文件进行JS加密,然后约定使用指定的字体文件方式,比如时间戳取模,这样每次爬取的数据映射方式不同,映射结果不同,大大提高了破解。困难。这种方法比使用加密算法更难,因为加密算法是固定的,对方很容易获取并破解,字体文件映射可以按照任意规则进行映射。正常的数据让它显示错误,爬虫也不容易。意识到的。参考案例:https://www.jianshu.com/p/f79d8e674768缺点:需要生成字体文件,增加网站资源加载量。实现难度:★★★★非可见区域遮挡该方法主要针对使用senlium的爬虫。如果模拟界面没有进入可见区域,会遮挡看不见的数据,防止senlium的click()操作。这种方式只能稍微降低爬虫的爬取速度,并不能阻止数据的继续爬取。实现难度:★