Python网页爬取问题:按类别爬取小说时无法获取名称及URL
问题排查与修正方案
我帮你梳理下代码里的几个关键错误,然后给出修正后的实现:
原代码的核心问题
分类URL拼接错误
你原来用site + "category/" + link.text生成分类链接,但实际上link['href']已经包含了完整的分类路径(比如/category/action),用分类名称(比如Action)拼接会导致URL格式错误,无法正确访问分类页面。解析时用错了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
相关产品推荐
相关产品推荐

