影刀RPA 手机App数据采集实战:微信读书书单与评论批量抓取

📅 2026/7/16 2:40:54
影刀RPA 手机App数据采集实战:微信读书书单与评论批量抓取
影刀RPA 手机App数据采集实战微信读书书单与评论批量抓取作者林焱写在前面有些数据只能从手机App里获取——微信读书的书评、小红书的评论、抖音的评论区。PC端根本没有这些入口。影刀的手机自动化功能ADB模式可以模拟人工操作手机滚动翻页、截图识别文字把App里的数据采集出来。本文用微信读书书评采集作为案例把整个流程讲透。一、准备工作硬件Android手机一台USB线软件影刀RPA电脑端ADB工具已配置好PATH微信读书App手机上已安装登录拼多多店群自动化上架方案手机设置开发者选项 → USB调试 → 开启USB连接模式 → 文件传输在弹出的是否允许USB调试对话框点击允许二、整体方案设计流程图 打开目标书籍 → 进入书评列表 → 截图当前屏幕 → OCR识别书评文字 → 提取并保存 → 向上滑动加载更多 → 重复直到采集完 → 导出Excel三、核心代码实现基础工具函数importsubprocessimporttimeimportpytesseractfromPILimportImageimportreimportjsonimportopenpyxldefrun_adb(cmd):resultsubprocess.run(fadb{cmd},shellTrue,capture_outputTrue,textTrue,encodingutf-8)returnresult.stdout.strip()deftap(x,y):run_adb(fshell input tap{x}{y})time.sleep(0.5)defswipe_up(start_y1400,end_y600,duration500):run_adb(fshell input swipe 540{start_y}540{end_y}{duration})time.sleep(1)defscreenshot(save_pathscreen.png):run_adb(shell screencap -p /sdcard/screen.png)run_adb(fpull /sdcard/screen.png{save_path})returnsave_pathdefget_screen_size():outputrun_adb(shell wm size)matchre.search(r(\d)x(\d),output)ifmatch:returnint(match.group(1)),int(match.group(2))return1080,2400# 默认值导航到书评页面defopen_weread_book_reviews(book_name): 打开微信读书App搜索指定书籍进入书评页面 # 启动微信读书run_adb(shell am start -n com.tencent.weread/.MainActivity)time.sleep(3)# 点击搜索图标根据实际坐标调整W,Hget_screen_size()tap(W*0.85,H*0.05)# 右上角搜索按钮大致位置time.sleep(1)# 输入书名使用ADBKeyboardrun_adb(fshell am broadcast -a ADB_INPUT_TEXT --es msg {book_name})time.sleep(0.5)run_adb(shell input keyevent 66)# 回车搜索time.sleep(2)# 点击第一个搜索结果大致位置screenshot(search_result.png)# 这里需要根据实际界面截图确认坐标tap(W*0.5,H*0.25)# 第一条结果time.sleep(2)# 进入书籍详情后找书评tab# 需要根据实际App界面截图确认位置screenshot(book_detail.png)# tap到书评按钮# 微信读书书评按钮位置因版本而异需实际测量OCR识别书评内容defextract_reviews_from_screenshot(image_path,review_areaNone): 从截图中提取书评文字 review_area: (left, top, right, bottom) 只识别特定区域 imgImage.open(image_path)ifreview_area:imgimg.crop(review_area)# 用pytesseract识别中文textpytesseract.image_to_string(img,langchi_sim,config--psm 6)returntextdefparse_reviews(raw_text): 从OCR识别的原始文字中解析出书评条目 返回 [(用户名, 评星, 评论内容), ...] reviews[]lines[line.strip()forlineinraw_text.split(\n)ifline.strip()]# 简单的解析逻辑根据实际界面格式调整current_review{}forlineinlines:# 识别用户名行通常较短包含汉字iflen(line)15andre.match(r^[\u4e00-\u9fa5\w]$,line):ifcurrent_review:reviews.append(current_review)current_review{user:line,content:}elifcurrent_review:current_review[content]line ifcurrent_review:reviews.append(current_review)returnreviews主采集循环defcollect_book_reviews(book_name,max_scrolls50,output_filebook_reviews.xlsx): 采集指定书籍的书评 max_scrolls: 最大滑动次数每次大约采集5-8条书评 # 导航到书评页面open_weread_book_reviews(book_name)time.sleep(2)all_reviews[]seen_contentsset()# 用于去重scroll_count0no_new_content_count0whilescroll_countmax_scrolls:# 截图当前页面img_pathfreview_screen_{scroll_count}.pngscreenshot(img_path)# OCR识别raw_textextract_reviews_from_screenshot(img_path)new_reviewsparse_reviews(raw_text)# 去重后添加new_count0forreviewinnew_reviews:content_keyreview.get(content,)[:50]# 用前50字作为唯一标识ifcontent_keyandcontent_keynotinseen_contents:seen_contents.add(content_key)all_reviews.append(review)new_count1print(f滑动{scroll_count1}次发现{len(new_reviews)}条新增{new_count}条累计{len(all_reviews)}条)ifnew_count0:no_new_content_count1ifno_new_content_count3:print(连续3次无新内容采集完毕)breakelse:no_new_content_count0# 向上滑动加载更多swipe_up()scroll_count1time.sleep(1)# 保存到Excelwbopenpyxl.Workbook()wswb.active ws.append([书名,用户名,评论内容,采集序号])fori,reviewinenumerate(all_reviews,1):ws.append([book_name,review.get(user,),review.get(content,).strip(),i])wb.save(output_file)print(f\n采集完成共{len(all_reviews)}条书评已保存到{output_file})returnall_reviews# 执行采集collect_book_reviews(活着,max_scrolls30,output_file活着_书评.xlsx)四、图像识别方案替代OCR当OCR识别效果不好时用图像区域坐标直接定位文字区域importpyautoguifromPILimportImageGrabdefcapture_review_text_area(device_idNone): 先截图到电脑再截取书评区域 通过手动标注确认书评文字区域坐标 screenshot(temp.png)# 打开截图人工确认书评区域坐标imgImage.open(temp.png)W,Himg.size[video(video-CQCY0xvY-1784131579630)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]# 书评文字通常在屏幕中间区域排除顶部导航栏和底部操作栏review_area(int(W*0.05),# left左侧留5%边距int(H*0.15),# top跳过顶部15%导航栏int(W*0.95),# right右侧留5%边距int(H*0.85)# bottom排除底部15%操作栏)returnextract_reviews_from_screenshot(temp.png,review_area)五、数据质量处理OCR识别出来的文字不可避免有噪声需要后处理defclean_review_text(text):清洗OCR识别出的书评文字# 去除常见OCR乱码字符textre.sub(r[|\\/{}\[\]],,text)# 去除多余空格textre.sub(r\s, ,text).strip()# 过滤太短的噪声少于10字的通常不是书评iflen(text)10:return# 去除纯数字行通常是点赞数、时间戳残留ifre.match(r^\d$,text):returnreturntext六、踩坑记录坑1OCR识别中文准确率问题pytesseract识别手机截图的中文准确率在60-80%之间影响数据质量。更好的方案百度OCR API识别准确率95%每千次调用0.5元日用量500次内免费。坑2手机不同版本界面变化微信读书、小红书等App频繁更新界面布局会变化。建议将核心坐标存到配置文件里方便修改不要把坐标写死在代码里。坑3滑动采集的去重难题每次滑动屏幕会有重叠内容去重要用内容哈希而不是序号。建议取评论的前30字生成MD5作为去重key。坑4采集速度过快被App封禁某些App有防机器人检测连续快速滑动会触发验证。每次滑动加随机延时1-3秒模拟人工操作节奏。总结手机App数据采集的核心流程截图 → OCR识别 → 解析 → 去重 → 保存 → 滑动翻页。这套流程适用于各种只有手机端的App数据采集场景。关键是调好OCR区域和去重逻辑。署名林焱