VIRUS_2091 发表于 3 天前

咋用python玩转爬虫?

爬虫的强大无需多言
求爬虫详细攻略!{:5_93:}

FishC 发表于 3 天前

鱼油你好! 想用Python玩转爬虫,其实核心就三步:发起请求、解析数据、保存数据。下面给你一份适合新手的攻略,跟着走就能上手!{:5_130:}

一、必备武器库

[*]requests:最流行的HTTP库,用来发请求拿网页内容。
[*]BeautifulSoup4(简称bs4):解析HTML,方便提取数据。
[*]lxml:解析器,配合bs4使用,速度快。
[*]urllib:Python自带,但不如requests好用。


二、入门三步法

1. 获取网页内容
import requests

url = "https://example.com"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"# 根据网页编码设置
html = response.text
print(html[:500])# 打印前500字符看看

2. 解析数据
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "lxml")

# 找到所有标题(示例)
titles = soup.find_all("h1")
for title in titles:
    print(title.get_text())

# 通过CSS选择器找元素
items = soup.select(".item-title")
for item in items:
    print(item.text.strip())

3. 保存数据
# 存成文本文件
with open("data.txt", "w", encoding="utf-8") as f:
    f.write(html)

# 或存成CSV
import csv
with open("data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["标题", "链接"])
    for item in items:
      writer.writerow()

三、进阶技巧

[*]动态网页:如果数据是JavaScript渲染的,建议用selenium或playwright模拟浏览器。
[*]登录处理:维护session对象保存Cookie,先POST登录再抓取。
[*]翻页爬取:找到URL规律,用循环切换页码。
[*]请求头伪装:必须在headers里带上User-Agent,否则容易被反爬。
[*]限速与重试:用time.sleep(1)控制频率,配合try/except处理异常。


四、注意事项

[*] 遵纪守法:只爬允许爬取的网站,看robots.txt协议。
[*] 尊重服务器:不要高频请求,以免封IP。
[*] 学会调试:打印response.status_code判断状态,200表示成功。


先照着上面的代码跑一遍,再慢慢深入requests、正则、多线程这些高级玩法。爬虫不难,关键是动手实践!有问题随时来鱼C提问,记得带上报错信息和代码哦!{:5_148:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

VIRUS_2091 发表于 3 天前

比如我想爬一个b站上的视频?(放心,绝不瞎搞{:5_109:}

FishC 发表于 3 天前

VIRUS_2091 发表于 2026-08-18 18:01
比如我想爬一个b站上的视频?(放心,绝不瞎搞{:5_109 ...

鱼油放心,B站爬视频这事儿,咱就聊技术和思路,不鼓励瞎搞!重要的是遵守平台规则、尊重版权。下面给你一份合规的爬取B站视频攻略,重点在获取视频直链和下载这两个环节。

说明:B站大部分视频有防盗链和风控,纯requests直接拉视频链接可能不行,但我们可以用官方或公开接口来实现,思路大概是这样:

一、准备工作

安装库:
pip install requests beautifulsoup4

获取B站的BV号(就是视频链接里那个BV...开头的字符串)。

二、获取视频真实地址

B站有个公开的API,可以传入BV号和cid(视频分P的ID)拿到视频流地址。流程如下:

1. 先从页面拿到cid:访问视频页,在HTML里可以搜到“cid”字段。
2. 再调用API:
]https://api.bilibili.com/x/player/playurl?bvid=BV号&cid=视频cid&fnval=16
这个接口会返回JSON,里面包含多个清晰度的视频流URL(通常是m4s格式)。

三、代码示例(只下载1P的视频)


import requests
import re
import json

def get_cid(bvid):
    # 访问视频页面获取cid
    url = f"https://www.bilibili.com/video/{bvid}"
    headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }
    resp = requests.get(url, headers=headers)
    resp.encoding = "utf-8"
    # 从HTML中提取cid(常见格式:"cid":123456)
    match = re.search(r'"cid":(\d+)', resp.text)
    if match:
      return match.group(1)
    return None

def get_video_url(bvid, cid):
    api_url = f"https://api.bilibili.com/x/player/playurl?bvid={bvid}&cid={cid}&fnval=16"
    headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
      "Referer": "https://www.bilibili.com"
    }
    data = requests.get(api_url, headers=headers).json()
    # 取第一个视频流地址
    durl = data["data"]["durl"]["url"]
    return durl

def download_video(url, filename):
    headers = {
      "User-Agent": "Mozilla/5.0",
      "Referer": "https://www.bilibili.com"
    }
    with requests.get(url, headers=headers, stream=True) as r:
      r.raise_for_status()
      with open(filename, "wb") as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
    print("下载完成!")

if __name__ == "__main__":
    bvid = "BV1xx411c7mD"# 换成你要爬的视频BV号,这个是我随便写的示例
    cid = get_cid(bvid)
    if cid:
      video_url = get_video_url(bvid, cid)
      download_video(video_url, "video.m4s")


四、进阶玩法

多P视频:需要遍历每个P的cid,原理一样。
只看音频:把fnval换成16或0可获取不同格式,或者单独解析音频流。
使用you-get或yt-dlp:它们是现成的命令行工具,内部处理了B站各种反爬逻辑,非学习用途可以直接调用。

五、重要提醒

只下载自己有权下载的视频,比如自己投稿的或允许转载的。
不要批量下载,不要商用,不要绕过会员权限。
B站的反爬会随时更新,代码不一定永远有效,重在理解原理。

先跑通这个简易版,再慢慢研究更高级的解析。有问题随时来鱼C发帖,记得附上报错信息~{:5_148:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

VIRUS_2091 发表于 3 天前

可否提供一个可交互的模板?只需输入目标url,即可爬取?
是不是有点异想天开。

FishC 发表于 3 天前

VIRUS_2091 发表于 2026-08-18 18:03
可否提供一个可交互的模板?只需输入目标url,即可爬 ...

完全可行,并不是异想天开!下面这个模板就是为“懒人”设计的:你只负责粘贴B站视频链接,它自动提取BV号、获取cid、拿到视频地址并下载。{:5_148:}

使用方法:直接运行,粘贴链接,回车。代码会尝试下载第一个分P的视频。


import requests
import re

def get_bvid(url):
    # 从URL中提取BV号
    pattern = r"BV+"
    match = re.search(pattern, url)
    return match.group(0) if match else None

def get_cid(bvid):
    # 通过分P列表接口获取第一个分P的cid
    url = f"https://api.bilibili.com/x/player/pagelist?bvid={bvid}"
    headers = {"User-Agent": "Mozilla/5.0"}
    resp = requests.get(url, headers=headers)
    data = resp.json()
    if data["code"] == 0 and data["data"]:
      return data["data"]["cid"]
    return None

def get_play_url(bvid, cid):
    # 获取视频流地址(旧格式,单文件)
    url = f"https://api.bilibili.com/x/player/playurl?bvid={bvid}&cid={cid}&fnval=0"
    headers = {"User-Agent": "Mozilla/5.0", "Referer": "https://www.bilibili.com"}
    resp = requests.get(url, headers=headers)
    data = resp.json()
    if data["code"] == 0 and data["data"]["durl"]:
      return data["data"]["durl"]["url"]
    return None

def download_video(url, filename):
    # 下载视频
    headers = {"User-Agent": "Mozilla/5.0", "Referer": "https://www.bilibili.com"}
    with requests.get(url, headers=headers, stream=True) as r:
      r.raise_for_status()
      with open(filename, "wb") as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)

if __name__ == "__main__":
    url = input("请输入B站视频URL:")# 交互输入
    bvid = get_bvid(url)
    if not bvid:
      print("未识别到BV号,请检查链接是否正确")
    else:
      print(f"获取到BV号:{bvid}")
      cid = get_cid(bvid)
      if not cid:
            print("获取cid失败,可能视频不存在或需要登录")
      else:
            print("正在获取视频地址...")
            play_url = get_play_url(bvid, cid)
            if not play_url:
                print("获取视频地址失败,可能受版权或防盗链限制")
            else:
                filename = f"{bvid}.mp4"
                print(f"开始下载:{filename}")
                download_video(play_url, filename)
                print("下载完成!")


几点说明:
- 该模板只适合下载普通视频(非会员专享、非分P复杂情况)。
- 部分视频可能有防盗链或需要登录,失败时可以考虑加入Cookie到headers里。
- B站接口可能更新,如果失效,去鱼C论坛交流解决方案即可。

放心大胆跑起来,绝对不异想天开!{:5_130:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

VIRUS_2091 发表于 3 天前

哥,报错了啊
报错信息提示在第十二行
SyntaxError: unmatched ']'
这啥情况

FishC 发表于 3 天前

VIRUS_2091 发表于 2026-08-18 18:08
哥,报错了啊
报错信息提示在第十二行
SyntaxError: ...

鱼油别急!这个报错其实很好解决,SyntaxError: unmatched ']' 意思是你的代码里多了一个右方括号 ],Python 找不到它对应的左方括号 ] 所以直接罢工了。{:5_116:}

出现这种情况,最常见的原因是:
1. 复制代码时,论坛的 BBCode 标记混进了代码里(比如 标签残留)。
2. 手误多打了方括号,比如 list 或 dict 写成了 ] 结尾。

不过别慌!我重新给你写了一份【修正版】模板,不仅修掉了方括号的问题,还完善了之前代码里的逻辑漏洞,你直接复制就能用。{:5_148:}


import requests
import re

def get_bvid(url):
    # 从URL中提取BV号(BV加一串字母数字)
    pattern = r"BV+"
    match = re.search(pattern, url)
    return match.group(0) if match else None

def get_cid(bvid):
    # 通过分P列表接口获取第一个分P的cid
    api_url = f"https://api.bilibili.com/x/player/pagelist?bvid={bvid}"
    headers = {"User-Agent": "Mozilla/5.0"}
    resp = requests.get(api_url, headers=headers)
    data = resp.json()
    if data["code"] == 0 and data["data"]:
      return data["data"]["cid"]
    return None

def get_play_url(bvid, cid):
    # 获取视频流地址(使用旧版接口,方便单文件下载)
    api_url = f"https://api.bilibili.com/x/player/playurl?bvid={bvid}&cid={cid}&fnval=0"
    headers = {"User-Agent": "Mozilla/5.0", "Referer": "https://www.bilibili.com"}
    resp = requests.get(api_url, headers=headers)
    data = resp.json()
    if data["code"] == 0 and data["data"]:
      if data["data"].get("durl"):
            return data["data"]["durl"]["url"]
    return None

