当前位置: 首页 > news >正文

Python爬虫:Requests与Beautiful Soup库详解

前言

在当今数据驱动的时代,网络爬虫成为了获取网络信息的重要工具。Python作为最流行的爬虫语言之一,拥有丰富的库支持。今天我们就来介绍两个最基础也最强大的爬虫库:Requests和Beautiful Soup,并补充关于lxml解析器和Requests Session的内容。

一、Requests库:让HTTP请求变得简单

Requests是一个优雅而简单的HTTP库,它让发送HTTP请求变得非常简单,比Python内置的urllib库更加人性化。

安装Requests

在开始之前,我们需要先安装Requests库:

pip install requests

基本GET请求

import requests# 发送GET请求
response = requests.get('https://www.example.com')# 查看响应状态码
print(response.status_code)  # 200表示成功# 查看网页内容
print(response.text)

常用方法和属性

  1. response.status_code:HTTP请求的返回状态
  2. response.text:返回内容的文本形式
  3. response.content:返回内容的二进制形式
  4. response.json():如果返回内容是JSON格式,可以直接解析为字典
  5. response.headers:查看响应头信息

带参数的GET请求

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # 查看实际请求的URL

POST请求示例

data = {'username': 'test', 'password': '123456'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.text)

设置请求头

有些网站会检查请求头,我们可以模拟浏览器访问:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get('https://www.example.com', headers=headers)

使用Session保持会话

Requests的Session对象可以跨请求保持某些参数,比如cookies,还可以为请求方法提供缺省数据。

import requests# 创建一个Session对象
s = requests.Session()# 设置公共的请求头
s.headers.update({'User-Agent': 'Mozilla/5.0'})# 登录请求(假设这是一个登录接口)
login_data = {'username': 'user', 'password': 'pass'}
s.post('https://example.com/login', data=login_data)# 后续请求会自动携带cookies
response = s.get('https://example.com/dashboard')
print(response.text)# Session也可以设置请求参数默认值
s.params = {'token': 'abc123'}
# 这个请求会自动加上?token=abc123
response = s.get('https://example.com/api/data')

Session的主要优势:

  1. 保持cookies,模拟用户登录状态
  2. 可以设置默认headers和params
  3. 重用TCP连接,提高请求效率
  4. 保持会话级别的设置

二、Beautiful Soup:HTML解析利器

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。

安装Beautiful Soup和lxml

pip install beautifulsoup4 lxml

为什么选择lxml解析器?

lxml是一个高性能的HTML/XML解析器,相比Python内置的html.parser:

  1. 速度更快
  2. 容错能力更强
  3. 支持复杂的XPath查询
  4. 更接近现代浏览器的解析方式

基本用法(使用lxml解析器)

from bs4 import BeautifulSoup
import requests# 获取网页内容
response = requests.get('https://www.example.com')
html_content = response.text# 创建Beautiful Soup对象,指定使用lxml解析器
soup = BeautifulSoup(html_content, 'lxml')# 打印美化后的HTML
print(soup.prettify())

常用方法

  1. 标签选择
# 获取第一个<title>标签
print(soup.title)# 获取<title>标签的内容
print(soup.title.string)# 获取第一个<a>标签
print(soup.a)# 获取所有<a>标签
all_links = soup.find_all('a')
for link in all_links:print(link.get('href'))
  1. 通过属性查找
# 查找id为"link1"的元素
link = soup.find(id="link1")
print(link)# 查找所有class为"item"的div
items = soup.find_all('div', class_='item')
for item in items:print(item.text)
  1. CSS选择器
# 选择所有class为"article"的div下的h2标题
titles = soup.select('div.article h2')
for title in titles:print(title.text)
  1. XPath选择器(lxml特有)

虽然Beautiful Soup主要支持CSS选择器,但配合lxml我们可以使用XPath:

from lxml import etree# 将Beautiful Soup对象转换为lxml的etree
tree = etree.HTML(str(soup))# 使用XPath选择元素
results = tree.xpath('//div[@class="article"]//h2/text()')
for result in results:print(result)

实际示例:爬取简单新闻标题(使用lxml解析器)

import requests
from bs4 import BeautifulSoup# 发送请求
url = 'https://news.sina.com.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)# 解析HTML,使用lxml解析器
soup = BeautifulSoup(response.text, 'lxml')# 提取新闻标题 - 这里的选择器需要根据实际网页结构调整
news_titles = soup.select('.news-item h2 a')
for i, title in enumerate(news_titles[:10], 1):print(f"{i}. {title.text.strip()}")

