返回

应对掘金CDN开启防盗链:一次爬取Markdown图片的经历

见解分享

引言

Markdown是一种轻量级的标记语言,因其易于书写和格式化的特性而受到广泛欢迎。在掘金平台,许多用户使用Markdown来编写技术文章和笔记。然而,掘金最近在其CDN上启用了防盗链机制,给想要从掘金爬取图片的用户带来了挑战。

背景

防盗链是一种保护网站图片不被未经授权下载和使用的技术。掘金CDN启用防盗链后,直接访问图片URL会返回403错误,阻止外部爬虫下载图片。

解决方案

为了解决这一问题,我们采用了一种迂回的策略,利用掘金网站的渲染机制来绕过防盗链。以下介绍了具体的步骤:

  1. 使用BeautifulSoup解析HTML

我们使用BeautifulSoup库来解析掘金文章的HTML代码。BeautifulSoup是一个强大的HTML解析库,允许我们轻松地提取和操作HTML元素。

  1. 获取图片URL

解析HTML后,我们使用BeautifulSoup的find_all()方法来查找所有包含图片的img标签。每个img标签都有一个src属性,其中包含图片的URL。

  1. 绕过防盗链

直接访问img标签中的图片URL会导致403错误。为了绕过防盗链,我们使用requests库发送HTTP请求,并伪装成浏览器。

  1. 使用伪装头

我们设置HTTP请求头,模拟一个浏览器的行为。这对于绕过防盗链至关重要,因为掘金CDN会检查请求头来识别爬虫。

  1. 下载图片

发送HTTP请求后,我们使用requests库的content属性来获取图片的内容。然后,我们可以将图片内容保存到本地文件中。

实现

以下是使用Python、BeautifulSoup和requests库实现爬取Markdown图片的代码示例:

import requests
from bs4 import BeautifulSoup

# 设置伪装头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}

# 解析HTML
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')

# 查找图片URL
img_tags = soup.find_all('img')

# 下载图片
for img_tag in img_tags:
    img_url = img_tag['src']
    img_content = requests.get(img_url, headers=headers).content
    with open(f'{img_url.split("/")[-1]}', 'wb') as f:
        f.write(img_content)

结论

通过使用BeautifulSoup和requests库,我们成功绕过了掘金CDN上的防盗链,并从Markdown文章中下载了图片。这种方法为其他希望从掘金爬取图片的用户提供了有价值的参考。

附加提示

  • 使用适当的速率限制,避免给掘金网站造成过多负载。
  • 尊重掘金平台的版权政策,仅出于非商业目的使用爬取的图片。
  • 定期检查掘金CDN的防盗链策略,以防出现变化。