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

Python爬虫抓取网页链接内图片:代码无输出问题求助

问题分析与修复方案

原代码的核心问题

  • 相对链接未转换为绝对链接:页面中抓取的href大多是相对路径(比如/title/tt0111161/),url_validator会判定这类链接无效,直接跳过,导致没有进入图片抓取逻辑。
  • 循环逻辑错误:在遍历前3个链接的循环里,每次添加一个链接后立刻遍历整个links列表,会重复处理之前的链接,且逻辑混乱。
  • 图片抓取函数提前返回:crawl_images里循环到第一个图片就return,只会输出第一个图片的地址,后续图片都被忽略。
  • 缺乏异常处理:请求网页时如果遇到网络错误、链接失效,程序会直接崩溃,没有容错机制。
  • URL拼接不严谨:硬编码拼接https://www.,如果用户输入的是带https://的网址(比如https://imdb.com),会生成错误的URL。

修正后的代码

from bs4 import BeautifulSoup
import requests as rq
import sys
from urllib.parse import urlparse, urljoin

def is_valid_url(link):
    try:
        result = urlparse(link)
        return all([result.scheme, result.netloc])
    except:
        return False

def crawl_images(page_url):
    try:
        response = rq.get(page_url, timeout=10)
        response.raise_for_status()  # 抛出HTTP错误
        soup = BeautifulSoup(response.text, "html.parser")
        for img in soup.select('img'):
            img_src = img.get('src')
            if img_src:
                # 处理图片的相对路径
                full_img_url = urljoin(page_url, img_src)
                print(full_img_url)
    except Exception as e:
        print(f"请求 {page_url} 失败: {str(e)}")

def main():
    if len(sys.argv) != 3:
        print("用法: python3 new_crawler.py <目标网址> <抓取链接数量>")
        sys.exit(1)
    
    base_url = sys.argv[1]
    depth = int(sys.argv[2])

    # 处理基础URL,确保是完整格式
    if not base_url.startswith(('http://', 'https://')):
        base_url = f'https://{base_url}'
    # 确保URL结尾有/,避免urljoin出错
    if not base_url.endswith('/'):
        base_url += '/'

    try:
        response = rq.get(base_url, timeout=10)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, "html.parser")
    except Exception as e:
        print(f"请求主站 {base_url} 失败: {str(e)}")
        sys.exit(1)

    # 抓取前depth个有效绝对链接(去重)
    processed_links = set()
    for a_tag in soup.select('a'):
        if len(processed_links) >= depth:
            break
        href = a_tag.get('href')
        if not href:
            continue
        # 转换为绝对链接
        full_link = urljoin(base_url, href)
        if is_valid_url(full_link) and full_link not in processed_links:
            processed_links.add(full_link)
    
    # 遍历每个链接抓取图片
    for link in processed_links:
        print(f"===== 正在抓取 {link} 的图片 =====")
        crawl_images(link)

if __name__ == "__main__":
    main()

关键改动说明

  • 相对链接转绝对链接:使用urljoin把页面中的相对路径转换为完整的绝对URL,确保is_valid_url能正确识别。
  • 重构循环逻辑:先收集前N个不重复的有效链接,再统一遍历抓取图片,避免重复处理。
  • 移除提前返回:crawl_images中遍历所有图片,不再中途返回,确保输出所有图片地址。
  • 添加异常处理:对每个请求添加try-except,捕获网络错误、HTTP错误等,避免程序崩溃,同时输出错误信息便于排查。
  • 严谨的URL处理:自动补全http://或https://,处理URL结尾的斜杠,避免拼接错误。
  • 去重机制:用集合存储链接,避免重复抓取同一个页面。

执行命令python3 new_crawler.py imdb.com 3后,会输出前3个有效链接中所有图片的完整地址。

内容的提问来源于stack exchange,提问作者Mike D Hovhannisyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:45:37