☰
影刀RPA新手教程:搜索引擎结果采集实战——Google Bing百度的批量抓取
2026/10/8 23:01:21 网站建设 项目流程

影刀RPA新手教程:搜索引擎结果采集实战——Google Bing百度的批量抓取

三个搜索引擎的页面结构完全不一样,但核心逻辑是一致的:打开搜索页→解析结果列表→抓取标题/URL/摘要→翻页→去重。

我第一次做三平台搜索采集时犯了个大错——百度、Google、Bing的结果URL格式都不一样,我写了三段完全独立的采集代码。后来发现只要把"提取搜索结果"的逻辑抽象成一个子流程,传入不同的XPath和翻页参数,就能统一处理三个平台。这个思路省了60%的代码量。

这篇完整跑通:分析Google/Bing/百度三个平台搜索结果页的DOM结构差异→写出各平台的XPath定位→处理翻页(百度的"百度一下"按钮特殊情况)→从Excel读取关键词列表批量搜索→多平台结果去重(同一URL出现在多个关键词→标记重复次数)→生成SEO竞争分析报告。

一、三个平台的搜索结果页结构对比

用F12打开开发者工具,搜索同一个关键词"Python自动化",对比三个平台的结果结构:

Google:https://www.google.com/search?q=Python自动化

  • 容器://div[@id="search"]下的//div[@class="g"]
  • 每个结果://div[@class="g"]是一个搜索结果块
  • 标题:.//h3(很稳定,Google长期没改过)
  • URL:.//a[@jsname="UWckNb"]或.//div[@class="yuRUbf"]//a的href
  • 摘要:.//div[contains(@class,"VwiC3b")]或//span[@class="aCOpRe"]
  • 翻页:底部//a[@aria-label="Page 2"]依次递增

百度:https://www.baidu.com/s?wd=Python自动化

  • 容器://div[@id="content_left"]
  • 每个结果://div[contains(@class,"c-container")]
  • 标题:.//h3//a或.//a[contains(@class,"c-blocka")]
  • URL:标题a标签的href(百度会包装成跳转链接,用href属性直接取)
  • 摘要:.//span[contains(@class,"c-abstract")]
  • 翻页:底部//a[contains(text(),"下一页")]+ 特殊按钮"百度一下"

Bing:https://www.bing.com/search?q=Python自动化

  • 容器://ol[@id="b_results"]
  • 每个结果://li[@class="b_algo"]
  • 标题:.//h2//a
  • URL:标题a标签的href
  • 摘要:.//p或.//div[@class="b_caption"]//p
  • 翻页:底部//a[@title="下一页"]和//a[@title="第 2 页"]

核心差异——三个平台的XPath完全不同,但思路一样:容器→列表→字段。抽象成一个配置表:

搜索引擎配置={"Google":{"搜索URL模板":"https://www.google.com/search?q={keyword}","结果容器":'//div[@class="g"]',"标题XPath":'.//h3',"URLXPath":'.//div[@class="yuRUbf"]//a',"摘要XPath":'.//div[contains(@class,"VwiC3b")]',"翻页下一页":'//a[@id="pnnext"]',},"百度":{"搜索URL模板":"https://www.baidu.com/s?wd={keyword}","结果容器":'//div[contains(@class,"c-container")]',"标题XPath":'.//h3//a',"URLXPath":'.//h3//a',"摘要XPath":'.//span[contains(@class,"c-abstract")]',"翻页下一页":'//a[contains(text(),"下一页")]',},"Bing":{"搜索URL模板":"https://www.bing.com/search?q={keyword}","结果容器":'//li[@class="b_algo"]',"标题XPath":'.//h2//a',"URLXPath":'.//h2//a',"摘要XPath":'.//div[@class="b_caption"]//p',"翻页下一页":'//a[@title="下一页"]',},}

这个配置字典是整个流程的核心。切换搜索引擎时只换配置,不改采集逻辑。

二、影刀里的批量数据抓取配置

以百度为例,配置影刀的「批量数据抓取」指令:

  • 列表容器://div[contains(@class,"c-container")]
  • 字段1"标题":.//h3//a→ 文本
  • 字段2"URL":.//h3//a→ 属性href
  • 字段3"摘要":.//span[contains(@class,"c-abstract")]→ 文本

