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

脚本无法获取列表条目及修改AtBS的xkcd项目下载SMBC漫画求助

问题分析与解决方案

嘿,我来帮你拆解下这两个问题,先从你提到的“脚本无法从列表获取条目”说起,然后再修正你的SMBC漫画下载脚本。

一、脚本无法获取条目的常见原因

结合你给的代码片段,大概率是这几个问题导致的:

  • DOM选择器不匹配:原《Automate the Boring Stuff》里的xkcd项目用的是xkcd网站的元素选择器,但SMBC的页面结构完全不同,直接套用肯定找不到漫画元素
  • 路径转义错误:你写的os.chdir('C:\Users\Bob\Desktop\')里的反斜杠是Python的转义字符,实际解析出来的路径会出错,导致后续保存或读取操作失败,看起来像是没获取到条目
  • 请求未做错误检查:如果网络波动或者网站有反爬限制,请求失败后你没做处理,页面没下载成功自然解析不到任何内容
  • 循环逻辑受限:你用for noAbuse in range(0, 5)只循环5次,最多只能下载5个页面,远达不到“下载所有漫画”的需求

二、修正后的SMBC漫画下载脚本

我把你的脚本补全并修正了所有问题,注释里标了每个改动的原因:

#! python3
# getwebcomic.py - 下载所有SMBC漫画。
import requests
import os
import bs4

# 用原始字符串定义Windows路径,避免反斜杠转义问题
desktop_path = r'C:\Users\Bob\Desktop'
os.chdir(desktop_path)

url = 'https://smbc-comics.com'  # 起始URL(最新漫画页面)
os.makedirs('smbc', exist_ok=True)  # 创建存储目录,已存在则不报错

# 循环遍历所有漫画页面,直到没有上一页链接为止
while not url.endswith('#'):
    # 下载页面并检查请求是否成功
    print(f'Downloading page {url}...')
    res = requests.get(url)
    # 如果请求失败(比如404、500),直接抛出异常提示
    res.raise_for_status()
    
    # 用BeautifulSoup解析页面内容
    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    
    # 定位SMBC的漫画图片:SMBC的漫画img标签固定带有class="comic"
    comic_elem = soup.select('img.comic')
    if comic_elem == []:
        print(f'Warning: Could not find comic image on page {url}')
    else:
        comic_url = comic_elem[0].get('src')
        # 处理相对URL:如果图片链接是相对路径,补全域名
        if not comic_url.startswith('http'):
            comic_url = 'https://smbc-comics.com' + comic_url
        
        # 下载漫画图片
        print(f'Downloading comic file: {os.path.basename(comic_url)}...')
        res_img = requests.get(comic_url)
        res_img.raise_for_status()
        
        # 将图片写入本地文件
        with open(os.path.join('smbc', os.path.basename(comic_url)), 'wb') as image_file:
            for chunk in res_img.iter_content(100000):
                image_file.write(chunk)
    
    # 获取上一页(旧漫画)的链接:SMBC的上一页按钮带有class="navlink prev"
    prev_link = soup.select('a.navlink.prev')
    if prev_link == []:
        # 没有更多上一页,退出循环
        print('No more pages to download.')
        break
    # 补全上一页的完整URL
    url = 'https://smbc-comics.com' + prev_link[0].get('href')

print('All comics downloaded successfully!')

关键改动说明:

  1. 路径修复:用原始字符串r''定义Windows路径,彻底解决转义问题
  2. 循环逻辑优化:把for循环改成while循环,自动遍历所有页面直到没有旧漫画
  3. 错误检查:添加res.raise_for_status(),请求失败时直接报错,方便你排查问题
  4. 元素定位修正:针对SMBC的页面结构,用img.comic定位漫画图片,a.navlink.prev定位上一页链接
  5. 相对URL处理:避免因图片链接是相对路径导致下载失败
  6. 文件操作优化:用with语句自动管理文件句柄,更安全规范

如果运行时还是遇到“无法获取条目”的问题,可以打开SMBC的页面,右键检查漫画元素,确认选择器是否匹配——网站偶尔会更新页面结构,届时只需要调整select()里的参数就行。

内容的提问来源于stack exchange,提问作者Bob Glidewell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:13:42