Python爬虫入门指南:从零开始实战爬取B站视频信息,简单易懂教程
一、什么是爬虫?
爬虫是一种自动化程序,用于在互联网上自动浏览和访问网页,收集网页上的信息。爬虫的基本工作流程包括选择种子URL,爬取网页内容,解析网页,跟踪链接,存储信息,去重和调度。爬虫在信息收集和分析中起着重要作用,但需要遵守网站规则,合理控制访问速度和频率,避免对网站造成压力或侵犯隐私。
爬虫的基本工作流程通常包括以下几个步骤:
-
选择种子URL:爬虫从一个或多个起始网页(种子URL)开始工作。这些网页通常是具有较高重要性的页面,例如主要搜索引擎的首页。
-
爬取网页内容:爬虫访问网页,下载网页内容,并从中提取信息。这通常涉及到处理HTML、XML、JSON等数据格式。
-
解析网页:提取出的信息通常需要进行解析和处理,以便于存储和进一步的分析。这可能涉及到正则表达式匹配、HTML解析、自然语言处理等技术。
-
跟踪链接:爬虫会分析网页中的链接,并选择性地跟随这些链接,以发现新的网页。这个过程称为跟踪。
-
存储信息:爬虫将提取到的信息存储到数据库或文件中,以便于后续的查询和分析。
-
去重:为了避免重复访问相同的网页,爬虫通常会有去重策略,以保证每个网页只被访问一次。
-
调度:爬虫可能会有一个调度器,它负责管理多个爬虫实例的工作,协调它们的工作负载,以及处理爬虫间的通信。
二、简单示例
安装网络请求模块
pip install requests
示例1:
直接爬取网站数据
# 导入requests库,用于发起网络请求
import requests
# 向目标网站发起GET请求
response = requests.get('http://books.toscrape.com/')
# 检查响应状态码是否为200,即请求是否成功
if response.ok:
# 如果请求成功,打印响应的文本内容
print(response.text)
else:
# 如果请求失败,打印错误信息
print('请求失败')
三、添加请求头后进行爬虫
有些网站会判断你是否是浏览器或者程序进行访问;
可以使用打印response.status来查看是否可以直接爬取该网站的信息;
如果无法直接爬取,这时可以通过设置 请求头headr 的方式将程序伪装为浏览器的方式进行访问
示例2:
例如在b站上无法直接爬取数据的
所以打开通过右击点击检查,然后点击Network中的任意一个请求,将请求头中的User-Agent替换为请求中的User-Agent的内容即可爬取数据了
示例代码:
import requests
requestHead = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"}
response = requests.get('https://www.bilibili.com/',headers = requestHead)
if response.ok:
print(response.text)
else:
print('请求失败')
四、Beautiful Soup库解析html文件
爬取到了网站的信息,不过信息太多了,
下载Beautiful Soup库:
pip install bs4
示例代码:”
# 导入所需库
from bs4 import BeautifulSoup
import requests
# 设置请求头
requestHead = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"}
# 获取页面内容
content = requests.get("https://www.bilibili.com/", headers=requestHead).text
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(content, "html.parser")
# 查找所有h3标签
all_titles = soup.findAll("h3")
# 遍历所有h3标签,查找其中的a标签
for title in all_titles:
link = title.find("a")
# 打印a标签的文本内容
print(link.string)
四、实战(获取b站视频的标题和链接)
通过检查其b站的某个标题的源代码,可以知道class的值
使用的是检查中左上角的第一个进行快速定位所显示组件的源代码
通过点击某个商品可以知道该class的值 ,以及所使用的标签
通过观察可以知道 视频链接就在所获取class div标签下的子标签:a中,可以通过获取all_infos,循环遍历info,获取其下的a标签,但是视频图片是div标签的后代标签:picture中,所以再对单个info根据class获取对应的picture标签,最后将其都进行循环打印出来
示例代码:
# 导入所需库
from bs4 import BeautifulSoup
import requests
# 设置请求头
requestHead = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"}
# 获取页面内容
content = requests.get("https://www.bilibili.com/", headers=requestHead).text
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(content, "html.parser")
#获取信息
all_info = soup.findAll("div",attrs={"class","bili-video-card__wrap __scale-wrap"})
# 遍历视频信息并打印链接和图片
for info in all_info:
# 获取视频的链接
video_link = info.a['href']
print(f"视频链接: {video_link}")
# 获取视频的picture标签内容
video_image_picture = info.findAll("picture",attrs={"class","v-img bili-video-card__cover"})
if video_image_picture:
# 获取图片的src属性
video_image_src = video_image_picture[0].img['src']
print(f"视频图片链接:{video_image_src}")
print()
作者:探索星辰大海