脚本无法获取列表条目及修改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!')
关键改动说明:
- 路径修复:用原始字符串
r''定义Windows路径,彻底解决转义问题 - 循环逻辑优化:把
for循环改成while循环,自动遍历所有页面直到没有旧漫画 - 错误检查:添加
res.raise_for_status(),请求失败时直接报错,方便你排查问题 - 元素定位修正:针对SMBC的页面结构,用
img.comic定位漫画图片,a.navlink.prev定位上一页链接 - 相对URL处理:避免因图片链接是相对路径导致下载失败
- 文件操作优化:用
with语句自动管理文件句柄,更安全规范
如果运行时还是遇到“无法获取条目”的问题,可以打开SMBC的页面,右键检查漫画元素,确认选择器是否匹配——网站偶尔会更新页面结构,届时只需要调整select()里的参数就行。
内容的提问来源于stack exchange,提问作者Bob Glidewell
相关产品推荐
相关产品推荐

