循环中调用requests.get()报错:No connection adapters found
解决requests循环中"No connection adapters found"错误
嘿,这个问题我一眼就看穿啦!你遇到的InvalidSchema: No connection adapters were found错误,根源非常明确——你给requests.get()传了一个列表,而不是它需要的单个字符串URL。
错误原因分析
看你循环里的这段代码:
start_urls = [olx_url % n_paginas] r = requests.get(start_urls)
你把格式化好的URL放进了一个列表start_urls里,然后直接把这个列表传给了requests.get()。但requests的get()方法要求第一个参数必须是字符串类型的URL,它根本不知道怎么处理一个列表形式的“URL”,所以才会抛出找不到连接适配器的错误。
而且你单独运行的时候传的是字符串URL,所以没问题;循环里传了列表,就出错了。
修正后的完整代码
我帮你把代码修正了,还顺便优化了一些细节:
%%time import requests from pandas import json_normalize import pandas as pd all_urls = pd.DataFrame() # 直接遍历1到20页,省去额外的计数变量,逻辑更清晰 for page_num in range(1, 21): # 定义URL模板 olx_url = 'https://www.olx.com.gt/api/relevance/search?category=367&facet_limit=100&location=4168811&location_facet_limit=20&page=%s&sorting=desc-creation&user=16c20011d0fx61aada41' # 直接生成字符串URL,不要包装成列表 current_url = olx_url % page_num # 发送请求(现在传的是正确的字符串URL) r = requests.get(current_url) # 解析JSON并转换为DataFrame json_data = r.json() json_data_2 = json_data['data'] df = json_normalize(json_data_2) # 注意:DataFrame.append返回新对象,需要赋值回去,同时用ignore_index避免索引重复 all_urls = all_urls.append(df, ignore_index=True)
额外的几个注意点
- 别用列表包装单个URL:如果每次循环只处理一个页面,直接用格式化后的字符串即可,不需要放到列表里。
- 修正拼写错误:你原来的代码里写的是
all_urls.apped(df),这里apped是拼写错误,应该改成append。 - 正确使用DataFrame.append:这个方法不会修改原DataFrame,而是返回一个新的对象,所以必须把结果赋值回
all_urls;加上ignore_index=True可以避免不同页面的索引重复问题。 - 优化循环逻辑:原来的
n_paginas计数变量完全可以省去,直接用range(1,21)就能遍历1到20页,代码更简洁。
内容的提问来源于stack exchange,提问作者Eduardo Martinez




