Python中使用select方法爬取图片src的实现方案及提取失败问题排查
解决方案:修复图片爬取与KeyError问题
问题诊断
你的代码主要存在两个核心问题:
- 空列表原因:页面图片采用懒加载机制,初始渲染时图片的class不是
.lazyloaded(这个class是图片加载完成后才会加上的),而且你在循环中每次都从整个soup对象中选择图片,会导致重复收集或者根本取不到目标图片。 - KeyError原因:直接通过
img["src"]访问属性时,如果标签不存在该属性,就会抛出KeyError,应该使用更安全的属性获取方式。
修正后的代码
from base64 import decode import requests from bs4 import BeautifulSoup import pandas as pd import csv from time import sleep from random import randint import numpy as np headers = dict() headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" images = [] titles = [] authors = [] pages = np.arange(1, 2, 1) for page in pages: url = "https://www.dr.com.tr/kategori/Kitap/Cocuk-ve-Genclik/grupno=00884?Page=" + str(page) results = requests.get(url, headers=headers) soup = BeautifulSoup(results.text, "html.parser") book_div = soup.find_all("div", class_="prd-main-wrapper") sleep(randint(2, 10)) for bookSection in book_div: # 1. 从当前书籍区块内选择图片,而非整个页面 # 2. 使用懒加载初始的class(根据实际页面调整,此处为常见的.lazy) # 3. 用get("src")安全获取属性,避免KeyError img_tag = bookSection.select_one(".lazy") img_src = img_tag.get("src") if img_tag else None images.append(img_src) name = bookSection.find("a", class_="prd-name").get('title') titles.append(name) author = bookSection.find("div", class_="prd-row").text.strip() authors.append(author) books = pd.DataFrame( { "Image": images, "Book": titles, "Author": authors, } ) books.to_csv("dr_child.csv", index=False, header=True,encoding = 'utf-8-sig')
关键修改点说明
- 精准匹配图片:不再从整个页面抓取所有图片,而是聚焦当前书籍的区块
bookSection,确保每本书对应自己的封面图,避免重复或错位。 - 适配懒加载:将选择器从
.lazyloaded改为.lazy(你可以通过浏览器F12查看初始HTML里的img类名,确认实际值),因为.lazyloaded是图片加载完成后才会添加的类,初始请求的HTML里不存在这个标识。 - 避免KeyError:用
img_tag.get("src")替代直接索引img["src"],如果标签不存在或没有src属性,会返回None而不是抛出异常,让代码更健壮。
额外小建议
- 不确定图片类名时,打开目标页面按F12,在「Elements」标签下查看未加载完成前的img标签属性,不要看加载后的状态。
- 可以给元素查找逻辑加上
try-except,比如捕获AttributeError,避免页面结构小变动导致爬虫直接崩溃。
内容的提问来源于stack exchange,提问作者océane
相关产品推荐
相关产品推荐

