Python爬虫——b站笔记图文

  • 通过 Python requests 库向b站的任意笔记获取请求,得到 html 界面后用 BS 进行解析,获取图文信息。同时图片可以选择下载或者单纯地标注在对应位置,支持md格式的引用。

初始操作

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/111.0.0.0 Safari/537.36 Edg/111.0.1661.44'
}
url = ''      # 这里填写需要爬取的文章的链接
response = requests.get(url, headers=headers)

元素结构

内容查找

  • 如上图,正文内容的 class 为 opus-module-content
    子元素结构
  • 同时,发现图片元素 img 在 div 下,文本在 p 下,即opus-module-content 包含 div 和 p,div 包含图片。

主体代码

  • 初步解析,获取正文 html
# 使用 BeautifulSoup 解析 HTML 标签
soup = BeautifulSoup(response.text, 'html.parser')
# 查找指定的 HTML 标签
content = soup.findAll("div", attrs={"class": "opus-module-content"})
  • 接下来下载图片,封装成函数,传入图片元素和下载的文件保存的名称
  • 注意,这里打印出 img_url 会发现是缺少 .webp 的,我们发现实际上img 的 src 在jpg后面带有这个后缀,需要补充成完整地址
    图片src
def downloadImg(img, name):           # 下载照片 (图片元素,文件取名)
    global url, headers
    img_url = img.get('src')            # 获取src属性(图片网络路径)

    img_url = f'https:{img_url}.webp'       # 完整的图片地址
    print(img_url)
    # 发送HTTP请求并获取响应
    response = requests.get(img_url, headers=headers)       # 请求图片
    # 构造文件名
    # filename = os.path.basename(img_url)
    # 将图片保存到本地
    with open(f'imgs/{name}.jpg', 'wb') as f:       # 存入imgs文件夹
        f.write(response.content)
  • 接下来,获取数据主函数,输入的是模式和下载与否,模式为1就获取图片信息,在此情况下下载为 true 就会把图片下载下来,否则只会在相应位置进行标注
  • 其他情况下,只会把文本写下来
  • 标注图片包括普通的分割线标识,和md引入,可用于hexo博客编写
  • 请求到的数据结构要通过 print 逐步判断,而非一蹴而就
def getData(module=1, download=False):      # 获取笔记数据,是否获取图片在文章的位置,以及下载图片与否
    global content
    imgnum = 0          # 图片数量
    # 图文获取,在图片处打上标记,可下载图片
    if module == 1:
        with open('output.md', 'w', encoding='utf-8') as f:
            for con in content[0]:
                if con.name == 'div' and con.attrs['class'][0] == 'opus-para-pic':      # 是图片
                    imgnum = imgnum + 1                 # 第n个图片
                    img = con.findAll('img')[0]
                    if download == True:
                        downloadImg(img, imgnum)            # 下载照片
                    print(f'---------图片{imgnum}--------\n')
                    # f.write(f'--------图片{imgnum}---------\n')
                    f.write(f'![]( {imgnum}.jpg)\n')          # md格式引入
                elif con.name == 'p':               # 是文本
                    print(con.string)
                    try:
                        f.write(con.string + "\n")
                    except:
                        f.write('\n')
    # 只要文本
    else:
        words = content[0].findAll("p")
        with open('output.md', 'w', encoding='utf-8') as f:
            for word in words:
                print(word.string)
                try:
                    f.write(word.string+"\n")
                except:
                    f.write('\n')
  • 完整代码
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/111.0.0.0 Safari/537.36 Edg/111.0.1661.44'
}
url = ''      # 需要爬取的文章
response = requests.get(url, headers=headers)

# 使用 BeautifulSoup 解析 HTML 标签
soup = BeautifulSoup(response.text, 'html.parser')
# 查找指定的 HTML 标签
content = soup.findAll("div", attrs={"class": "opus-module-content"})

def downloadImg(img, name):           # 下载照片 (图片元素,文件取名)
    global url, headers
    img_url = img.get('src')            # 获取src属性(图片网络路径)

    img_url = f'https:{img_url}.webp'       # 完整的图片地址
    print(img_url)
    # 发送HTTP请求并获取响应
    response = requests.get(img_url, headers=headers)       # 请求图片
    # 构造文件名
    # filename = os.path.basename(img_url)
    # 将图片保存到本地
    with open(f'imgs/{name}.jpg', 'wb') as f:       # 存入imgs文件夹
        f.write(response.content)

def getData(module=1, download=False):      # 获取笔记数据,是否获取图片在文章的位置,以及下载图片与否
    global content
    imgnum = 0          # 图片数量
    # 图文获取,在图片处打上标记,可下载图片
    if module == 1:
        with open('output.md', 'w', encoding='utf-8') as f:
            for con in content[0]:
                if con.name == 'div' and con.attrs['class'][0] == 'opus-para-pic':      # 是图片
                    imgnum = imgnum + 1                 # 第n个图片
                    img = con.findAll('img')[0]
                    if download == True:
                        downloadImg(img, imgnum)            # 下载照片
                    print(f'---------图片{imgnum}--------\n')
                    # f.write(f'--------图片{imgnum}---------\n')
                    f.write(f'![]( {imgnum}.jpg)\n')          # md格式引入
                elif con.name == 'p':               # 是文本
                    print(con.string)
                    try:
                        f.write(con.string + "\n")
                    except:
                        f.write('\n')
    # 只要文本
    else:
        words = content[0].findAll("p")
        with open('output.md', 'w', encoding='utf-8') as f:
            for word in words:
                print(word.string)
                try:
                    f.write(word.string+"\n")
                except:
                    f.write('\n')

getData(module=1, download=True)

结果

  • 运行代码,控制台打印出文本结构,md文件也写入文本,imgs文件夹下一张张下载下了图片
    控制台结果
    文本输出
    图片输出
  • Copyrights © 2023-2025 LegendLeo Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信