Python爬取JSON接口报str must be integer错误排查
问题根因
抛出str must be integer类型错误的核心原因有2个:
- 你存入
productlinks列表的全是拼接好的字符串类型URL,全程没有对这些URL发起HTTP请求拿到响应数据,遍历时直接对字符串类型的link变量做['_embedded']键索引——Python中字符串仅支持整数下标做切片访问,传入字符串作为索引就会触发该报错。 - 字段取值逻辑顺序完全错误:
.json()是requests响应对象的解析方法,需要先拿到接口响应、解析为JSON字典之后才能逐层取键值,不是取完字段再调用json方法。
另外还有两个隐性问题会导致后续爬取失败:
- 传给Algolia接口的
data参数带了多余的HTML转义字符("这类),实际应该传原生JSON格式字符串,否则接口会返回参数错误。 - Reedexpo的参展商详情接口不能直接复用Algolia搜索的请求头,需要调整
accept、referer等字段,否则会被拦截返回403。
修正后可运行代码
import requests import json # 统一请求头,适配两个接口的校验规则 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'accept': 'application/json', 'Referer': 'https://www.nationalhardwareshow.com/' } base_url = 'https://api.reedexpo.com/v1/organisations/' # Algolia接口认证参数 algolia_params = { 'x-algolia-agent': 'Algolia for vanilla JavaScript 3.27.1', 'x-algolia-application-id': 'XD0U5M6Y4R', 'x-algolia-api-key': 'd5cd7d4ec26134ff4a34d736a7f9ad47', } # 去掉多余转义的请求体,可自行修改page参数翻页 algolia_data = json.dumps({ "params": "query=&page=0&facetFilters=&optionalFilters=[]" }) # 1. 请求搜索接口获取参展商列表 search_resp = requests.post( 'https://xd0u5m6y4r-3.algolianet.com/1/indexes/event-edition-eve-e6b1ae25-5b9f-457b-83b3-335667332366_en-us/query', params=algolia_params, headers=headers, data=algolia_data ).json() productlinks = [] for item in search_resp['hits']: detail_url = f"{base_url}{item['organisationGuid']}/exhibiting-organisations?eventEditionId={item['eventEditionExternalId']}" productlinks.append(detail_url) # 2. 遍历详情URL,提取公司名称 for link in productlinks: # 先发起请求,将响应解析为JSON字典 detail_resp = requests.get(link, headers=headers).json() # _embedded字段是数组类型,取第一个元素才是展商信息 company_name = detail_resp['_embedded'][0]['companyName'] print(company_name)
注意事项
- 上述代码默认只爬取第1页的参展商,如果要爬全量数据,循环修改
algolia_data里的page参数即可,直到接口返回的hits为空就停止。 - 如果请求频率过高被拦截,可以在每次请求后加1-2秒的延时,降低被封的概率。
- 详情接口返回的展商信息字段很多,除了公司名称,还可以按需提取展位号、联系方式、公司介绍等字段。
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

