Python使用BS4循环爬取图片源时仅获取base64编码,无法提取图片URL如何解决
问题根因
- 你当前爬取的站点使用了图片懒加载策略:
<img>标签的src属性默认放的是base64格式的占位小图,真实图片URL存储在data-src、data-original这类自定义属性中,你只读取src属性自然拿不到有效链接 - 现有逻辑没有对
data:开头的base64内容做跳过处理,遇到这类内容时两个判断分支都不命中,无法给img_link赋值,最终就会触发空值提示
修复方案
- 先优化属性取值逻辑,用
get()方法替代直接取键,避免部分<img>无src属性时报KeyError - 先判断
src是否为base64占位,若是则优先读取懒加载属性存储的真实URL - 遍历所有图片时,只有命中有效URL才终止循环,base64占位的图片直接跳过继续查找下一张
修改后代码
def get_product_data(url): response = http.request("GET", url) check_conn_errors(response.status) bs_data = Bs(response.data, "html.parser") product_html = bs_data.find("div", {"class": PRODUCT_DATA_CLASS_NAME}) imgs = product_html.find_all("img") img_link = "" for img in imgs: # 先取src,无src默认设为空字符串避免报错 src = img.get("src", "") # 跳过base64占位图,先查懒加载常用属性里的真实链接 if src.startswith("data:"): # 可按站点实际情况调整懒加载属性名,常见的有data-src、data-original、data-url real_src = img.get("data-src", img.get("data-original", "")) if not real_src: # 当前img无有效链接,跳过查下一张 continue src = real_src # 原有URL拼接逻辑 if src.startswith("/"): img_link = PRODUCTS_URL_PREFIX + src break elif src.startswith("http") \ or src.startswith("www") \ or src.startswith(DEALER_NAME.split(' ')[0].lower()): img_link = src break if img_link == "": print("this doesn't work") #TODO: standardize description scraping desc_html = product_html.find_all("div", {"class": DESCRIPTION_CLASS_NAME}) desc = "" for desc_part in desc_html: desc += desc_part.text.replace('\n', '
').replace('\r', '
').replace('<br/>', '
').replace('</br>', '
') return [desc, img_link]
如果修改后还是拿不到,可以打印输出单张<img>标签的所有属性,确认站点存储真实图片URL的属性名,替换代码里的懒加载属性即可。
内容的提问来源于stack exchange,提问作者Hellmick
相关产品推荐
相关产品推荐

