为何我的网页爬虫仅抓取5张图片后就返回错误?
解决OLX.ro iPhone13列表页图片下载不全问题
问题原因
- OLX采用图片懒加载机制,大部分图片的真实地址不在
src属性中,而是存储在data-src或data-lazy属性里,你当前仅读取src,只能获取到页面初始加载的少量图片(即成功下载的5张)。 - 直接使用
urllib.request发起请求未携带浏览器请求头,容易被网站反爬机制拦截,导致请求失败。 - 异常处理过于宽泛,直接
pass无法定位具体错误,不利于问题排查。
修改后的代码
import requests from bs4 import BeautifulSoup import os # 创建图片保存目录 save_dir = "olx_iphone13_images" if not os.path.exists(save_dir): os.makedirs(save_dir) url = "https://www.olx.ro/d/oferte/q-iphone-13/" # 模拟浏览器请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 发送请求获取页面内容 response = requests.get(url, headers=headers) response.encoding = 'utf-8' page_soup = BeautifulSoup(response.text, 'html.parser') # 定位包含图片的容器元素 image_containers = page_soup.find_all('div', class_="css-19ucd76") i = 1 for container in image_containers: try: img_tag = container.find('img') # 优先读取懒加载的真实图片地址,无则回退到src img_src = img_tag.get('data-src') or img_tag.get('src') # 跳过无有效图片的情况 if not img_src or '/app/static/media/no_thumbnail' in img_src: print(f"跳过无效图片容器 {i}") i += 1 continue # 补全相对地址为完整URL if not img_src.startswith('http'): img_src = f"https://www.olx.ro{img_src}" print(f"正在下载: {img_src}") # 请求图片资源,携带请求头 img_response = requests.get(img_src, headers=headers) img_response.raise_for_status() # 主动抛出HTTP请求错误 # 提取图片后缀名,处理带参数的URL file_ext = img_src.split('.')[-1].split('?')[0] file_name = os.path.join(save_dir, f"{i}.{file_ext}") # 保存图片 with open(file_name, 'wb') as img_file: img_file.write(img_response.content) print(f"成功保存: {file_name}") i += 1 except Exception as e: print(f"处理第{i}个容器出错: {str(e)}") i += 1 continue
关键修改说明
- 处理懒加载:通过
data-src获取真实图片地址,这是解决大部分图片无法获取的核心。 - 模拟浏览器请求:添加
User-Agent请求头,规避网站反爬拦截。 - URL补全与处理:自动补全相对地址为完整域名,兼容带参数的图片URL。
- 优化异常处理:捕获并打印具体错误,便于排查问题;使用
with语句自动管理文件,更安全。 - 自动创建目录:提前创建保存文件夹,避免保存时因目录不存在报错。
内容的提问来源于stack exchange,提问作者iulian
相关产品推荐
相关产品推荐

