You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python+BeautifulSoup实现PHD Comics图片批量下载技术问询

嘿,作为同样啃过《Automate the Boring Stuff》的编程新手过来人,我来帮你搞定这个PHD Comics图片自动下载的脚本!

搞定PHD Comics图片批量下载的Python脚本

首先,你得先装两个必备工具库——requests负责帮我们下载网页和图片,beautifulsoup4用来解析HTML结构。打开终端敲这行命令安装:

pip install requests beautifulsoup4

接下来是完整的代码,我给你加了详细注释,你一看就懂:

import requests
import bs4
import os
import time

# 创建保存漫画的文件夹,不存在就自动创建
os.makedirs('phd_comics', exist_ok=True)

# 初始页面(最新的PHD Comics页面)
current_url = 'https://phdcomics.com/comics.php'

# 循环爬取直到没有上一页(到第一页为止)
while current_url:
    print(f'正在处理页面: {current_url}')
    
    try:
        # 发送请求获取页面内容
        res = requests.get(current_url)
        # 检查请求是否成功,失败就抛出异常
        res.raise_for_status()
    except Exception as e:
        print(f'请求页面失败: {e}')
        break
    
    # 用BeautifulSoup解析HTML
    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    
    # 提取图片链接:优先找OG标签里的图片(更准确),再找页面里的漫画img
    comic_img_url = None
    og_image_meta = soup.find('meta', property='og:image')
    if og_image_meta and 'content' in og_image_meta.attrs:
        comic_img_url = og_image_meta['content']
    else:
        # 找页面里id为comic的img标签
        comic_elem = soup.select('#comic img')
        if comic_elem:
            comic_img_url = comic_elem[0].get('src')
            # 处理相对链接,拼接成完整URL
            if comic_img_url.startswith('/'):
                comic_img_url = 'https://phdcomics.com' + comic_img_url
    
    if comic_img_url:
        print(f'正在下载图片: {comic_img_url}')
        try:
            # 下载图片
            img_res = requests.get(comic_img_url)
            img_res.raise_for_status()
        except Exception as e:
            print(f'下载图片失败: {e}')
            # 继续处理下一页,不中断
            pass
        else:
            # 提取图片文件名
            img_filename = os.path.basename(comic_img_url)
            # 保存图片到文件夹
            with open(os.path.join('phd_comics', img_filename), 'wb') as img_file:
                for chunk in img_res.iter_content(100000):
                    img_file.write(chunk)
    else:
        print('当前页面没找到漫画图片')
    
    # 找上一页的链接:找文本为"Previous"的a标签,或者rel="prev"的标签
    prev_link = soup.find('a', string='Previous') or soup.find('a', rel='prev')
    if prev_link and 'href' in prev_link.attrs:
        # 拼接完整的上一页URL
        prev_url = prev_link['href']
        if not prev_url.startswith('http'):
            current_url = 'https://phdcomics.com' + prev_url
        else:
            current_url = prev_url
        # 加个1秒延迟,避免给服务器太大压力
        time.sleep(1)
    else:
        # 没有上一页了,结束循环
        print('已经爬到第一页啦,任务完成!')
        current_url = None

小提示

  • 脚本里加了time.sleep(1),是为了每次请求后停1秒,避免频繁请求被网站封禁,这是爬取网页的基本礼貌哦~
  • 如果运行时遇到某个页面失败,脚本会跳过继续处理下一页,不会直接崩溃
  • 下载的图片都会存在你当前脚本目录下的phd_comics文件夹里

内容的提问来源于stack exchange,提问作者Muhsiul Hassan

火山引擎 最新活动