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

Python网页爬取问题:按类别爬取小说时无法获取名称及URL

问题排查与修正方案

我帮你梳理下代码里的几个关键错误,然后给出修正后的实现:

原代码的核心问题

  1. 分类URL拼接错误
    你原来用site + "category/" + link.text生成分类链接,但实际上link['href']已经包含了完整的分类路径(比如/category/action),用分类名称(比如Action)拼接会导致URL格式错误,无法正确访问分类页面。

  2. 解析时用错了Soup对象
    遍历分类页面时,你依然在使用首页的soup对象,而且headline并不是页面里的HTML标签——分类页的小说标题其实是放在<h4 class="novel-title">下的<a>元素里的。

修正后的代码

from requests import get
from bs4 import BeautifulSoup
import re
import time  # 用于添加延时,避免反爬

site = "https://readlightnovel.org/"
# 统一请求头,避免重复编写
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}

# 第一步:获取所有分类的正确URL
r = get(site, headers=headers)
soup = BeautifulSoup(r.content, "lxml")
all_categories = []

# 匹配/category/开头的有效分类链接
for link in soup.find_all(href=re.compile(r'^/category/\w+$')):
    # 直接拼接site和href,确保URL正确
    category_url = site + link['href'].lstrip('/')
    all_categories.append(category_url)

# 第二步:遍历分类页面,抓取小说名称与链接
for category_url in all_categories:
    print(f"\n=== 正在爬取分类页面: {category_url} ===")
    r = get(category_url, headers=headers)
    soup2 = BeautifulSoup(r.content, "lxml")
    
    # 定位所有小说标题的容器
    novel_containers = soup2.find_all("h4", class_="novel-title")
    for container in novel_containers:
        novel_link = container.find("a")
        if novel_link:
            # 提取小说名称(去除多余空格)
            novel_name = novel_link.get_text(strip=True)
            # 拼接小说的完整URL
            novel_url = site + novel_link['href'].lstrip('/')
            print(f"小说名称: {novel_name} | 链接: {novel_url}")
    
    # 添加1秒延时,避免请求过于频繁触发反爬
    time.sleep(1)

额外注意事项

  • 网站可能存在反爬机制,建议保留time.sleep()的延时逻辑,或者根据情况调整时长;
  • 如果分类页面有分页(比如"下一页"按钮),你还需要添加分页遍历的逻辑,才能抓取该分类下的所有小说;
  • 网页结构可能会随时间变化,如果后续出现抓取失效,记得重新检查页面的HTML标签结构,调整解析规则。

内容的提问来源于stack exchange,提问作者Faheem Akhtar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:37:37