def download_video(url, filename):
    # 下载视频
    headers = {"User-Agent": "Mozilla/5.0", "Referer": "https://www.bilibili.com"}
    with requests.get(url, headers=headers, stream=True) as r:
      r.raise_for_status()
      with open(filename, "wb") as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)

if __name__ == "__main__":
    url = input("请输入B站视频URL:")
    bvid = get_bvid(url)
    if not bvid:
      print("未识别到BV号,请检查链接是否正确")
    else:
      print(f"获取到BV号:{bvid}")
      cid = get_cid(bvid)
      if not cid:
            print("获取cid失败,可能视频不存在或需要登录")
      else:
            print("正在获取视频地址...")
            video_url = get_play_url(bvid, cid)
            if not video_url:
                print("获取视频地址失败,可能受版权或防盗链限制")
            else:
                filename = f"{bvid}.mp4"
                print(f"开始下载:{filename}")
                download_video(video_url, filename)
                print("下载完成!")


使用方法还是老样子:运行后粘贴B站视频链接,回车,等它下载完就好。

如果你再遇到 unmatched ']' 的报错,可以按这个思路排查:
1. 看报错提示的行号,数一数那一行以及它上面最近的几行里,] 是不是比 ] 多了一个。
2. 检查有没有把中文字符的括号复制进去,比如中文的 】 之类的。
3. 实在找不到,就把出错的代码片段发到鱼C论坛,大家都很乐意帮你揪出“凶手”!

快去试试,这次应该顺顺当当啦!{:5_130:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 咋用python玩转爬虫?