特价网站建设价格低,导购网站如何做淘宝客,什么公司需要做网站,中山手机网站建设价格声明#xff1a; 该文章为学习使用#xff0c;严禁用于商业用途和非法用途#xff0c;违者后果自负#xff0c;由此产生的一切后果均与作者无关
一、简介
爬虫逆向补环境的目的是为了模拟正常用户的行为#xff0c;使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…声明 该文章为学习使用严禁用于商业用途和非法用途违者后果自负由此产生的一切后果均与作者无关
一、简介
爬虫逆向补环境的目的是为了模拟正常用户的行为使爬虫看起来更像是一个真实的用户在浏览网站。这样可以减少被网站封禁或限制访问的风险提高爬取成功率。同时合理的环境补充也有助于保护爬虫的隐私和安全避免被恶意攻击或追踪。 由于浏览器和node的差别很多网站会根据这些差别做一些校验会导致浏览器的js代码在node没有办法执行js代码会根据浏览器的这些属性来判断你是不是在真正的浏览器执行的代码要不是正确的浏览器环境则不会返回正确的数据信息拿到代码在node里面执行、经常看到这一类型的错误提示xxx未定义其实这一块就是浏览器对象的一些特征
二、找出网站加密位置并扣出代码
js运行 atob(‘aHR0cHM6Ly93d3cudG91dGlhby5jb20v’) 拿到网址F12打开调试工具点击推荐发送请求找到 pc/list/feed 请求鼠标右击请求找到CopyCopy as cUrl(cmd)打开网站https://spidertools.cn/#/curl2Request把拷贝好的curl转成python代码新建 jrtt.py把代码复制到该文件 关键字_signature搜索会发现有_signature赋值的地方 右击该文件选择在source中打开 在该文件内 CtrlF 搜索_signature会发现有两个赋值的地方全部打上断点 点击推荐重新发送请求会发现断点进入 var n I(F.getUri(e), e)鼠标悬浮到 I 上点击蓝色部分快速找到该方法会发现一个 I(e, t) 方法在该方法内部打断点 点击跳过断点会进入该断点分析代码会发现该代码return出去的是 a.call(n, o)而an.signn window.byted_acrawlero则是请求地址加上参数的一串字符鼠标悬浮到 window.byted_acrawler 找到 sign方法点击蓝色部分快速找到该方法分析代码会发现该函数是jsvmp实现的jsvmp是js虚拟机保护方案 新建jrtt.js把代码全部拷贝到该文件再把 o 在控制台输出拷贝到jrtt.js文件
三、打断点补环境
运行jrtt.js会发现报 window 错误window是浏览器中的node环境不存在在代码顶部补上windowwindow global 运行jrtt.js会报 sign 错误这是因为刚才的sign是声明在 window.byted_acrawler 中而现在的window中没有byted_acrawler补上byted_acrawler 运行jrtt.js会报referrer的错误在source中的加密文件搜索 S[R] S[R][A]会找到该代码在该代码处打个日志断点在日志断点处输出 S[R]、A、S[R]A 取消之前所有的断点除了刚才的日志断点刷新网页会发现控制台中打印很多日志这些就是刚才的日志断点生成的控制台搜索referrer会发现是document下的referrer且值是一个空字符串在代码顶部补上referrer 运行jrtt.js文件 sign 错误找代码会发现 “undefined” ! typeof exports ? exports : void 0这是环境检测 exports 是node环境的把代码修改为 “undefined” typeof exports 运行jrtt.js文件会报 href 错误同 referrer 一样在控制台搜索 href会发现 href 是 location 下的在代码顶部补上该代码 运行jrtt.js文件会报 length 错误因太多对象有length所以length不能像href、referrer 一样直接再浏览器控制台搜索找到拷贝下的加密代码搜索 S[R] S[R][A]找到对应位置添加 console.log(A) 运行jrtt.js文件会发现报错length的对象是protocol同href、referrer一样在控制台搜索protocol会发现 protocol 是 location 下的在代码顶部补上该代码 运行jrtt.js文件会报userAgent的错误在控制台搜索userAgent会发现userAgent是navigator中的在顶部补上该代码 再次运行jrtt.js文件会发现已经没有报错参数加密成功直到现在补了 windows、href、protocol、userAgent这些 验证加密结果修改jjtt.py并运行数据获取成功
四、吐环境脚本检测环境
使用Proxy对目标环境进行拦截检测缺少的环境Proxy对象由两个部分组成target、handler handler是一个对象声明了代理target的指定行为支持的拦截操作一共13种
get(target,propKey,receiver)拦截对象属性的读取。
target: 目标对象propKey: 被获取的属性名。receiver: Proxy 或者继承 Proxy 的对象
set(target,propKey,value,receiver)拦截对象属性的设置返回一个布尔值修改成功。
target: 目标对象propKey: 被获取的属性名。value: 新属性值。receiver: Proxy 或者继承 Proxy 的对象
新建jsProxy.js放入以下代码代码可通用需要扩展的可在该代码基础上扩展
// 代理器封装
function getEnv(proxy_array) {for(var i0; iproxy_array.length; i){handler {\nget: function(target, property, receiver) {\nconsole.log(方法get, 对象${proxy_array[i]}, 属性,property, 属性类型,typeof property, 属性值类型,typeof target[property]);return target[property];},set: function(target, property, value, receiver){\nconsole.log(方法set, 对象${proxy_array[i]}, 属性,property, 属性类型,typeof property, 属性值类型,typeof target[property]);return Reflect.set(...arguments);}};eval(try{\n${proxy_array[i]};\n${proxy_array[i]} new Proxy(${proxy_array[i]},${handler});}catch(e){\n${proxy_array[i]}{};\n${proxy_array[i]} new Proxy(${proxy_array[i]},${handler});} )}
}// proxy_array [window, document, location, navigator, history,screen,target ]
// getEnv(proxy_array)module.exports getEnv修改jrtt.js运行jrtt.js会发现有很多undefined的这些就是需要补的值由刚才的断点不环境得知sessionStorage、localStorage、cookie等是不需要补的所以如果不知道需要补哪些环境就先补报错的报错的补完先验证下如果验证不通过在补其他的 由刚才的报错得知location下的herf获取时值时undefined所以先补href直接在控制台输出location.href值补上 重复步骤5直到没有报错再去验证结果运行jjtt.py后会发现虽然没补referrer但是数据依然获取成功那是因为referrer是空值已经在代理中把它之前的值返回了
五、Selenium补环境
selenium就是一个真实的浏览器环境可以把扣下来的代码直接用Selenium来进行访问 新建jrtt.html把之前扣下的代码拷贝到script下因为是在浏览器下运行的所以把之前检验环境的 “undefined” ! typeof exports ? exports 还原 浏览器打开该html验证window.byted_acrawler.sign会发现加密成功 新建seleniumJrtt.py如果运行出错先检查下自己浏览器和谷歌驱动版本
import os
from selenium import webdriverPRO_DIR os.path.dirname(os.path.abspath(__file__))
def driver_sig(html_file):option webdriver.ChromeOptions()option.add_argument(--disable-blink-featuresAutomationControlled)option.add_argument(headless)driver webdriver.Chrome(optionsoption)driver.get(PRO_DIR \\ html_file)return driverhtml_file jrtt.html
driv driver_sig(html_file)js_code
return window.byted_acrawler.sign(arguments[0]);
par {url: https://www.toutiao.com/api/pc/list/feed?channel_id0min_behot_time1700905532offset0refresh_count7categorypc_profile_recommendaid24app_nametoutiao_web
}result driv.execute_script(js_code,par)print(result)六、jsdome补环境