Google和Bing同理,参照上面的配置表换XPath。

「批量数据抓取」比循环获取相似元素快一个数量级——一次DOM查询拿到所有结果,不用每条数据单独走一遍获取元素→等待→获取文本的流程。10条搜索结果,「批量数据抓取」一次性搞定;传统循环方式要串行处理10次,效率差10倍。

三、翻页处理:百度翻页的关键操作

三平台的分页URL规则:

  • Google:第一页?q=keyword,第二页?q=keyword&start=10,第三页start=20。每次递增10。
  • 百度:第一页?wd=keyword,第二页?wd=keyword&pn=10,第三页pn=20。每次递增10。
  • Bing:第一页?q=keyword,第二页?q=keyword&first=10,第三页first=20。

URL拼接法翻页最简单,不用管按钮是否存在:

forpageinrange(0,100,10):# 翻10页,结果数=10*10=100ifpage==0:url=f"https://www.baidu.com/s?wd={keyword}"else:url=f"https://www.baidu.com/s?wd={keyword}&pn={page}"打开网页(url)等待元素出现(结果容器)批量数据抓取

但是——百度的"百度一下"按钮不是每次都接受URL拼接翻页。有时候pn=10能正常翻,有时候百度会强制回到第一页。

这种情况的解决方案:不拼URL,改用「点击元素」点"下一页"按钮。但点之前要先处理"百度一下"——

百度翻页区域的特点:底部有一个"百度一下"按钮和一个"下一页"链接。按钮是<input type="submit" value="百度一下" class="btn self-btn bg s_btn">,"下一页"是<a href="...">下一页 ></a>。

如果你快速点了"下一页"按钮,百度可能重定向到首页。解决:每次翻页后等待2秒,再用「点击元素」定位"下一页"链接。逐步翻页不会触发百度反爬。

我更惯用的做法:两套方案并行。先用URL拼接法(方案A),如果连续两次页面内容没变化(说明翻到了同一页),切到点击按钮法(方案B)。这个保底机制避免因不同搜索引擎的策略差异卡流程。

四、多关键词批量搜索:从Excel读关键词列表

关键词列表放在Excel里,A列是关键词,每个关键词一行。

影刀读Excel关键词列表:

# 用影刀的「读取Excel区域」指令# 范围:A1:A50# 保存为:关键词列表(一维列表)

循环逻辑:

全部结果=[]For次数循环(len(关键词列表)):关键词=关键词列表[当前索引]For次数循环(搜索引擎列表):# ["百度", "Google", "Bing"]引擎=搜索引擎列表[内索引]配置=获取配置(引擎)# 从配置字典中取URL=配置["搜索URL模板"].format(keyword=关键词)打开网页(URL)等待元素出现 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c24bb947e9f740e293b8edf038f25cc4.png#pic_center)本引擎结果=[]For翻页循环(到第5页):批量数据抓取 拼接URL翻页或点击翻页 本引擎结果+=当前页结果 全部结果+=[{"关键词":关键词,"引擎":引擎,**结果}for结果in本引擎结果]随机等待3-6秒# 避免触发反爬# 最终:全部结果是一个列表,每条是 {"关键词": "Python自动化", "引擎": "Google", "标题": "xxx", "URL": "xxx", "摘要": "xxx"}

三层嵌套:关键词→搜索引擎→翻页。总请求量=关键词数×3个平台×5页=15*关键词数的请求。如果50个关键词,就是750个请求。多平台跑下来每趟需要约30-60分钟。

频率控制:Google对自动化检测最严,百度次之,Bing最松。Google最快每秒1个请求,百度和Bing可以每秒2-3个请求。用random.uniform(2,5)做随机等待。

五、结果去重:同一URL出现在多个关键词

一条结果在"Python自动化"搜索中出现,在"Python爬虫"搜索中也可能出现。如果不去重,统计排名、分析覆盖时会重复计数。

去重逻辑:以URL为唯一键。同一个URL出现在多个关键词中时,记录出现了几次、有哪些关键词。

