观察SERP特征而不与自然排名混合
Expert Network Defense Engineer
TL;DR:
- SERP功能分析需要单独的测量单位。 有机位置、知识图谱字段、广告和相关搜索观察不应合并为一个排名列表。
- 在编写模块适配器之前,盘点实际响应。 顶层JSON字段并不自动是可见的搜索功能,缺失的字段并不能证明在页面上不存在。
- 每次测量都保持状态。 待收集、未映射字段、空值、空容器和观察值应有独立记录。
一个将有机链接、知识面板和广告放在一个排名列表中的报告失去了其包含的每个位置的意义。这些元素承担不同的角色,它们的数据可能具有不同的形状。将它们一起计算可能会创建一个整洁的电子表格,同时让比较变得更难以解释。
Scrapeless Google Search API 提供了支持SERP功能分析的结构化搜索数据。第一个实现任务是检查一个完整的响应实际上包含了什么。该指南构建了一个本地字段清单,然后解释如何在不改变有机排名含义的情况下映射经过验证的模块。
为每个观察定义单位
从报告应回答的问题开始。有机URL的存在询问在收集的有机数组中出现了哪些网络链接。知识图谱观察询问提供了什么结构化的实体信息。广告观察询问的是关于一个单独识别的付费搜索元素。
给每个问题其自己的记录类型和分母。数组项的序号是来源顺序。返回的有机位置属于有机结果架构。没有经过单独验证的映射,它们不能被重用于广告的位置或面板的视觉位置。
保持查询、完整请求、观察时间和收集状态在这些记录中是共同的。这样的共享上下文使分析师能够比较来自同一运行的模块,而不必将它们扁平化为一个单一单位。
相关搜索建议,在通过经过验证的字段可用时,属于查询探索。它们不是排名的有机页面。存储它们自己的观察文本和来源,而不是在最后一个网络链接后分配下一个有机位置。
前提条件和文档响应形状
使用Python和保存的JSON捕获进行本地清单。外部 request, http_status, response, run_id, 和 received_at 字段是收集者元数据。代码不会发送请求或建立账户级别的功能覆盖。
Google搜索请求工作流程 记录了参与者 scraper.google.search, POST https://api.scrapeless.com/api/v1/scraper/request, 和 x-api-token 标头。实时收集需要您的账户密钥。 Google搜索参数 解释了每个观察应伴随的搜索上下文。
当前的快速入门示例包括一个 organic_results 数组、一个 knowledge_graph 对象和一个 local_results 对象。它还包含 metadata 和 pagination 等非模块信息。这些是文档示例,而不是为本文收集的结果。
注意: 此处未运行经过身份验证的API请求。本地清单是在合成捕获上进行测试的。广告和相关搜索适配器故意保持未配置状态,因为此快速入门示例并未建立它们的字段名称或完整的响应合同。在收集之前,请根据当前文档和实际账户输出验证这些映射。
将传输结果与字段状态分开
在检查模块内容之前,检查HTTP结果。HTTP 201表示待处理任务;HTTP 200携带任务数据。待处理的响应不应产生“所有特征缺失”的观察。
在完成的响应中,保留缺失键、空值、空数组和空对象之间的差异。JSON值类型 使这些区别变得明确。您的分析模型应在经过验证的适配器分配更窄的含义之前保留这些区别。
一个空对象可能是结构占位符。非空对象可能仅包含空的嵌套值。无论哪种情况都不能确定某人是否在呈现页面上看到了有用的知识面板。下面的清单报告了JSON结构;模块特定的适配器必须检查相关的嵌套字段。
运行本地字段清单
将程序保存为module_inventory.py并运行python3 module_inventory.py capture.json。它打印出派生的清单并保持输入文件不变。Python的JSON解析器和序列化器使用标准库函数处理输入和输出。
python
import argparse
import json
from pathlib import Path
def inventory(record):
if not isinstance(record, dict):
raise ValueError('Capture must be an object')
status, payload = record.get('http_status'), record.get('response')
base = {'run_id': record.get('run_id'), 'request': record.get('request'),
'received_at': record.get('received_at'), 'fields': []}
if status == 201:
return dict(base, state='pending')
if status != 200:
return dict(base, state='transport_error' if status is None else 'http_error')
if not isinstance(payload, dict):
return dict(base, state='unmapped')
fields = []
for key, value in payload.items():
if value is None:
kind, state, size = 'null', 'null', None
elif isinstance(value, list):
kind, state, size = 'array', 'nonempty' if value else 'empty', len(value)
elif isinstance(value, dict):
kind, state, size = 'object', 'nonempty' if value else 'empty', len(value)
else:
kind = 'boolean' if isinstance(value, bool) else ('string' if isinstance(value, str) else 'number')
state, size = 'scalar', None
fields.append({'key': key, 'json_type': kind, 'field_state': state, 'size': size})
return dict(base, state='inventoried', fields=fields)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('capture')
args = parser.parse_args()
print(json.dumps(inventory(json.loads(Path(args.capture).read_text(encoding='utf-8'))),
ensure_ascii=False, indent=2))
对于数组,size是数组元素的数量。对于对象,它是直接键的数量。这不是结果计数、面板计数或可见内容的度量。在此应用程序架构中,标量和空值没有大小。
缺失的键不会出现在此原始清单中。仅在您已建立所选查询表面的响应合同时,将清单与明确的期望字段列表进行比较。否则,猜测的列表可能制造出明显缺失的特征。
开始使用Scrapeless抓取
使用Scrapeless提升您的网络抓取和自动化工作流程!
今天注册并获得5美元的免费信用— 无需信用卡。立即在Scrapeless仪表板中领取您的免费信用。
将经过验证的字段映射到单独的数据集
创建一个包含运行参考、项目序号、返回位置、URL、标题和可用摘要的有机数据集。在解释其行数之前验证有机数组的形状。在原始捕获中保留不支持的值,并标记映射问题。
对于知识图谱数据集,存储原始对象参考和单独验证的字段。示例响应的对象形状是检查的起点,而不是每个实体属性总是被填充的承诺。避免仅从键的存在派生的布尔值panel_present。
广告数据集和相关搜索数据集可以保留在您的应用设计中,但在字段名称、形状和状态语义得到验证之前,请保持它们的适配器禁用。禁用的适配器应报告not_configured,而不是零观察。该标签描述的是您的应用程序,而不是API支持。
在派生记录旁边保留架构版本和适配器版本。如果字段发生更改,原始捕获仍可用于新的映射。JSON Schema对象模型可以帮助规范所需和可选属性,而不将每个缺失的可选属性视为集合失败。
在不同运行之间进行类似比较
比较需要匹配的查询范围、国家、语言和集合规则。故意的更改应记录在报告中。国家变化可以改变搜索上下文;不应该被误认为是由您网站造成的特征变化。
仅在相同定义的有机观察方法内比较有机位置。在相同适配器版本和经过验证的字段语义中比较模块状态。当映射器更改时,要么重新处理两个捕获,要么说明记录不能直接比较。
将样本大小与集合覆盖划分开来。待处理的运行不会加入模块存在率的分母。一个未映射的字段可能需要一个单独的未知类别。解释分母,以便您的团队计算的百分比有可检查的含义。
保留与上一个运行、当前运行、原始字段值、映射器版本和审查结果相关的更改证据。来源模型对于将观察与创建报告的转换分开非常有用。
审查数据无法确定的内容
JSON响应并不会自动建立像素定位、视口可见性或特征占用了多少屏幕空间。这些问题需要单独捕获和验证的视觉方法。不要将字段顺序描述为屏幕截图坐标。
同样,模块观察并不能证明点击、访问、转换或曝光计数。将这些业务结果保留在自己的数据源中。搜索特征可以与研究问题相关,而不必成为每个下游结果的代理。
在写警报之前检查意外状态。一个空字段、禁用的适配器或更改的响应形状应导致数据审查。只有可比较的、经过解释的观察才能支持一个特征在收集样本内发生变化的说法。
结论
对响应进行清单,验证每个模块的合同,并将自然排名与其他搜索功能分开存储。显式字段状态和适配器版本使得生成的报告更易于审查,并防止缺失数据变成虚构的特征趋势。
在决定哪些搜索体验值得进一步的编辑研究时,将审核过的模块观察作为内容差距分析的一个输入。
构建您的下一个搜索观察
使用Scrapeless Google Search API收集该工作流程的搜索证据。在规划您的收集预算时,请查看Scrapeless 定价,并在您的请求配置旁边保留Google 搜索参数。
常见问题
问:knowledge_graph键是否证明一个填充面板出现?
不。检查值和经过验证的嵌套字段。键的存在和可见的填充内容是不同的声明。
问:广告可以在一个排名列表的自然结果后附加吗?
那将混合测量单位。保留单独的数据集,仅使用其含义由相关模式建立的位置。
问:清单是否计数搜索功能?
不。它记录顶级 JSON 类型和容器大小。特征特定的含义需要经过验证的适配器。
问:省略字段意味着什么?
这意味着键在捕获的对象中缺失。它本身并不建立相应特征在渲染的搜索页面上缺失的事实。
问:样本中是否实施了广告和相关搜索?
不。它们的适配器仍未配置,待验证适当字段和实际帐户输出。该文章并未虚构这些映射。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



