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
相关产品推荐
相关产品推荐

