版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章反爬策略与反反爬技巧学习目标知识目标(1)掌握反爬虫与反反爬虫的基本概念以及其发展脉络与历程。(2)了解不同类别反爬虫技术及其相应的应用场景与领域。(3)熟悉常见反爬虫工具与框架的操作使用方法。(4)理解反反爬虫技术原理及其应对策略与机制学习目标能力目标(1)能够识别与深入分析各类不同的反爬虫技术手段,并据此制定出有效的反反爬策略与举措。(2)可在实际实践场景中熟练应用反反爬虫技术,有效解决各类反爬虫措施的限制与干扰。(3)具备独立完成典型的反爬与反反爬攻防案例综合分析的专业能力。(4)能够通过综合案例及拓展案例的深入实践,有效提升实践动手操作能力,积累丰富的项目实践经验与技术储备。素质目标(1)培育针对反爬与反反爬技术的批判性思维模式以及良好的道德规范意识。(2)提高在复杂技术应用环境中解决实际问题的综合能力与素养。(3)增强对技术发展演进趋势的洞察能力以及对行业相关法律法规的感知与遵循意识。(4)培养团队协作精神与高效沟通能力,使其能够在数据采集项目实施过程中与团队成员紧密协同合作,共同达成数据采集需求目标并有效攻克各类技术挑战。思维导图章节内容行业PPT模板/hangye/7.27.37.4反爬虫技术反反爬虫技术拓展案例—采集招聘网岗位信息7.1反爬虫与反反爬虫的定义PATR01反爬虫与反反爬虫的定义反爬虫与反反爬虫反爬虫Anti-WebScraping反反爬虫Anti-Anti-Scraping爬虫技术逐渐成为一种常见的数据获取手段。然而,这种技术的广泛应用也带来了许多问题和风险,促使网站和平台采取反爬虫措施。随着反爬虫技术的广泛应用,数据获取变得越来越困难。这种对抗性的环境催生了反反爬技术的发展,其目的是绕过反爬虫措施,继续有效地进行数据抓取。反爬虫简介7.1.1反爬虫是指网站或系统通过一系列技术手段,阻止或限制爬虫程序(即自动化的网络数据抓取工具)访问获取其数据的行为。反爬虫技术的核心目标是区分人类用户与自动化程序,从而对自动化程序进行限制或阻止。01020304数据保护反爬虫技术的首要目的是保护网站上的敏感数据或专有数据,防止被未经授权的爬虫程序大规模抓取。通过反爬虫措施,网站可以控制哪些用户或程序能够访问特定的数据,确保数据的机密性和安全性。商业利益保护在竞争激烈的市场环境中,网站的数据(如价格、库存、用户评论等)可能成为竞争对手的重要情报通过反爬虫技术,网站可以防止竞争对手通过爬虫技术获取这些关键信息,从而保护自身的商业利益资源保护爬虫程序通常会频繁访问网站,消耗大量的服务器资源反爬虫技术通过限制这些请求的频率和数量,保护服务器资源,避免因为大量爬虫访问而导致网站性能下降或服务中断,保证正常用户的访问体验。防止滥用和恶意行为恶意爬虫可能被用于执行攻击性行为,如DDoS攻击、数据窃取或内容盗用。反爬虫技术通过检测并阻止这些恶意爬虫,确保网站免受潜在威胁的影响,维护网络安全。通过限制数据的自动化抓取,网站能够更好地控制数据的流向,避免因数据泄露或滥用而引发的法律风险目的反爬虫主要应用场景7.1.1电子商务网站电子商务平台上的商品价格、库存信息以及用户评价等数据对其业务至关重要。反爬虫技术防止竞争对手或其他未经授权的爬虫程序获取这些敏感数据,从而避免价格战或市场信息的不当泄露。防止恶意爬虫过度访问也有助于维持网站的正常运行,确保真实用户的购物体验不受影响。社交媒体平台社交媒体平台上的用户生成内容,如帖子、评论、图片和个人资料等,都是高度敏感的数据。反爬虫技术用于防止第三方公司或个人爬取这些数据,避免隐私泄露、内容盗用以及用户数据被用于不当用途。通过限制爬虫行为,社交平台能够更好地管理服务器资源,确保服务的稳定性。新闻与内容网站新闻网站和内容聚合平台通常会对其原创内容进行保护,防止其他网站未经授权地复制和分发这些内容。反爬虫技术通过检测并阻止自动化抓取行为,保护原创内容的版权和商业利益。防止爬虫大量抓取内容也有助于维护网站的流量和广告收益。金融与投资平台金融数据,包括股票价格、交易记录、市场分析报告等,通常是金融和投资平台的核心资产。反爬虫技术保护其数据免受未经授权的爬取,从而防止潜在的市场操纵或信息不当使用。平台也依赖反爬虫来确保数据的准确性和实时性,避免因爬虫过载导致的数据延迟或错误。教育与学术资源库在线教育平台和学术资源库通常包含大量的教材、研究论文、课程视频等重要内容。反爬虫技术被用于防止这些资源被大规模爬取和非法传播,从而保护知识产权和学术成果。反爬虫技术还可以帮助管理网站流量,确保用户在访问高峰期也能顺畅获取所需的学习资源。政府和公共服务网站政府门户网站和公共服务平台提供的公共数据和服务信息具有高度的公共性和敏感性。反爬虫技术用于防止未经授权的访问,确保数据的安全性和准确性限制自动化爬取行为,防止因恶意爬虫导致的服务中断或信息泄露招聘和求职平台招聘网站和求职平台上存储着大量的职位信息和求职者数据反爬虫技术保护其数据库免受大规模的爬取,防止数据被滥用或被竞争对手挪用防止恶意爬虫访问,保持平台的正常运营,确保招聘方和求职者能够顺利进行职位发布和求职操作。反反爬虫简介7.1.2反反爬虫是指爬虫程序为了绕过网站的反爬虫措施,继续执行数据抓取任务而采取的技术策略。01020304数据获取需求反反爬虫的首要动机是数据获取需求的不断增长。在大数据时代,企业和研究机构对于数据的依赖性显著增强。通过反反爬虫技术可以绕过反爬虫措施获取的数据,支持市场分析、产品优化以及学术研究等多种用途。提升数据抓取效率面对复杂的反爬虫机制,传统的爬虫技术往往无法高效获取数据。反反爬虫技术通过各种优化手段,提升了数据抓取的效率和成功率,以满足高需求的业务应用。技术挑战反反爬虫是一种技术挑战,部分开发者将破解反爬虫机制视为一种成就感的来源。这种动机推动了反反爬技术的不断创新,使其能够应对日益复杂的反爬虫策略商业竞争恶获取竞争对手的关键信息如市场数据、产品动向等,可能会为企业带来显著的竞争优势。反反爬虫技术成为一些公司在商业竞争中获取优势的重要手段。动机及应用技术对抗的动态过程随着技术的不断进步,反爬虫措施在不断演变,增加了多层次、复杂的防护策略,以应对开发者使用的新型爬虫技术,形成动态稳定的技术对抗。反爬虫措施的演进面对不断强化的反爬虫策略,反反爬虫技术也需不断创新,开发新的绕过手段甚至工具,确保对数据资源的有效获取,推动数据采集现代化。反反爬虫技术的创新法律与道德问题在技术创新的同时,需重视法律法规在数据采集中的应用,确保行事合规,以维护合法权益。合规性不仅关乎法律责任,也是公司声誉的重要组成部分。鼓励对抗技术的开发与应用应建立在道德基础上,确保不会侵犯他人权益。培养技术人员的道德意识,从而在技术使用与法律之间找到合理的平衡。数据获取的合法性道德意识的培养反爬虫与反反爬虫的技术对抗可以看作是一个持续的动态过程。在这个过程中,网站不断改进其反爬虫策略,而爬虫开发者则相应地提升反反爬虫技术。这种“攻防战”推动了技术的不断演进,也对互联网安全和数据采集的方式产生了深远影响。反爬虫与反反爬技虫术不仅仅是技术层面的对抗,还涉及法律和道德问题。在追求技术创新的同时,如何平衡数据获取的合法性和道德性,是我们需要认真思考的课题。小结PATR02反爬虫技术COMTENS010203静态页面反爬虫技术动态页面反爬虫技术反爬虫技术实践反爬虫技术静态页面反爬虫技术7.2.1IP封锁和速率限制是最基础的反爬虫手段。通过监控访问请求的IP地址和请求频率,系统可以识别出异常的访问模式。判断:当某个IP地址在短时间内发送了大量请求,可能表明该IP正在使用爬虫程序抓取内容方案:将可疑的IP地址加入黑名单,设置单个IP的访问频率上限1.IP封锁和速率限制http{includemime.types;default_typeapplication/octet-stream;#IP黑名单配置
deny00;#阻止这个IP00访问
deny5;#阻止另一个IP5访问
allowall;#允许其他IP访问
server{listen80;server_name;location/{root/usr/share/nginx/html;indexindex.htmlindex.htm;}}}静态页面反爬虫技术主要针对内容相对固定、没有动态交互的网页进行防护。静态页面通常由服务器生成一次后,直接提供给用户浏览,内容不会因用户操作而发生变化容易成为爬虫程序的目标静态页面反爬虫技术的主要策略和方法如下:【例7-1】Nginx配置IP封锁静态页面反爬虫技术7.2.1原理:每次网页请求都会携带一些HTTP请求头信息,这些信息包括User-Agent、Referer、Accept-Language等字段。判断:爬虫程序往往会使用默认或伪造的请求头信息,这些信息有时与正常用户浏览器发出的请求存在差异。检查请求中的User-Agent字段,将不符合正常浏览器行为的User-Agent,识别为爬虫。方案:如果发现不符合正常浏览器行为的User-Agent,则可以采取阻止或进一步验证的措施。验证请求的来源页面(Referer),识别直接访问特定内容的爬虫行为。2.HTTP请求头分析http{server{listen80;server_name;location/{#拦截常见的爬虫
if($http_user_agent~*(Googlebot|Bingbot|Slurp|DuckDuckBot|Baiduspider)){return403;}root/usr/share/nginx/html;indexindex.html;}}}【例7-2】阻止特定User-Agent请求静态页面反爬虫技术7.2.1原理:通过使用Cookies和Session,网站可以跟踪用户的访问状态并记录其行为。判断与方案:要求每次请求都携带有效的Cookie信息,如果缺少或不正确,系统将拒绝响应。跟踪每个Session的访问行为,如果检测到同一Session在极短时间内访问了大量页面,系统可以认定为爬虫行为,并终止该Session记录每个Session和IP的请求次数和时间,在每次请求时,检查是否超过预设的访问频率阈,超过限制的请求将被拒绝3.Cookie和Session管理classRateLimitMiddleware:def__init__(self,get_response):self.get_response=get_responseself.TIME_WINDOW=60#设定时间窗口为60sself.MAX_REQUESTS_PER_WINDOW=100#每个时间窗口内的最大请求数为100次
def__call__(self,request):#获取客户端的IP地址和SessionKey,如果SessionKey不存在,创建新的Sessionip=self.get_client_ip(request)session_key=request.session.session_keyorself.generate_session_key(request)#组合cache_key,格式为rl:{session_key}:{ip},用于在缓存中存储和检索请求计数
cache_key=f"rl:{session_key}:{ip}"request_count=cache.get(cache_key,0)#从缓存中获取当前的请求计数ifrequest_count>=self.MAX_REQUESTS_PER_WINDOW:returnHttpResponse('Toomanyrequests',status=429)#如果计数超限,返回HTTP429#如果计数未超过限制,递增请求计数,并设置缓存的过期时间为TIME_WINDOW秒
cache.incr(cache_key)cache.expire(cache_key,self.TIME_WINDOW)response=self.get_response(request)#正常返回请求内容returnresponse【例7-3】拒绝超限请求静态页面反爬虫技术7.2.1原理:静态内容混淆通过对网页中的关键内容进行编码、加密或混淆处理,使得爬虫难以直接解析和提取这些信息。方案:将页面中的关键内容通过JavaScript等方式动态解码,防止爬虫直接获取到原始内容。通过混淆CSS和JavaScript代码,增加爬虫的解析难度,使其难以理解和抓取页面内容4.静态内容混淆<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>ObfuscatedCSSExample</title><style>.a1b2c3{#原本可以使用有意义的类名,但在混淆后,类名变得无意义,增加了解析难度
color:red;font-size:20px;}</style></head><body><divclass="a1b2c3">Thistextisredandhasafontsizeof20px.</div></body></html>【例7-4】CSS类名混淆动态页面反爬虫技术7.2.2原理:JavaScript代码混淆是通过使代码难以理解和解析,从而阻止爬虫程序直接读取或执行脚本。实现方式:变量和函数混淆逻辑混淆加密关键数据1.JavaScript代码混淆<body><divid="output"></div><script>//函数动态生成了一段经过混淆的JavaScript代码。使用字符替换和混淆技术,将原本的"HelloWorld!"通过一系列复杂的映射和位移生成混淆代码
functiongenerateObfuscatedCode(){varobfuscatedCode="var_0x5a31=['x3D64x75x6cx6c','x2Bx27x21x27','x4B','x6Fx77','x6Cx6Cx6Fx48'];(function(_0x5e18f3,_0x3ffbf2){var_0x21eebd=function(_0x5e5bc1){while(--_0x5e5bc1){_0x5e18f3['push'](_0x5e18f3['shift']());}};_0x21eebd(++_0x3ffbf2);}(_0x5a31,0x186));var_0x27c5=function(_0x5e18f3,_0x3ffbf2){_0x5e18f3=_0x5e18f3-0x0;var_0x21eebd=_0x5a31[_0x5e18f3];return_0x21eebd;};varhello=_0x27c5('0x0')+_0x27c5('0x1')+_0x27c5('0x2')+_0x27c5('0x3')+_0x27c5('0x4');document.getElementById('output').innerText=hello;";returnobfuscatedCode;}varcode=generateObfuscatedCode();//动态生成并执行混淆代码eval(code);</script></body>动态页面反爬虫技术主要针对那些通过JavaScript、AJAX等技术动态生成内容的网页进行防护。与静态页面不同,动态页面的内容通常是在用户交互后由客户端脚本生成,这使得传统的爬虫工具难以直接获取完整的页面信息。动态页面反爬虫技术的主要策略和方法如下:【例7-5】JavaScript代码混淆动态页面反爬虫技术7.2.2动态内容加载通过在用户交互(如滚动、点击等)后才加载和显示部分内容。这种技术依赖于AJAX请求或其他异步数据获取方式,使得页面初始加载时只包含基础框架,具体内容则在后续用户操作时再逐步加载。实现方式包括按需加载、分页加载和懒加载。爬虫程序如果不能模拟这些用户行为,便无法获取完整的页面信息.2.动态内容加载图7-1地区选择三级联动动态加载动态页面反爬虫技术7.2.2动态内容加载通过CAPTCHA(全自动区分计算机和人类的图灵测试)通过要求用户完成特定的验证任务(如识别图片中的字符、点击特定区域等),来区分人类用户与自动化程序。实现方式有图形验证码、行为验证码及无感验证。图形验证码要求用户输入图片中显示的字符,防止爬虫自动填写表单或触发AJAX请求。行为验证码要求用户进行特定的行为操作(如拖动滑块到指定位置),确保是人类用户在进行访问。无感验证是通过分析用户行为(如鼠标移动轨迹、点击模式等)自动判定是否为爬虫,并根据结果决定是否展示验证码。3.CAPTCHA验证图7-2图形验证码注册示例动态页面反爬虫技术7.2.2原理:通过检测用户的浏览器环境(如浏览器指纹、插件、屏幕分辨率等),网站可以识别出使用非标准浏览器的爬虫程序。爬虫通常使用无头浏览器(如Puppeteer、Selenium)或定制的轻量级浏览器进行数据抓取,但它们的运行环境往往与普通用户的浏览器存在明显差异实现方式:浏览器指纹识别收集用户浏览器的特征信息(如字体列表、时区、屏幕分辨率等),构建唯一的浏览器指纹,并通过比对识别异常的访问者。环境一致性检测检测浏览器的运行环境是否与正常用户一致插件和扩展检测检测常见的浏览器插件和扩展,识别是否为无头浏览器或自定义环境4.基于浏览器环境的防护<script>#浏览器特性检测functiondetectBrowserFeatures(){constfeatures=['localStorage'inwindow,'sessionStorage'inwindow,'indexedDB'inwindow,'serviceWorker'innavigator,'WebGLRenderingContext'inwindow];returnfeatures.every(feature=>feature);}#如果所有特性都存在,视为真实浏览器环境,否则拒绝访问
if(detectBrowserFeatures()){document.getElementById('status').innerText='Browserenvironmentdetected.Accessgranted.';}else{document.getElementById('status').innerText='Non-browserenvironmentdetected.Accessdenied.';}</script>【例7-6】浏览器特性检测反爬虫技术实践7.2.354321基本架构设计客户端防护模块服务端检测模块数据加密模块日志分析模块一个反爬虫框架涉及多个层面的技术,包括服务端检测、客户端行为分析、数据加密、日志分析等。将这些模块整合在一起,形成一个完整的反爬虫系统,可以有效提高爬虫的开发和维护成本,从而保护网站内容。以下是一个基本的反爬虫框架的实现步骤:反爬虫-基本架构设计7.2.301020304客户端防护模块负责前端反爬策略的实现,如JavaScript混淆、行为分析、CAPTCHA等日志分析模块记录并分析访问日志,通过机器学习或规则检测异常行为服务端检测模块在服务器端检测异常请求行为,如IP地址黑名单、请求频率限制、User-Agent检测等数据加密模块对关键数据进行加密或混淆,以防止爬虫直接解析页面内容反爬虫客户端防护模块7.2.3行为分析与CAPTCHA验证JavaScript混淆与动态加载通过混淆JavaScript代码,增加爬虫分析页面的难度。使用JavaScript动态加载部分内容,确保爬虫必须执行JavaScript才能获取完整信息。使用GooglereCAPTCHA服务,对用户行为进行分析,阻止自动化工具的访问javascript(function(){var_0x3a1c=["Page","ContentLoaded!"];varcontent=_0x3a1c[0]+_0x3a1c[1];document.getElementById("content").innerText=content;})();【例7-7】JavaScript混淆与动态加载html<formaction="/submit"method="POST"><inputtype="hidden"id="g-recaptcha-response"name="g-recaptcha-response"><inputtype="submit"value="Submit"></form><scriptsrc="/recaptcha/api.js?render='your-site-key'"></script><script>grecaptcha.ready(function(){grecaptcha.execute('your-site-key',{action:'submit'}).then(function(token){document.getElementById('g-recaptcha-response').value=token;});});</script>【例7-8】阻止自动化工具访问案例服务端检测模块7.2.3行为分析与CAPTCHA验证请求频率限制基于网页访问异常行为,可以将IP地址加入黑名单,或检测可疑的User-Agent字符串,加入可疑User-Agen列表,防止恶意访问fromflaskimportFlask,request,JSONifyfromtimeimporttimeapp=Flask(__name__)request_times={}@app.before_requestdeflimit_requests():client_ip=request.remote_addrcurrent_time=time()ifclient_ipinrequest_times:iflen(request_times[client_ip])>=10:#最大次数10次ifcurrent_time-request_times[client_ip][0]<60:#时间限制一分钟returnJSONify({"error":"Toomanyrequests"}),429else:request_times[client_ip].pop(0)else:request_times[client_ip]=[]request_times[client_ip].append(current_time)if__name__=='__main__':app.run()【例7-9】限制请求次数BLACKLISTED_IPS=["00",""]#IP黑名单@app.before_requestdefcheck_blacklist():client_ip=request.remote_addruser_agent=request.headers.get("User-Agent")ifclient_ipinBLACKLISTED_IPS:returnJSONify({"error":"Accessdenied"}),403if"python-requests"inuser_agentor"scrapy"inuser_agent:returnJSONify({"error":"InvalidUser-Agent"}),403【例7-10】IP地址黑名单限制访问数据加密模块7.2.3通过对页面中的关键数据进行加密或混淆,防止爬虫直接获取有价值的信息。数据加密模块javascript(function(){varencodedData="U29tZSBzZWNyZXQgdGV4dA==";//Base64加密数据document.getElementById('secret').innerText=atob(encodedData);//解密并显示})();通过分析服务器日志,检测异常行为,如过多的404错误、大量的GET请求、非人类行为的请求模式等。后续可以通过分析日志文件来识别潜在的爬虫。日志分析模块importlogginglogging.basicConfig(filename='access.log',level=logging.INFO)@app.after_requestdeflog_request(response):(f"{request.remote_addr}-{request.method}-{request.path}-{response.status}")returnresponsePATR03反反爬虫技术反反爬虫技术随着反爬虫技术的不断进步,爬虫开发者们也在不断探索新的方法来绕过这些防护措施。反反爬虫技术的核心在于如何通过多种策略和技术手段,成功规避网站的反爬虫机制,从而实现有效的数据抓取。主要内容包括IP代理与轮询、模拟人类行为、回避验证机制和反爬虫策略的动态调整。7.3.1IP代理与轮询实现方式实现原理代理池管理建立一个包含多个代理IP的池子,爬虫每次发送请求时从池中随机选取一个IP。代理池可以通过购买代理服务或使用开源项目进行管理。轮询IP在每次请求之间切换IP地址,以避免触发反爬虫系统的IP限制规则。动态IP使用动态IP地址服务,自动定期更换IP,使爬虫难以追踪。IP代理与轮询是反反爬虫的基本技术之一。通过使用大量代理IP,爬虫可以模拟来自不同位置的请求,从而避免单一IP因过多请求而被封禁。主要技术实现方式如下表所示:importrequestsimporttimeimportrandom#设置多个代理IPproxies_list=[{'http':'9:8080','https':'9:8080'},{'http':'2:8080','https':'2:8080'},{'http':'4:8080','https':'4:8080'}]url=''#目标URLforiinrange(5):#循环发起多次请求,轮换使用代理IP,假设进行5次请求proxy=random.choice(proxies_list)#随机选择一个代理try:print(f"正在使用代理:{proxy}发送请求...")#发起请求,使用当前的代理response=requests.get(url,proxies=proxy,timeout=5)print(f"请求成功,状态码:{response.status_code}")#打印响应状态码ifresponse.status_code==200:#如果请求成功,处理响应内容print(f"页面内容部分:{response.text[:100]}...")#打印前100字符作为示例exceptrequests.exceptions.RequestExceptionase:print(f"请求失败,错误信息:{e}")time.sleep(random.uniform(2,5))
#等待2-5秒,避免请求过于频繁【例7-13】IP代理轮询请求。代理的有效性和质量决定了请求是否成功,因此需要使用可靠的代理服务。过于频繁的请求可能会导致IP被封禁。可以通过增加请求间隔、使用更多代理IP来减少被封禁的风险。注意7.3.2模拟自然人行为实现方式实现原理鼠标移动与点击模拟通过自动化工具模拟用户的鼠标移动、点击、滚动页面等操作。这种方式让爬虫看起来像是人类用户在操作页面。随机浏览行为模拟随机的页面浏览行为,如随机点击链接、随机滚动页面、输入文本等,使爬虫的行为看起来更加自然。停留时间模拟控制爬虫在页面上的停留时间,使其符合正常用户的浏览习惯。模拟自然人行为是另一种常用的反反爬虫技术,旨在欺骗反爬虫系统,能够绕过基于行为分析的反爬虫系统,使其认为请求来自真实用户,提高了爬虫的隐蔽性和成功率。fromseleniumimportwebdriverfrommon.action_chainsimportActionChainsfrommon.byimportByimporttime#启动Chrome浏览器driver=webdriver.Chrome(executable_path='/path/to/chromedriverdriver.get('’)#访问目标网站time.sleep(2)#等待页面加载#查找页面上某个可点击的元素,假设我们要点击某个按钮button=driver.find_element(By.XPATH,'//button[@id="targetButton"]’)#创建ActionChains对象,用于模拟复杂操作actions=ActionChains(driver)#模拟鼠标移动到按钮,并点击actions.move_to_element(button).click().perform()#模拟鼠标移动到坐标点(100,200)actions.move_by_offset(100,200).perform()time.sleep(2)#等待几秒钟,以模拟正常用户的行为driver.quit()#关闭浏览器【例7-14】Selenium实现鼠标移动和点击的模拟7.3.3回避验证机制实现方式实现原理验证码破解利用OCR技术或机器学习模型,识别和破解验证码中的字符或图形,从而自动填写验证码。第三方验证码解决服务使用类似2Captcha、Anti-Captcha等服务,将验证码图片发送给人类或AI系统进行识别,返回识别结果供爬虫使用。行为验证绕过某些反爬虫机制要求用户完成特定的交互(如拖动滑块、点击特定区域等),爬虫可以通过模拟这些操作来绕过验证。验证码(如CAPTCHA)是常见的反爬虫措施,反反爬虫技术通过自动化工具或其他手段绕过这些验证机制,突破基于验证码的防护措施,适用于需要处理大量验证码的爬虫任务。主要技术实现方式如下表所示:案例:使用2Captcha服务绕过CAPTCHA验证访问2Captcha网站(https://2/)并创建一个账户,登录后,前往个人资料页面,获取个人的APIkey。2Captcha支持多种验证码类型(如普通图片验证码、hCaptcha等),可以根据不同的场景调整API请求中的参数。注意:2Captcha是一个付费服务,你的账户需要有足够余额才能正常处理CAPTCHA请求。确保遵循2CaptchaAPI的使用条款和请求速率限制。假设目标网站使用GooglereCAPTCHAv2,以下是使用2CaptchaAPI绕过验证的代码importrequestsimporttime#2CaptchaAPIkey(从2Captcha账户中获取)API_KEY='your_2captcha_api_key'#这里输入个人的APIkey#网站的目标URLsite_url=''#网站的reCAPTCHAsitekey(在目标网站的HTML中可以找到)site_key='your_site_key'#第一步:发送请求到2Captcha,要求解析reCAPTCHAcaptcha_id_response=requests.post('http://2/in.php',data={'key':API_KEY,'method':'userrecaptcha','googlekey':site_key,'pageurl':site_url,'JSON':1})#返回captcha_idcaptcha_id=captcha_id_response.JSON().get('request')ifcaptcha_id_response.JSON().get('status')==1:print(f"CAPTCHAID已提交:{captcha_id}")else:print("CAPTCHA提交失败")exit()案例:使用2Captcha服务绕过CAPTCHA验证#第二步:轮询检查2Captcha是否已经解决验证码captcha_solution=NonewhileTrue:time.sleep(5)#等待几秒后查询
captcha_check_response=requests.get('http://2/res.php',params={'key':API_KEY,'action':'get','id':captcha_id,'JSON':1})ifcaptcha_check_response.JSON().get('status')==1:captcha_solution=captcha_check_response.JSON().get('request')print(f"验证码成功解决:{captcha_solution}")breakelifcaptcha_check_response.JSON().get('request')=='CAPCHA_NOT_READY':print("CAPTCHA仍在处理,稍后再试...")else:print(f"CAPTCHA处理错误:{captcha_check_response.JSON().get('request')}")exit()#第三步:使用解决的验证码令牌提交到目标网站submit_response=requests.post(#使用爬虫工具提交该token到目标表单site_url,data={'g-recaptcha-response':captcha_solution,#其他需要提交的表单数据
})7.3.3123
3提交CAPTCHA请求向2Captcha的API发出请求,传递网站的URL和site_key(在网页的g-recaptcha元素中可以找到),让2Captcha的服务帮助解决验证码。2Captcha服务返回一个captcha_id,用来标识这个CAPTCHA请求。轮询获取CAPTCHA解决方案使用captcha_id每隔5秒钟向2Captcha服务查询,看看CAPTCHA是否已经解决。一旦CAPTCHA解决,2Captcha返回一个captcha_solution,即验证码的解决方案token。提交解决方案到目标网站在提交表单或请求时,将captcha_solution(解决后的验证码token)一并提交给目标网站,以绕过验证码。案例:使用2Captcha服务绕过CAPTCHA验证7.3.4反爬虫策略的动态调整网站的反爬虫策略经常发生变化,反反爬虫技术也需要及时调整以适应这些变化,爬虫程序需要具备动态调整规则的能力,以应对网站反爬虫策略的实时变化。主要方式:自动调整请求频率改变请求头信息动态修改爬虫行为利用机器学习模型来自动识别和应对新出现的反爬虫策略#设置代理列表(可选,防止IP封禁)proxies_list=[{'http':'9:8080','https':'9:8080'},{'http':'2:8080','https':'2:8080’}]#常见的User-Agent列表,用于伪装不同的浏览器请求user_agents=['Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36','Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.114Safari/537.36','Mozilla/5.0(iPhone;CPUiPhoneOS14_6likeMacOSX)AppleWebKit/605.1.15(KHTML,likeGecko)Version/14.0Safari/604.1','Mozilla/5.0(Linux;Android10;SM-G975F)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124MobileSafari/537.36’]#请求头信息,用于伪装请求来源headers={'Accept-Language':'en-US,en;q=0.9','Accept-Encoding':'gzip,deflate,br','Connection':'keep-alive',}动态调整反反爬策略#动态调整请求频率defadjust_request_frequency():
#随机选择休眠时间,模拟人为操作
sleep_time=random.uniform(2,5)print(f"等待{sleep_time:.2f}秒后发送下一个请求...")time.sleep(sleep_time)#发送带有不同请求头的请求foriinrange(5):#发送5个请求作为示例
#随机选择一个User-Agentuser_agent=random.choice(user_agents)headers['User-Agent']=user_agent
#随机选择一个代理(如果需要代理)
proxy=random.choice(proxies_list)ifproxies_listelseNonetry:print(f"发送第{i+1}个请求,使用代理:{proxy}和User-Agent:{user_agent}")
#发起请求
response=requests.get(url,headers=headers,proxies=proxy,timeout=10)print(f"请求成功,状态码:{response.status_code}")
#处理响应数据
ifresponse.status_code==200:print(f"响应内容部分:{response.text[:100]}...")#只打印前100个字符
exceptrequests.exceptions.RequestExceptionase:print(f"请求失败,错误信息:{e}")
#调整请求频率
adjust_request_frequency()【例7-16】动态调整反反爬策略在例7-16中,代码提供了一个代理列表proxies_list,通过随机选择代理IP,减少同一IP发送大量请求的风险。用adjust_request_frequency()函数,通过random.uniform()生成一个2到5秒之间的随机休眠时间。这样可以模拟人类的行为,避免频繁请求导致IP被封禁。除此以外,还采用常见的User-Agent列表user_agents,用于伪装不同的浏览器请求,设置了常用的请求头信息列表headers,如Accept-Language、Accept-Encoding等,进一步模拟真实的浏览器请求。总结7.3.5本案例旨在采集百度翻译网页的翻译结果,打开目标网站地址/,需要采集的字段包括用户输入的原文、翻译的目标语言、翻译结果数据,在左侧输入一个关键词“数据”,百度翻译则在右侧返回翻译结果,默认翻译成英文。翻译过程并不需要刷新网页,翻译结果可实时返回,说明该翻译网站为采用Ajax技术动态加载网页信息。数据采集需求采集思路分析右键-检查打开谷歌开发者工具,选择网络面板-XHR,输入原文,在右侧选择预览菜单,找到对应的翻译接口,如下图所示:7.3.5采集思路分析1.在右侧选择标头菜单,找到翻译接口网址为/sug,请求方式为POST。如下图所示:2.在右侧选择载荷菜单,发现携带的参数就是用户输入的内容,如下图所示:7.3.5在第三方网站注册获取代理IP列表备用。以巨浪IP为例,需要先注册账户,然后付费购买套餐,用于学习测试可以购买按量付费的动态代理,也可以全班统一购买一个套餐,大家共同使用。购买后可以生成API提取链接,复制链接备用。获取代理IP关键代码如下:
数据采集代码实现defget_ip():#输入IP代理API链接
url="/company/postpay/getips?auto_white=1&num=1&pt=1&result_type=text&split=1&trade_no=6109837093171821&sign=5ddeb951c1c77440d0e37f1fb12b1954"while1:try:r=requests.get(url,timeout=10)#IP代理随机返回可用IPexcept:continue
ip=r.text.strip()if'请求过于频繁'inip:print('IP请求频繁')
time.sleep(1)continuebreakproxies={'https':'%s'%ip#生成可用代理
}returnproxies7.3.5
数据采集代码实现7.3.5数据采集关键代码如下:defget_data(kw):
#1.百度翻译接口链接
post_url='/sug'#2.创建post请求携带的参数,手动输入需要翻译的单词
data={'kw':kw}
#3.携带请求头
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/Safari/537.36Edg/111.0.1661.51'}
#4.获取代理IPproxies=get_ip()
#使用post请求
data_json=requests.post(url=post_url,data=data,headers=headers,proxies=proxies).json()print(data_json)
time.sleep(2)forkeyindata_json['data'][0]:print(key,data_json['data'][0][key])2.5运行采集百度翻译的爬虫代码,在Pycharm底部“Run”窗口中输入原文“数据”,控制台直接输出目标翻译结果,如下图所示
数据采集结果PATR04拓展案例—采集招聘网岗位信息拓展案例—采集招聘网岗位信息1首次登录后,提取cookie信息保存到当前目录,以备后续selenium自动登录时使用,通过开发者工具分析爬取目标及合适的解析方法。访问招聘网站2使用selenium搭载cookies进行模拟登录,定位查询城市空间自动填入岗位关键词,获取代理IP,以绕过反爬技术,同时增加动态延时改变爬取频率模拟登录3通过XPATH解析网页内容中的目标字段,通过selenium进行自动翻页,实现多页爬取,翻页过程增加延时,模拟用户真实查询过程。解析内容4将数据保存为本地csv文件。保存数据在互联网迅猛发展的时代,招聘信息的发布与获取大多依托于各类招聘网站。通过网络爬虫技术,企业和求职者可以从招聘网站中采集大量有价值的信息,这些数据可以用于分析行业需求、薪酬水平、岗位技能要求等,从而更好地为招聘和求职提供决策支持。本案例将以某大型招聘网站为例,介绍如何采集招聘岗位信息。本案例旨在采集招聘网站上的招聘岗位信息。通过这些信息,用户可以分析不同地区、不同行业的职位分布、薪资水平以及热门岗位的技能要求。案例选取杭州作为城市关键词,采集职业为数据分析师、大数据工程师、数据挖掘、数据专员、数据管理员、数据配置专员、数据标注、数据开发、数据可视化、前端数据可视化的招聘信息。具体采集字段包括:岗位名称、职位信息、薪资、经验要求、学历要求、公司名称、公司行业、公司人数、公司概况、公司成立时间、公司注册资本。打开目标网站地址/hangzhou,首先需要登录,为了获取可靠的cookie信息,用户需要首先注册账号,手动登录,然后保存cookie信息。数据采集需求采集思路分析首次登录后在城市栏选择杭州,记下此时的网址信息备用。右键检查打开开发者工具,选择元素面板,查看岗位搜索框元素,保存XPATH信息,用以后续selenium定位搜索框自动填写岗位关键词。采集思路分析输入“数据分析师”搜索岗位,进入岗位信息列表页面,以同样的方式在HTML代码中查找岗位名称、公司名称等数据的标签及其XPath路径。采集思路分析在网络面板查看请求的“标头”(Headers),可以找到接口的URL以及请求方式,如POST或GET。采集思路分析在网络面板查看请求的“载荷”(Payload)菜单,分析请求时传递的参数,包含分页信息、搜索关键词等数据采集代码实现获取代理IP,关键代码如下#输入IP代理API链接
url="/company/postpay/getips?auto_white=1&num=1&pt=1&result_type=text&split=1&trade_no=6109837093171821&sign=5ddeb951c1c77440d0e37f1fb12b1954"while1:try:r=requests.get(url,timeout=10)#IP代理随机返回可用IPexcept:continue
ip=r.text.strip()从本地读取cookie并保存,关键代码如下driver=webdriver.Edge()
driver.get('/hangzhou’)input(“登录后回车”)#手动登录后回车
dictCookies=driver.get_cookies()#读取本地cookie
jsonCookies=json.dumps(dictCookies)
driver.quit()
#登录完成后,将cookies保存到本地文件
withopen("cookies_zhipin1.json","w")asfp:
fp.write(jsonCookies)当出现请求失败,cookies过期,IP封禁后,需要重新加载cookies,重新获取可用IP进行数据采集,代码如下:
数据采集代码实现
#获取代理IPproxies=get_ip()
edge_options=Options()
edge_options.add_argument(ip)driver=webdriver.Edge(options=edge_options)
#从本地读取cookies
set_cookies()withopen("cookies_zhipin1.json","r",encoding="utf-8")asfp:#导入cookie登录
ListCookies=json.loads(fp.read())forcookieinListCookies:
driver.add_cookie({'domain':'.','name':cookie.get('name'),'value':cookie.get('value'),"expires":cookie.get('value'),'path':'/','httpOnly':False,'HostOnly':False,'Secure':False})
fp.close()
driver.get(temp_url)7.3.5通过采集招聘信息的源代码展示动态爬取过程,关键代码如下:
数据采集代码实现
time.sleep(random.randint(16,20))#随机休眠,模拟真实用户
temp_url=driver.current_url#导入cookie登录SetCookie();
#更新cookies后进入目标网页
driver.get('/hangzhou')
driver.refresh()
#显示等待关键词搜索框加载element=WebDriverWait(driver,300).until(
EC.presence_of_element_located((By.XPATH,'//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[2]/p/input')))
time.sleep(random.randint(7,10))#随机休眠,模拟真实用户#定位岗位关键词搜索框search=driver.find_element(By.XPATH,'//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[2]/p/input’)
search.clear()#清空搜索框
search.send_keys(kind)#提交岗位关键词#模拟真实用户点击搜索按钮
driver.find_element(By.XPATH,'//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/button').click()#随机休眠,模拟真实用户
time.sleep(random.randint(20,28))7.3.5接下来解析目标字段并将采集数据存储到本地csv文件,实际过程中需要进一步优化代码,对空字段做默认处理:
数据采集代码实现definfo(driver):if'class="icon-close"'indriver.page_source:
driver.find_element(By.XPATH,'/html/body/div[39]/div[2]/div[1]/span/i').click()
job_title=re.findall('<h1title=".*?">(.*?)</h1>',driver.page_source)[0]#招聘名称
job_info=re.findall('<divclass="job-sec-text">(.*?)</div>',driver.page_source)#职位信息
job_info=job_info[0].replace('<br>','\n').replace('<br/>',"\n").strip()
job_salary=re.findall('<spanclass="salary">(.*?)</span>',driver.page_source)[0]#薪资
job_experience=re.findall('<spanclass="text-desctext-experiece">(.*?)</span>',
driver.page_source)[0]#经验要求
job_degree=re.findall('<spanclass="text-desctext-degree">(.*?)</span>',driver.page_source)[0]#学历要求
com_title=re.findall('<liclass="company-name"><span>公司名称</span>(.*?)</li>',
driver.page_source)[0]#公司名称
com_classify=re.findall('<aka="job-detail-brandindustry"href=".*?">(.*?)</a>',
driver.page_source)[0]#公司行业
com_content=re.findall('<p><iclass="icon-scale"></i>(.*?)</p>',driver.page_source)[0]#公司人数
com_info=re.findall('<divclass="job-sec-textfold-text">(.*?)</div>',driver.page_source)#公司概况
com_info=com_info[0].replace('<br>','\n').strip()
com_start=re.findall('<liclass="res-time"><span>成立日期</span>(.*?)</li>',driver.page_source)[0]#公司成立时间
com_enroll=re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年兰州市安宁区医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026年长春市二道区工会人员招聘考试备考题库及答案详解
- 2026年阜阳市颍东区政务服务中心(窗口人员)招聘考试参考题库及答案详解
- 2026年盘锦市双台子区医疗系统事业编人员招聘笔试参考题库及答案详解
- 寄宿制示范学校自查报告(3篇)
- 钢材购销合同
- 七年级暑假旅游日记200字【5篇】
- 2026年汉中市汉台区工会人员招聘考试模拟试题及答案详解
- 2026年广安市广安区政务服务中心(窗口人员)招聘考试参考试题及答案详解
- 2026年威海市环翠区工会人员招聘考试模拟试题及答案详解
- 租房合同协议书(2026版)
- 2026年新(高级)政工师理论考试题库及答案
- 小学五年级数学《分数与小数的互化》深度教学教案
- 2026年专利代理师高频面试题包含详细解答
- 第04讲 勾股定理 折叠问题专练(解析版)
- 2026年心理咨询师(初级)职业技能鉴定考试试卷(含答案)
- 2026年高校学报编辑部期刊出版岗应聘笔试指南及规范
- 中铁开工报告审批制度
- 永丰县公安局招聘警务辅助人员笔试真题2025
- 脑卒中急性期护理关怀指南
- 篮球场改造工程施工组织设计方案
评论
0/150
提交评论