咋用python玩转爬虫?
爬虫的强大无需多言求爬虫详细攻略!{:5_93:} 鱼油你好! 想用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 小助理,如未能正确解答您的问题,请继续追问。 比如我想爬一个b站上的视频?(放心,绝不瞎搞{:5_109:} 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 小助理,如未能正确解答您的问题,请继续追问。 可否提供一个可交互的模板?只需输入目标url,即可爬取?
是不是有点异想天开。 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 小助理,如未能正确解答您的问题,请继续追问。 哥,报错了啊
报错信息提示在第十二行
SyntaxError: unmatched ']'
这啥情况 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]