defdeduplicate_results(results):""" results: [{"关键词": k1, "引擎": e1, "标题": t1, "URL": u1, ...}, ...] """url_map={}forrinresults:url=r["URL"]ifurlnotinurl_map:url_map[url]={"URL":url,"标题":r["标题"],"首次出现关键词":r["关键词"],"出现关键词列表":[r["关键词"]],"出现次数":1,"出现平台":[r["引擎"]],"摘要":r["摘要"],}else:url_map[url]["出现次数"]+=1ifr["关键词"]notinurl_map[url]["出现关键词列表"]:url_map[url]["出现关键词列表"].append(r["关键词"])ifr["引擎"]notinurl_map[url]["出现平台"]:url_map[url]["出现平台"].append(r["引擎"])returnsorted(url_map.values(),key=lambdax:x["出现次数"],reverse=True)

去重后输出:

URL标题出现次数覆盖关键词覆盖平台
site.com/a自动化教程5自动化/RPA/爬虫…百度/Google/Bing

出现次数多的URL说明该页面SEO做得全面,在多个关键词下都有良好排名。

六、SEO竞争分析报告

汇总去重后的所有结果,生成Excel报告。三个Sheet:

**Sheet1 “原始结果”**包含:
| 关键词 | 引擎 | 排名 | 标题 | URL | 摘要 |

**Sheet2 “去重分析”**包含:
| URL | 标题 | 出现次数 | 覆盖关键词数 | 覆盖平台数 | 出现关键词列表 |

Sheet3 “关键词排名矩阵”:

关键词Top1Top2Top3Top4Top5

矩阵Sheet用pandas做数据透视:

importpandasaspd# df:原始结果DataFrame,含"关键词"/"排名"/"URL"字段# 按关键词+排名取URLpivot=df.pivot_table(index="关键词",columns="排名",values="URL",aggfunc="first"# 多引擎的结果取第一出现的)# 只显示Top 5pivot=pivot[[kforkin[1,2,3,4,5]ifkinpivot.columns]]

一行代码就能看到:你的网站在哪些关键词下排名靠前,哪些被竞争对手占据。

七、变量与流程架构:三层嵌套的参数传递

流程中的变量层级:

流程输入参数(运行时传入):

参数类型默认值说明
excel_path字符串“关键词列表.xlsx”关键词Excel路径
search_engines列表[“百度”,“Google”,“Bing”]搜索引擎列表
max_pages数字5每个关键词翻页数
output_path字符串“SEO报告.xlsx”输出路径
delay_range列表[2,5]请求间隔秒数范围

子流程内部变量:

  • 当前关键词:字符串,子流程参数
  • 当前引擎:字符串,子流程参数
  • 当前页结果:列表,循环内局部
  • 本引擎累计结果:列表,循环外局部

数据流向:主流程→关键词循环→发送给"单引擎采集"子流程→返回结果列表→主流程汇总。

子流程封装的意义:每个搜索引擎翻页采集的逻辑一模一样(只是XPath不同),封装成一个子流程,传入搜索引擎名称参数就行了。后续增加搜狗/360/头条搜索,只要加一行配置。

八、系统联动:飞书推送SEO报告摘要

采集完成后,飞书在线表格同步一份摘要:

字段:日期、关键词数、引擎数、总结果数、去重URL数、平均请求耗时、Top5高频URL

用飞书多维表格比飞书在线表格好用——多维表格支持分组、筛选、视图切换,看历史数据很方便。

影刀操作飞书多维表格的流程:先用「建立表格连接」指令拿到飞书表格对象,再用「写入多维表格」批量同步数据。同步频率设每天一次——每天早上7点跑搜索采集,8点前数据进飞书表格,上班就能看到更新。

九、Google的验证码与反爬

Google对自动化工具比百度敏感得多。你连续搜5个关键词、每次间隔2秒,Google就可能弹"我不是机器人"的reCAPTCHA。

