使用Python requests模块通过许可证号获取网页电话号码遇权限问题求助
问题描述
我用Python的requests模块编写了脚本,试图从指定网页通过许可证号354206获取对应电话号码,期望返回含目标号码的JSON响应。手动搜索该许可证号可正常得到带电话号码的结果,但脚本执行后返回状态码200及如下报错:
200
{'event': {'descriptor': 'markup://aura:invalidSession', 'attributes': {'values': {}}, 'eventDef': {'descriptor': 'markup://aura:invalidSession', 't': 'APPLICATION', 'xs': 'I', 'a': {'newToken': ['newToken', 'aura://String', 'I', False]}}}, 'exceptionMessage': 'Guest user access is not allowed', 'exceptionEvent': True}
原脚本代码如下:
import requests import json link = 'https://azroc.my.site.com/AZRoc/s/sfsites/aura' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', 'Referer': 'https://azroc.my.site.com/AZRoc/s/contractor-search', 'Origin': 'https://azroc.my.site.com', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept-Language': 'en-US,en;q=0.9', 'X-Sfdc-Page-Scope-Id': 'dd1f6a24-3e7b-41e9-8fcb-f0bda9979cc2', 'X-Sfdc-Request-Id': '13815039000012b044', } params = { 'r': '5', 'other.ARCP_ContractorSearch.getRecords': '1' } payload = { 'message': '{"actions":[{"id":"176;a","descriptor":"apex://ARCP_ContractorSearch/ACTION$getRecords","callingDescriptor":"markup://c:ARCP_ContractorSearch","params":{"searchKey":"354206","classification":null,"city":""}}]}', 'aura.context': '{"mode":"PROD","fwuid":"eGx3MHlRT1lEMUpQaWVxbGRUM1h0Z2hZX25NdHFVdGpDN3BnWlROY1ZGT3cyNTAuOC40LTYuNC41","app":"siteforce:communityApp","loaded":{"APPLICATION@markup://siteforce:communityApp":"wi0I2YUoyrm6Lo80fhxdzA","MODULE@markup://lightning:f6Controller":"5PtsAUCMnPdpZDcNTHXtbg","COMPONENT@markup://instrumentation:o11ySecondaryLoader":"1JitVv-ZC5qlK6HkuofJqQ"},"dn":[],"globals":{},"uad":false}', 'aura.pageURI': '/AZRoc/s/contractor-search', 'aura.token': 'null', } with requests.Session() as session: session.headers.update(headers) res = session.post(link,params=params,data=json.dumps(payload)) print(res.status_code) print(res.json())
请问如何修改脚本,才能通过requests模块实现通过许可证号获取目标网页的电话号码?
解决方案
报错Guest user access is not allowed说明Salesforce的Aura框架拒绝了未通过验证的请求,需模拟浏览器完整会话流程,而非直接发送硬编码参数。以下是修改思路和代码:
- 先访问搜索页面获取动态会话参数:硬编码的
X-Sfdc-Page-Scope-Id、fwuid、aura.token等参数与会话绑定,不能复用。需先GET访问搜索页面,从页面源码提取这些动态生成的参数。 - 正确构造请求Payload:原Payload中的HTML实体编码(
")无需保留,直接用标准JSON格式字符串即可,避免编码混乱。 - 保持会话一致性:用同一个Session对象处理所有请求,确保Cookie和会话状态延续。
修改后的脚本示例:
import requests import re import json # 初始化会话 session = requests.Session() search_url = "https://azroc.my.site.com/AZRoc/s/contractor-search" aura_url = "https://azroc.my.site.com/AZRoc/s/sfsites/aura" # 第一步:访问搜索页面,提取必要的Aura参数和会话Cookie base_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' } response = session.get(search_url, headers=base_headers) response.raise_for_status() # 从页面源码提取动态参数 fwuid_match = re.search(r'"fwuid":"([^"]+)"', response.text) page_scope_id_match = re.search(r'"X-Sfdc-Page-Scope-Id":"([^"]+)"', response.text) aura_token_match = re.search(r'"auraToken":"([^"]+)"', response.text) if not all([fwuid_match, page_scope_id_match, aura_token_match]): raise ValueError("无法从页面提取必要的Aura参数") fwuid = fwuid_match.group(1) page_scope_id = page_scope_id_match.group(1) aura_token = aura_token_match.group(1) # 第二步:构造Aura请求的Headers和Payload request_headers = base_headers.copy() request_headers.update({ 'Referer': search_url, 'Origin': 'https://azroc.my.site.com', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9', 'X-Sfdc-Page-Scope-Id': page_scope_id, 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }) params = { 'r': '5', 'other.ARCP_ContractorSearch.getRecords': '1' } payload = { 'message': json.dumps([{ "id": "1;a", "descriptor": "apex://ARCP_ContractorSearch/ACTION$getRecords", "callingDescriptor": "markup://c:ARCP_ContractorSearch", "params": { "searchKey": "354206", "classification": None, "city": "" } }]), 'aura.context': json.dumps({ "mode": "PROD", "fwuid": fwuid, "app": "siteforce:communityApp", "loaded": {}, "dn": [], "globals": {}, "uad": False }), 'aura.pageURI': '/AZRoc/s/contractor-search', 'aura.token': aura_token } # 第三步:发送POST请求并解析响应 response = session.post(aura_url, params=params, data=payload, headers=request_headers) response.raise_for_status() data = response.json() print(response.status_code) print(json.dumps(data, indent=2)) # 提取电话号码(根据实际响应结构调整) if 'actions' in data and data['actions']: result = data['actions'][0].get('returnValue', {}) records = result.get('records', []) if records: phone = records[0].get('Phone') if phone: print(f"提取到电话号码: {phone}")
关键说明
- 先访问搜索页面动态提取会话参数,这些参数是Salesforce生成的会话标识,每次会话都会变化,硬编码无法通过验证。
- Payload用
json.dumps生成标准JSON字符串,避免原脚本的HTML实体编码问题。 - 保持会话Cookie一致性,确保请求被识别为合法用户会话而非孤立请求。
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

