You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)} 篇帖子内容")

修复说明

  1. 修正URL格式化:把页码占位符放在 page= 后面,确保循环能遍历所有目标页面。
  2. 过滤有效链接:通过 a[href^='/talk/'] 选择器精准提取帖子链接,补全域名解决相对路径问题,同时做去重处理。
  3. 单链接爬取逻辑:get_post_content 只接收单个URL,主流程遍历所有链接逐个调用,避免了把列表传给requests的错误。
  4. 增加异常处理:捕获请求失败的情况,避免单个链接爬取失败导致整个程序崩溃。
  5. 避免关键字冲突:改用 post_links、all_contents 等变量名,不再使用 list 这类内置关键字。

内容的提问来源于stack exchange,提问作者Sunghee Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:44:00