项目实训MemeMind——Blog3完善第一个任务——数据源获取理解反爬障碍之AJAX类反爬障碍探索反爬障碍之AJAX类反爬障碍攻克AJAX类反爬障碍完善第一个任务——数据源获取本篇博客将在上篇提到的爬虫架构基础上进一步对常见反爬障碍进行攻克。理解反爬障碍之AJAX类反爬障碍什么是AJAXAJAX全称Asynchronous JavaScript and XML是一种用于创建异步Web应用的技术。它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分内容。AJAX的核心是通过JavaScript发起HTTP请求实现数据的动态加载和渲染。AJAX的工作原理用户操作例如点击按钮触发JavaScript函数。通过XMLHttpRequest或Fetch API向服务器发送请求。服务器接收请求并返回数据通常为JSON或XML格式。JavaScript解析响应数据并动态更新DOM。AJAX基础代码示例使用XMLHttpRequest的简单实现constxhrnewXMLHttpRequest();xhr.open(GET,https://api.example.com/data,true);xhr.onloadfunction(){if(xhr.status200){console.log(JSON.parse(xhr.responseText));}};xhr.send();AJAX反爬特征AJAX类反爬通常表现为页面内容通过JavaScript动态加载数据可能来自后端API接口返回JSON/XML等格式。爬虫直接请求初始HTML时目标数据可能不存在于源码中需分析网络请求捕获接口。探索反爬障碍之AJAX类反爬障碍初步应对同样分析浏览器开发者工具中的Network选项卡但这次筛选XHR/Fetch请求定位返回目标数据的接口。关于加密目标数据的接口可能携带加密参数或动态令牌需逆向JavaScript逻辑生成有效请求。接口返回的数据经过混淆或加密需额外解析处理。例如importrequests responserequests.get(https://example.com/api/data,headers{User-Agent:Mozilla/5.0})dataresponse.json()# 假设返回JSON关于接口以外单纯通过接口获取JSON数据仅是Ajax反爬的一种表现形式。其他变体包括分页参数加密、请求频率限制、cookie验证等。需结合具体场景分析网络交互逻辑。攻克AJAX类反爬障碍本次实践适配比较常见的实时排行榜类网页这里我选择了猫眼电影和上一篇博客一样先通过浏览器自带的开发者工具抓包查找分析网页结果这次由于是攻克AJAX类反爬障碍还多了对json数据结构的逆向分析接着使用TRAE辅助python开发给出提示词在提供的.py代码基础上完善对json内容的爬取功能网站需要爬取的内容对应源代码如下…TRAE修改后的代码...# 匹配页面里的 props {...}matchre.search(rvar props (\{.*?\});,html,re.S)ifmatch:json_strmatch.group(1)datajson.loads(json_str)# 直接转成JSON字典# 你可以在这里输出查看结构# print(json.dumps(data, indent2, ensure_asciiFalse))# 提取需要的内容示例取页面基础信息result[]info{标题:data.get(title,),页面ID:data.get(pageId,),系统类型:data.get(os,),当前日期:data[data][calendar][today]}...运行后却发生了报错推测原因是JSON 里包含了 new Date(…)标准 json 库不认识所以解析失败。我继续给出提示词修改上述代码替换JSON中的new Date(…)避免json解析失败TRAE修改后的代码...# 1. 匹配 propsmatchre.search(rvar props (\{.*?\});\n,html,re.DOTALL)ifnotmatch:print(未找到JSON)exit()json_strmatch.group(1)# 2. 把 new Date(...) 替换成字符串解决json解析报错json_strre.sub(rnew Date\((.*?)\),r\1,json_str)# 3. 加载JSONdatajson.loads(json_str)...依旧报错又推测猫眼的 props 里不是标准 JSON是 JS 对象包含函数、undefined 等json 库无法解析。又尝试了好几次后终于发现猫眼是行不通的它反爬太强、接口会封锁、会返回空数据于是改用某金融网站继续实践上述已有的重复步骤我就不再赘述了接着与TRAE一起开发核心获取代码...# 解析URL返回值并且转换为Json数据defparseResText2JsonList(text):# 1.在字符串中找到需要去掉的内容recordsstartIndextext.find(records)print(截取起始索引,startIndex)# 2.找到最后1个]的位置endIndextext.find(])1print(截取结束索引,endIndex)# 3.通过起始位置和结束位置截取到[]之间的数据strtext[startIndex:endIndex].replace(records,)# 4.将数据解析成JSON列表jsonlistjson.loads(str[2:])returnjsonlist...resgetTextFromUrl(urlURL)jsonListparseResText2JsonList(res.text)all_data.extend(jsonList)# 把当前页数据加入总列表...运行后成功达到了预期效果