爬虫常用的库
爬虫(Web Scraping)是一种从网页上提取数据的技术。在 Python 中,有许多库可以帮助实现这一目标。以下是一些常用的爬虫库,以及对 BeautifulSoup 的详细介绍。
常用爬虫库
1.Requests
a.功能:用于发送 HTTP 请求,获取网页内容。
b.特点:简单易用,支持 GET 和 POST 请求,能够处理 cookies、会话等。
2.BeautifulSoup
a.功能:用于解析 HTML 和 XML 文档,提取数据。
b.特点:提供简单的 API 来导航、搜索和修改解析树,非常适合处理复杂的网页结构。
3.Scrapy
a.功能:一个强大的爬虫框架,适合构建大规模爬虫项目。
b.特点:支持异步请求,内置了数据存储和提取功能,适合需要高效爬取的场景。
4.Selenium
a.功能:用于自动化浏览器操作,可以抓取动态内容。
b.特点:可以模拟用户操作,适合处理 JavaScript 渲染的页面。
5.lxml
a.功能:用于解析和处理 XML 和 HTML 文档。
b.特点:速度快,支持 XPath 查询。
6.Pandas
a.功能:用于数据处理和分析。
b.特点:可以方便地将抓取到的数据进行清洗和分析。
BeautifulSoup 详细介绍
BeautifulSoup 是一个用于解析 HTML 和 XML 的 Python 库,提供了方便的工具来提取和处理网页数据。以下是对 BeautifulSoup 的一些关键点的介绍:
安装
使用 pip 安装 BeautifulSoup:
pip install beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple
安装 requests
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
基本用法
- 导入库:
from bs4 import BeautifulSoup
import requests
- 获取网页内容:
url = 'https://example.com'
response = requests.get(url)
html_content = response.text
- 创建 BeautifulSoup 对象:
soup = BeautifulSoup(html_content, 'html.parser')
解析 HTML:
- 查找标签:
title = soup.title
print(title.text) # 打印网页标题
- 查找特定标签:
for heading in headings:
print(heading.text)
headings = soup.find_all('h1') # 找到所有 h1 标签
- 使用 CSS 选择器:
links = soup.select('a[href]') # 查找所有有 href 属性的链接
for link in links:
print(link['href'])
修改文档:
- 添加、删除标签:
new_tag = soup.new_tag('p')
new_tag.string = '这是新添加的段落'
soup.body.append(new_tag) # 将新标签添加到 body 中
BeautifulSoup优点
- 易于使用:简单的 API 使得即使是初学者也能快速上手。
- 灵活性:支持多种解析器(如 lxml 和 html.parser)。
- 强大的搜索功能:通过标签名、属性和文本内容进行精确查找。
示例代码
以下是一个简单的示例,演示如何使用 BeautifulSoup 提取网页中的所有链接:
import requests
from bs4 import BeautifulSoup
# 获取网页内容
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 查找所有链接
for link in soup.find_all('a'):
print(link.get('href'))
总结
BeautifulSoup 是一个功能强大的网页解析库,适合用于快速提取 HTML 数据。结合其他库(如 Requests 和 Scrapy),可以构建强大的爬虫应用。通过灵活使用其各种功能,用户可以高效地抓取和处理网页数据。
简单案例演示爬取元气手机壁纸
获取网页请求信息
- 设置headers请求头过程如下图:
- 查看请求响应的网页html代码
import requests
# 定制请求头
headers = {'user-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}
response = requests.get('https://mbizhi.cheetahfun.com/sj/j/', headers=headers)
print('text:')
print(response.text)
print("content:")
print(response.content)
- 出现下面的结果表示请求成功
完整代码如下:
import requests
from bs4 import BeautifulSoup
import os
# 定制请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
}
# 发送请求获取网页内容
url = 'https://mbizhi.cheetahfun.com/sj/j/'
response = requests.get(url, headers=headers)
# 检查响应状态码
if response.status_code == 200:
# 使用 BeautifulSoup 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 查找所有图片元素
images = soup.find_all('img')
# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# 遍历图片元素,下载并保存图片
for i, image in enumerate(images):
img_url = image['src']
# 确保URL是绝对路径
if not img_url.startswith(('http:', 'https:')):
img_url = url + img_url # 将相对路径转换为绝对路径
img_data = requests.get(img_url).content # 下载图片内容
# 构建保存路径
file_path = os.path.join(save_dir, f'image_{i}.jpg')
# 保存图片
with open(file_path, 'wb') as file:
file.write(img_data)
print(f'Image {i} saved to {file_path}')
else:
print('Failed to retrieve the webpage')
运行后:打开downloaded_images文件夹查看,获取的图片如下: