怎么通过代码提取网页图片
我上周帮朋友抓一个设计网站的通过提取图片素材图,结果发现对方用了懒加载——直接请求HTML根本拿不到图片。代码这让我意识到,网页提取网页图片这事,通过提取图片光会正则表达式远远不够。代码真正的网页难点不在“提取”,而在“找到图片的通过提取图片真实地址”。
最基础的代码方案是用Python的requests加BeautifulSoup。你发个GET请求,网页把HTML解析成DOM树,通过提取图片然后找所有img标签的代码src属性。代码就几行:
import requests from bs4 import BeautifulSoup resp = requests.get('https://example.com') soup = BeautifulSoup(resp.text,网页 'html.parser') for img in soup.find_all('img'): print(img.get('src')) 这能对付静态页面。但现实是通过提取图片,很多站点把图片地址写在CSS的代码background-image里,或者藏在JavaScript变量中。网页你光抓HTML,拿到的是个空壳。
遇到这种情况,我习惯用Selenium模拟浏览器。它会执行页面里的JS,等所有资源加载完,再去拿img标签的src。代价是慢,一个页面可能要等两秒。但胜在稳,特别是对付那些用框架渲染的SPA应用。
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://example.com') imgs = driver.find_elements(By.TAG_NAME, 'img') for img in imgs: print(img.get_attribute('src')) driver.quit() 这里有个坑——很多图片用了data-src存放真实地址,src只是个占位符。你得检查data-src、data-original、data-lazy-src这些属性,不然抓到一堆1x1像素的空白图。
还有个容易被忽略的场景:图片是base64编码直接嵌在HTML里的。这种src以data:image/开头,你不需要请求任何外部资源,直接解码就能用。但要注意,有些页面把大图也这么干,会导致HTML体积膨胀好几倍。
真要追求效率,建议直接看网络请求。打开浏览器开发者工具,切换到Network面板,过滤掉JS和CSS文件,剩下的就是图片请求。用Python的mitmproxy或者selenium-wire都能拦截这些请求,拿到最终下载的图片URL。
我自己的经验是:先看页面结构,再决定用什么工具。若是静态图站,requests就够了;若是图片懒加载的瀑布流,得上Selenium;如果图片来自CDN且有防盗链,还得带上Referer头。别一上来就上重型武器,杀鸡用牛刀反而麻烦。
最后提醒一句:抓图前确认robots.txt和网站服务条款。有些图片有版权,你私下存着没事,商用就麻烦了。别问我怎么知道的——我的一个爬虫项目就是因为没注意这点,收到了律师函。

喜欢
讨厌