三、Requests和Beautiful Soup配合使用

让我们看一个完整的例子,爬取豆瓣电影Top250,使用Session和lxml解析器:

import requests
from bs4 import BeautifulSoup
import timedef scrape_douban_top250():# 创建Session对象s = requests.Session()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}s.headers.update(headers)for start in range(0, 250, 25):url = f'https://movie.douban.com/top250?start={start}'try:response = s.get(url)response.raise_for_status()  # 检查请求是否成功# 使用lxml解析器soup = BeautifulSoup(response.text, 'lxml')items = soup.select('.item')for item in items:title = item.select_one('.title').textrating = item.select_one('.rating_num').textprint(f"电影: {title} | 评分: {rating}")# 礼貌性延迟time.sleep(2)except requests.exceptions.RequestException as e:print(f"请求失败: {e}")breakscrape_douban_top250()

四、注意事项

  1. 遵守robots.txt:在爬取任何网站前,先检查其robots.txt文件,了解哪些内容允许爬取
  2. 设置延迟:在循环请求中添加time.sleep(2)等延迟,避免给服务器造成压力
  3. 异常处理:网络请求可能会失败,添加try-except块处理异常
  4. 用户代理:合理设置User-Agent,模拟浏览器行为
  5. 合法性:确保你的爬虫行为符合法律法规和网站的使用条款
  6. 解析器选择
    • 对于简单任务,html.parser足够
    • 对于复杂或大型HTML文档,推荐使用lxml
    • 如果需要处理不规范HTML,可以尝试html5lib(但速度较慢)

五、总结

本文介绍了Python爬虫的两个基础库:

  1. Requests

    • 简单易用的HTTP请求库
    • Session对象可以保持cookies和会话状态
    • 支持各种HTTP方法和参数设置
  2. Beautiful Soup

    • 强大的HTML/XML解析库
    • 配合lxml解析器性能更佳
    • 提供多种查找和遍历文档树的方法

两者的配合使用流程通常是:

  1. 使用Requests获取网页内容
  2. 使用Beautiful Soup解析和提取数据
  3. 对提取的数据进行处理和存储

随着需求的复杂化,你可能还需要学习:

  1. Scrapy框架:更强大、更专业的爬虫框架
  2. Selenium:处理JavaScript渲染的页面
  3. 正则表达式:更灵活的数据提取方式

最后记住,爬虫虽好,但要合法合规使用哦!


创作不易,如果您都看到这里了,可以给我一个点赞、收藏并关注一下么?您的支持与喜爱是激励我创作的最大动力!

如果内容有误请及时联系我进行修改

http://www.xdnf.cn/news/1074241.html

相关文章:

  • 重写(Override)与重载(Overload)深度解析
  • 【C++】C++中的友元函数和友元类
  • 71. 简化路径 —day94
  • Bugku——WEB篇(持续更新ing)
  • documents4j导出pdf
  • Ubuntu服务器(公网)- Ubuntu客户端(内网)的FRP内网穿透配置教程
  • 数据结构 哈希表、栈的应用与链式队列 6.29 (尾)
  • 现代 JavaScript (ES6+) 入门到实战(八):总结与展望 - 成为一名现代前端开发者
  • day46/60
  • H3C-路由器交换机-中继
  • 计算机组成原理与体系结构-实验一 进位加法器(Proteus 8.15)
  • 5 c++核心——文件操作
  • MySQL技巧
  • 如何优化RK3588集群的性能?支持12个RK3588云手机阵列
  • C++ 格式化输入输出
  • Java中对JSON的操作
  • 模拟多维物理过程与基于云的数值分析-AI云计算数值分析和代码验证
  • SpringCloud系列(41)--SpringCloud Config分布式配置中心简介
  • TCP/UDP协议深度解析(三):TCP流量控制的魔法—滑动窗口、拥塞控制与ACK的智慧
  • Java笔记
  • 野生动物检测数据集介绍-5,138张图片 野生动物保护监测 智能狩猎相机系统 生态研究与调查
  • 贝叶斯自学笔记——基础工具篇(一)
  • Python爬虫实战:研究Bleach库相关技术
  • 【linux】权限深入解析
  • [分布式并行] 流水线并行 PP(NaivePP/GPipe/F-then-B/PipeDream/1F1B)
  • #华为鲲鹏#华为计算#鲲鹏开发者计划2025#
  • 概率论符号和公式整理
  • 大模型小模型选型手册:开源闭源、国内国外全方位对比
  • 团结引擎发布纯鸿蒙应用
  • 微信小程序接入腾讯云短信验证码流程