Python中Invalid Schema错误排查:网页爬取代码报错求助
问题分析与修复方案
咱们先拆解你遇到的问题,一步步解决:
核心错误原因
你调用 text = get_text(ls) 时,ls 是所有链接组成的列表,但你的 get_text 函数直接把这个列表传给了 requests.get()——而 requests.get() 需要的是单个字符串格式的URL,不是列表。这就导致requests把整个列表当成了一个“URL”,自然找不到对应的连接适配器,抛出 InvalidSchema 错误。
其他隐藏问题
除了这个核心错误,你的代码还有几个需要修正的细节:
get_list函数循环无效:你写了循环遍历262页,但URL里的page=1是固定的,format(i)位置放错了,应该把占位符{0}放在page=后面。而且循环里每次生成的soup都被覆盖,最后只返回最后一页的结果,根本没收集所有页面的链接。- 误用Python内置关键字:你用
list作为变量名,这会覆盖Python的内置list()函数,可能导致后续代码出现奇怪问题,建议改成link_list这类名称。 - 未过滤无效链接:
get_link收集的href里包含大量无效内容,比如#、导航栏链接、相对路径等,这些链接要么无法访问,要么不是你要爬取的帖子页面。
修复后的代码示例
import requests from bs4 import BeautifulSoup # 获取所有页面的有效帖子链接 def get_all_post_links(base_url, total_pages): all_links = [] for page_num in range(1, total_pages + 1): # 正确格式化页码到URL中 url = base_url.format(page_num) response = requests.get(url) response.raise_for_status() # 捕获请求失败的情况 my_soup = BeautifulSoup(response.content, "html.parser") # 只提取帖子的链接(过滤导航、无效链接) post_links = my_soup.body.select("a[href^='/talk/']") for link in post_links: href = link.get('href') # 补全完整域名,避免相对路径问题 full_url = f"http://pann.nate.com{href}" # 去重,避免重复链接 if full_url not in all_links: all_links.append(full_url) return all_links # 爬取单个帖子的内容 def get_post_content(post_url): try: response = requests.get(post_url) response.raise_for_status() soup = BeautifulSoup(response.content, "html.parser") text = soup.select_one("#contentArea").text.strip() return text except Exception as e: print(f"爬取 {post_url} 失败: {str(e)}") return None # 主执行流程 if __name__ == "__main__": # 基础URL,预留页码占位符 base_url = "http://pann.nate.com/search/talk?searchType=A&q=%EB%AF%B8%EC%84%B8%EB%A8%BC%EC%A7%80&page={0}" total_pages = 262 # 获取所有有效帖子链接 post_links = get_all_post_links(base_url, total_pages) # 遍历所有链接,批量爬取内容 all_contents = [] for link in post_links: content = get_post_content(link) if content: all_contents.append(content) # 可在这里处理爬取到的内容,比如保存到文件 print(f"共爬取到 {len(all_contents)} 篇帖子内容")
修复说明
- 修正URL格式化:把页码占位符放在
page=后面,确保循环能遍历所有目标页面。 - 过滤有效链接:通过
a[href^='/talk/']选择器精准提取帖子链接,补全域名解决相对路径问题,同时做去重处理。 - 单链接爬取逻辑:
get_post_content只接收单个URL,主流程遍历所有链接逐个调用,避免了把列表传给requests的错误。 - 增加异常处理:捕获请求失败的情况,避免单个链接爬取失败导致整个程序崩溃。
- 避免关键字冲突:改用
post_links、all_contents等变量名,不再使用list这类内置关键字。
内容的提问来源于stack exchange,提问作者Sunghee Kim
相关产品推荐
相关产品推荐

