使用Selenium爬取Facebook封面图时,如何避免获取模糊图片URL?
使用Python Selenium爬取Facebook活动页面的封面图片时,代码能返回图片URL,但得到的是带模糊参数的缩略图,而非清晰的原图。以下是相关代码、期望的原图URL和实际获取的模糊图URL:
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By import requests url = 'https://www.facebook.com/events/851274783286508/?active_tab=about' driver = webdriver.Edge() driver.get(url) cover_class = 'img.x1ey2m1c.x9f619.xds687c.x5yr21d.x10l6tqk.x17qophe.x13vifvy.xh8yej3' img = driver.find_element(By.CSS_SELECTOR,cover_class) print(img.get_attribute('src')) requests.get(img.get_attribute('src'))
期望获取的原图URL
https://scontent.fpsd2-1.fna.fbcdn.net/v/t39.30808-6/321296208_468127735500704_5967700403570897493_n.jpg?_nc_cat=106&ccb=1-7&_nc_sid=340051&_nc_eui2=AeFSxY7I0TKJvJRIx37yNz_jvkkF4L__0_G-SQXgv__T8a3A9q5B5t3jD54iDEhyayU7Wf-86Xko3e-lkPKiOl8v&_nc_ohc=kU48KdHWOFcAX_w-iW0&_nc_ht=scontent.fpsd2-1.fna&oh=00_AfCjDp7TSLV22b8WigiDlMedF9ONKuDXmW885vje3OAlMQ&oe=64573615
实际获取的模糊缩略图URL
https://scontent.fpsd2-1.fna.fbcdn.net/v/t39.30808-6/321296208_468127735500704_5967700403570897493_n.jpg?stp=dst-jpg_fb50_s320x320&_nc_cat=106&ccb=1-7&_nc_sid=340051&_nc_ohc=kU48KdHWOFcAX_w-iW0&_nc_ht=scontent.fpsd2-1.fna&oh=00_AfDSvqeVreyDGTVq4If0dBtyBA6H1PA0YV9CVaY3DLnupg&oe=64573615
1. 分析URL差异
实际返回的URL比原图URL多了stp=dst-jpg_fb50_s320x320参数,这是Facebook用于指定图片压缩格式、尺寸的参数,移除该参数即可获取原图。
2. 两种处理方式
方式一:直接修改URL移除模糊参数
通过解析URL并删除stp参数,重构出原图URL:
from selenium import webdriver from selenium.webdriver.common.by import By import requests from urllib.parse import urlparse, parse_qs, urlencode url = 'https://www.facebook.com/events/851274783286508/?active_tab=about' driver = webdriver.Edge() driver.get(url) cover_class = 'img.x1ey2m1c.x9f619.xds687c.x5yr21d.x10l6tqk.x17qophe.x13vifvy.xh8yej3' img = driver.find_element(By.CSS_SELECTOR, cover_class) src_url = img.get_attribute('src') # 解析URL,移除stp参数 parsed = urlparse(src_url) query_params = parse_qs(parsed.query) query_params.pop('stp', None) # 重新生成URL original_url = parsed._replace(query=urlencode(query_params, doseq=True)).geturl() print("原图URL:", original_url) # 下载原图 with open('event_cover.jpg', 'wb') as f: f.write(requests.get(original_url).content) driver.quit()
方式二:获取图片的原始属性
Facebook通常会将原图URL存储在data-src或data-original这类自定义属性中,优先尝试获取这些属性:
from selenium import webdriver from selenium.webdriver.common.by import By import requests url = 'https://www.facebook.com/events/851274783286508/?active_tab=about' driver = webdriver.Edge() driver.get(url) cover_class = 'img.x1ey2m1c.x9f619.xds687c.x5yr21d.x10l6tqk.x17qophe.x13vifvy.xh8yej3' img = driver.find_element(By.CSS_SELECTOR, cover_class) # 优先取data-src,不存在则用src original_url = img.get_attribute('data-src') or img.get_attribute('src') print("原图URL:", original_url) with open('event_cover.jpg', 'wb') as f: f.write(requests.get(original_url).content) driver.quit()
注意事项
- Facebook的页面结构、CSS类名和属性可能随时更新,需定期验证代码有效性;
- 爬取Facebook内容需遵守其服务条款,避免频繁请求触发反爬机制。
内容的提问来源于stack exchange,提问作者Muhammad Yousef