几个能降低触发的做法:

  1. 模拟真实品牌流量:在影刀打开Google前,先设置User-Agent为常见的Chrome浏览器标识。
  2. 随机等待不均匀分布:不是固定的2秒,而是random.uniform(2, 6)——Google的算法能识别固定间隔请求。
  3. 滚动页面模拟浏览:每页结果采集完,用「鼠标滚动」随机滚1-3次——真人看搜索结果会滚动,机器人不会。
  4. 用影刀的浏览器指纹:影刀的网页自动化底层是Chromium,保持浏览器窗口可见(不要最小化),Google对无头浏览器(headless)敏感。

如果触发了reCAPTCHA,流程的应对:

如果页面包含"reCAPTCHA": 等待60秒 # 降频 切换用户代理 重试当前关键词 如果重试3次仍失败: 记录到"失败关键词列表" 继续下一个关键词

十、百度URL的特殊处理

百度搜索结果里的URL不是直链,是http://www.baidu.com/link?url=xxx这种跳转格式。点进去先经过百度统计,再跳转到实际网站。

如果你要的是"实际网址"而不是"百度跳转地址",需要进一步处理:

方案A:用「发送HTTP请求」指令,对百度跳转URL发一个HEAD请求,返回的Location头就是真实URL。

方案B:用网页的data-log属性。百度在每条结果的容器div上塞了data-log属性,里面是JSON格式的日志数据,包含真实URL。用正则从JSON里提取:"mu":"(.+?)"。这个方案不需要发HTTP请求,更快。

推荐方案B。一个正则表达式一次拿到真实URL:

importredefextract_real_url(data_log):match=re.search(r'"mu":"(.+?)"',data_log)returnmatch.group(1)ifmatchelse""

获取data-log属性的方法:影刀→「获取元素信息」→捕获结果容器元素→属性名填data-log→保存到变量。

十一、工程化:配置驱动架构

三平台的XPath配置放在一个独立的配置子流程里。其他子流程通过"读取配置"的方式获取XPath,不硬编码:

子流程 "获取搜索引擎配置"(输入:引擎名称,输出:配置字典) 如果 引擎 == "百度": 返回 {"容器": '//div[contains(@class,"c-container")]', "标题": './/h3//a', ...} 如果 引擎 == "Google": 返回 {"容器": '//div[@class="g"]', "标题": './/h3', ...} 如果 引擎 == "Bing": ...

这个设计的意义:平台的XPath每季度可能变化一次。如果硬编码在采集逻辑里,改一个平台要找到所有使用它的子流程逐个修改。集中配置在一个地方,改一次全流程生效。

十二、常见报错

报错1:“打开网页失败——ERR_CONNECTION_REFUSED”
网络问题或被墙。Google在国内需要科学上网才能访问。流程里检测网络状态——如果打开Google失败,跳过Google,只跑百度和Bing。

报错2:百度"下一页"按钮点击无效
百度在部分地区/浏览器的翻页UI不一样。PC端是"下一页>",移动端UA下可能是页码按钮。检查当前User-Agent是什么,如果是移动端,换成PC端UA重试。

报错3:去重后URL数是0
批量数据抓取拿到的URL字段全是空的——检查XPath是否正确。特别是Google的URL,新版的<a jsname="UWckNb">和旧版的<a href>不在同一个层级。F12→选中标题链接→Copy XPath→对比配置字典的一致性。

报错4:pandas pivot报"ValueError: Index contains duplicate entries"
一个关键词在同一排名位置出现了两个以上URL(多引擎结果混在一起了)。在透视前先分组去重:df.groupby(["关键词", "排名"]).first().reset_index()再透视。

报错5:关键词列表读取后无法搜索
从Excel读出来的关键词前后有空格。如" Python自动化 "带空格,拼到URL里变成wd=+Python%E8%87%AA%E5%8A%A8%E5%8C%96+,百度搜不出结果。strip()先去掉前后的空格。

三个平台的搜索引擎采集跑通后,配合之前讲的电商价格监控和社交内容采集,能把全网信息收口到一个Excel里,作SEO分析、竞品调研、市场趋势判断。更多跨平台采集和自动化案例可参考 home.linyan.cloud


内容标签:搜索引擎采集、Google、Bing、百度、XPath配置、翻页、URL去重、关键词矩阵、SEO分析报告、pandas透视表、浏览器指纹、反爬、飞书多维表格、data-log、配置驱动架构
作者:林焱

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询