影刀RPA 网页评论采集:展开与分页加载
影刀RPA 网页评论采集展开与分页加载作者林焱什么情况用什么采集商品评论、文章评论、视频评论——评论数据通常不在页面源码里而是通过AJAX动态加载还有展开更多按钮和分页。在影刀RPA里需要处理评论展开、滚动加载、API接口抓取等多种方式。适用场景电商商品评论分析、新闻评论舆情监控、视频评论采集、社区帖子回复采集。怎么做方式一通过API接口采集推荐拼多多店群自动化上架方案评论通常通过AJAX加载直接请求API最高效importrequestsimportpandasaspdimporttimedefscrape_comments_api(product_id,max_pages50):通过API采集评论all_comments[]headers{User-Agent:Mozilla/5.0...,Referer:fhttps://example.com/product/{product_id}}forpageinrange(1,max_pages1):# API URL需要通过F12 → Network → XHR找到api_urlfhttps://example.com/api/commentsparams{product_id:product_id,page:page,size:20,sort:newest# newest/hot}responserequests.get(api_url,paramsparams,headersheaders,timeout10)ifresponse.status_code!200:print(f第{page}页请求失败:{response.status_code})breakdataresponse.json()commentsdata.get(data,{}).get(list,[])ifnotcomments:print(f第{page}页无评论停止)breakforcincomments:all_comments.append({用户:c.get(username,),评分:c.get(rating,),内容:c.get(content,),时间:c.get(create_time,),点赞数:c.get(like_count,0),回复数:c.get(reply_count,0),})print(f第{page}页:{len(comments)}条, 累计{len(all_comments)}条)time.sleep(1)returnall_comments# 使用commentsscrape_comments_api(123456,max_pages20)pd.DataFrame(comments).to_excel(rC:\Data\comments.xlsx,indexFalse)方式二影刀浏览器自动化当API接口有加密参数无法直接调用时用浏览器操作【打开网页】→ 商品详情页 【等待元素出现】→ .comment-section 【点击元素】→ 查看全部评论按钮如果有 【循环】 【提取相似元素数据】→ 当前页评论 - 用户名.comment-item .username - 内容.comment-item .content - 时间.comment-item .time - 评分.comment-item .rating 【判断元素是否存在】→ 下一页或加载更多 存在 → 【点击元素】→ 等待新评论加载 不存在 → 退出循环 【等待】2秒 【结束循环】方式三滚动加载评论defscrape_comments_scroll(max_scrolls30):滚动加载评论all_comments[]forscroll_numinrange(max_scrolls):# 1. 提取当前可见的评论# 影刀中【提取相似元素数据】→ .comment-itemcurrent_commentsextract_comments()# 2. 去重合并new_count0forcincurrent_comments:c_idc.get(id)orc.get(内容)[:20]# 用ID或内容前20字做唯一标识ifc_idnotin[existing.get(id)forexistinginall_comments]:all_comments.append(c)new_count1print(f第{scroll_num1}次滚动: 新增{new_count}条, 共{len(all_comments)}条)ifnew_count0:# 连续3次无新评论则停止no_new_countgetattr(scrape_comments_scroll,_no_new,0)1ifno_new_count3:breakscrape_comments_scroll._no_newno_new_countelse:scrape_comments_scroll._no_new0# 3. 滚动到评论区域底部# 影刀中【执行JavaScript代码】js var commentArea document.querySelector(.comment-section); if (commentArea) { commentArea.scrollTop commentArea.scrollHeight; } window.scrollTo(0, document.body.scrollHeight); # 【执行JavaScript代码】→ js# 4. 等待新评论加载time.sleep(2)returnall_commentsdefextract_comments():提取页面评论影刀中用可视化指令# 这里模拟返回return[]评论展开处理有些评论被截断需要点击展开才能看到完整内容defexpand_and_scrape_comments():展开所有评论后采集# 1. 先点击所有展开按钮# 影刀中# 【执行JavaScript代码】js_expand_all // 找到所有展开按钮并点击 var expandBtns document.querySelectorAll(.comment-expand, .show-more); expandBtns.forEach(function(btn) { btn.click(); }); return expandBtns.length; # 影刀中执行这段JS返回展开的评论数# 2. 等待展开time.sleep(1)# 3. 提取完整评论# 【提取相似元素数据】→ .comment-item .full-content# 4. 处理查看更多回复js_expand_replies var replyBtns document.querySelectorAll(.view-replies); replyBtns.forEach(function(btn) { if (btn.textContent.includes(查看)) { btn.click(); } }); time.sleep(1)# 5. 提取含回复的完整评论pass评论数据分析defanalyze_comments(comments_df):评论数据分析importpandasaspd analysis{}# 1. 基础统计analysis[总评论数]len(comments_df)analysis[平均评分]comments_df[评分].mean()# 2. 评分分布rating_distcomments_df[评分].value_counts().sort_index()analysis[评分分布]rating_dist.to_dict()# 3. 评论时间趋势comments_df[日期]pd.to_datetime(comments_df[时间],errorscoerce)daily_countcomments_df.groupby(comments_df[日期].dt.date).size()analysis[日均评论]daily_count.mean()# 4. 关键词统计fromcollectionsimportCounterimportjieba all_text .join(comments_df[内容].astype(str))wordsjieba.cut(all_text)word_countCounter(wforwinwordsiflen(w)1)analysis[高频词]word_count.most_common(20)# 5. 好评/差评比例goodlen(comments_df[comments_df[评分]4])badlen(comments_df[comments_df[评分]2])analysis[好评率]f{good/len(comments_df)*100:.1f}%analysis[差评率]f{bad/len(comments_df)*100:.1f}%returnanalysis有什么坑TEMU店群如何管理运营坑1API参数加密# 问题评论API的参数有sign签名无法直接构造请求# 如params {sign: a1b2c3..., timestamp: 1234567890}# 解决1用影刀浏览器自动化不直接调API# 【打开网页】→ 【滚动】→ 【提取数据】# 解决2从页面中提取sign# 有些网站在页面HTML中嵌入了token# 先【获取网页源代码】→ 用正则提取token → 再调API# 解决3用浏览器拦截AJAX响应# 影刀中用【执行JavaScript代码】拦截XHRjs_intercept var originalOpen XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open function(method, url) { if (url.includes(comment)) { window._comment_api_url url; } return originalOpen.apply(this, arguments); }; 坑2评论内容有HTML标签# 问题评论内容包含br、span等标签# 解决用BeautifulSoup清理frombs4importBeautifulSoupdefclean_comment_text(text):清理评论文本ifnottext:return# 去HTML标签soupBeautifulSoup(text,html.parser)textsoup.get_text(separator ,stripTrue)# 去多余空白text .join(text.split())returntext comments_df[内容]comments_df[内容].apply(clean_comment_text)坑3评论按热度排序时翻页数据不连续# 问题按热度排序翻页时由于点赞数实时变化评论可能跳过或重复# 解决用时间排序采集然后本地按热度排序# 采集时用时间排序params[sort]newest# 而不是hot# 本地排序comments_dfcomments_df.sort_values(点赞数,ascendingFalse)坑4评论太多导致内存溢出# 问题一个商品有几万条评论全部加载到内存# 解决分批保存batch_size500forpageinrange(1,max_pages1):commentsscrape_one_page(page)all_comments.extend(comments)# 每500条保存一次iflen(all_comments)batch_size:dfpd.DataFrame(all_comments)# 追加写入Excelwithpd.ExcelWriter(output_file,modea,engineopenpyxl)aswriter:df.to_excel(writer,startrowwriter.sheets[Sheet1].max_row,headerFalse)all_comments[]# 清空坑5评论中有追评/回复# 问题一条评论可能有追评和商家回复结构嵌套# 解决分两层采集# 第一层主评论main_commentssoup.select(.comment-item:not(.reply))forcommentinmain_comments:# 主评论内容main_textsafe_text(comment.select_one(.content))# 追评同一评论块内的追加内容append_textsafe_text(comment.select_one(.append-content))# 商家回复replycomment.select_one(.merchant-reply)reply_textsafe_text(reply.select_one(.reply-content))ifreplyelsedata{主评论:main_text,追评:append_text,商家回复:reply_text}