Python 课程7-requests和BeautifulSoup库
前言
在数字化高速发展的今天,网络编程已成为每个开发者的必备技能。从数据采集、接口调用到信息挖掘,网络编程的应用无处不在。本教程将带您深入探索Python的网络编程世界,详细讲解requests
库的使用、API数据的抓取与处理,以及如何利用BeautifulSoup
进行网页爬虫。我们将逐步解析每个指令,助您快速掌握这门技能,成为网络编程的高手!
目录
- 网络编程简介
- 1.1 什么是网络编程
- 1.2 网络编程的应用场景
- 网络请求(requests 库)
- 2.1 安装requests库
- 2.2 发送GET请求
- 2.3 发送POST请求
- 2.4 设置请求头和参数
- 2.5 处理响应
- API数据抓取与处理
- 3.1 理解API
- 3.2 调用RESTful API
- 3.3 解析JSON数据
- 3.4 错误处理与异常捕获
- 爬虫简介(BeautifulSoup)
- 4.1 安装BeautifulSoup
- 4.2 获取网页内容
- 4.3 解析HTML
- 4.4 提取数据
- 4.5 数据存储
- 实战案例:从零构建简易爬虫
- 5.1 确定目标网站
- 5.2 编写爬虫代码
- 5.3 数据清洗与保存
- 总结与进阶
1. 网络编程简介
1.1 什么是网络编程
网络编程是指通过编程语言实现网络通信的技术,允许不同计算机之间进行数据交换。
1.2 网络编程的应用场景
- 数据采集:抓取网页或API的数据。
- 网络通信:如聊天室、邮件客户端等。
- 远程调用:如远程服务器控制、云服务。
2. 网络请求(requests 库)
requests
库是Python中最受欢迎的HTTP客户端库,简单易用。
2.1 安装requests库
pip install requests
2.2 发送GET请求
import requests # 导入requests库# 发送GET请求到指定的URL
response = requests.get('https://api.github.com')# 输出响应的状态码,例如200表示成功
print(response.status_code)# 输出响应的内容(文本形式)
print(response.text)
指令解析:
import requests
:导入requests
库,用于发送HTTP请求。requests.get(url)
:发送GET请求到指定的URL。response.status_code
:获取HTTP响应的状态码,检查请求是否成功。response.text
:以字符串形式获取响应的内容。
2.3 发送POST请求
import requests # 导入requests库# 定义要发送的数据,使用字典形式
payload = {'username': 'test', 'password': '123456'}# 发送POST请求到指定的URL,携带数据payload
response = requests.post('https://httpbin.org/post', data=payload)# 将响应内容解析为JSON格式,并输出
print(response.json())
指令解析:
payload
:要发送的数据,通常用于提交表单。requests.post(url, data=payload)
:发送POST请求,data
参数用于传递表单数据。response.json()
:将响应内容解析为JSON格式,便于处理。
2.4 设置请求头和参数
import requests # 导入requests库# 自定义请求头,模拟浏览器访问
headers = {'User-Agent': 'Mozilla/5.0'}# 定义URL参数,例如查询参数
params = {'q': 'python', 'sort': 'stars'}# 发送GET请求,携带自定义请求头和URL参数
response = requests.get('https://api.github.com/search/repositories', headers=headers, params=params)# 输出实际请求的URL,包含参数
print(response.url)
指令解析:
headers
:用于传递HTTP请求头信息,模拟不同的客户端。params
:用于传递URL中的查询参数(Query Parameters)。response.url
:获取实际发送请求的URL,验证参数是否正确添加。
2.5 处理响应
import requests # 导入requests库# 发送GET请求到指定的URL
response = requests.get('https://api.github.com')# 检查请求是否成功(状态码200-399)
if response.ok:# 将响应内容解析为JSON格式data = response.json()# 输出特定的JSON字段内容print(data['current_user_url'])
else:# 输出错误信息print('请求失败')
指令解析:
response.ok
:返回布尔值,表示请求是否成功。data['current_user_url']
:访问JSON数据中的特定字段。
3. API数据抓取与处理
3.1 理解API
API(应用程序编程接口)是软件之间的交互接口,允许我们获取特定的数据或服务。
3.2 调用RESTful API
import requests # 导入requests库# 定义API的URL
url = 'https://api.openweathermap.org/data/2.5/weather'# 定义请求参数,包括城市名称和API密钥
params = {'q': 'Beijing', 'appid': 'your_api_key'}# 发送GET请求,获取天气数据
response = requests.get(url, params=params)# 将响应内容解析为JSON格式,并输出
print(response.json())
指令解析:
params
:包含API需要的参数,如城市名q
和API密钥appid
。- 注意:请将
'your_api_key'
替换为您实际的API密钥。
3.3 解析JSON数据
# 将响应内容解析为JSON格式
data = response.json()# 从JSON数据中提取温度和天气描述
temperature = data['main']['temp']
weather = data['weather'][0]['description']# 输出温度和天气信息
print(f"温度:{temperature}")
print(f"天气:{weather}")
指令解析:
data['main']['temp']
:访问JSON数据中main
对象下的temp
字段。data['weather'][0]['description']
:访问weather
数组中第一个元素的description
字段。
3.4 错误处理与异常捕获
try:# 发送GET请求response = requests.get(url, params=params)# 如果状态码不是200,抛出HTTPError异常response.raise_for_status()
except requests.exceptions.HTTPError as err:# 捕获HTTP错误,并输出错误信息print(f"HTTP错误:{err}")
except Exception as err:# 捕获其他异常,并输出错误信息print(f"其他错误:{err}")
else:# 请求成功,处理数据data = response.json()# ...(数据处理代码)
指令解析:
try...except...else
结构:用于捕获和处理异常。response.raise_for_status()
:检查响应状态码,非200则抛出异常。except requests.exceptions.HTTPError
:专门捕获HTTP错误。
4. 爬虫简介(BeautifulSoup)
BeautifulSoup
是一个用于从HTML或XML文件中提取数据的库。
4.1 安装BeautifulSoup
pip install beautifulsoup4
4.2 获取网页内容
import requests # 导入requests库# 目标网页的URL
url = 'https://www.python.org/'# 发送GET请求,获取网页内容
response = requests.get(url)# 以字节形式获取响应内容(适用于非文本内容)
html_content = response.content
指令解析:
response.content
:获取响应的二进制内容,适用于处理图片、文件等。
4.3 解析HTML
from bs4 import BeautifulSoup # 从bs4库中导入BeautifulSoup类# 使用BeautifulSoup解析HTML内容,指定解析器为html.parser
soup = BeautifulSoup(html_content, 'html.parser')
指令解析:
BeautifulSoup(html_content, 'html.parser')
:创建BeautifulSoup对象,准备解析HTML。
4.4 提取数据
# 查找所有<li>标签,且class属性为'menu-item'的元素
events = soup.find_all('li', class_='menu-item')# 遍历找到的元素
for event in events:# 获取元素的文本内容title = event.get_text()# 在元素中查找<a>标签,获取其href属性(链接)link = event.find('a')['href']# 输出标题和链接print(f"标题:{title}, 链接:{link}")
指令解析:
soup.find_all('li', class_='menu-item')
:按标签名和类名搜索元素。event.get_text()
:提取元素内的纯文本。event.find('a')['href']
:在元素中查找<a>
标签,并获取href
属性值。
4.5 数据存储
import csv # 导入csv模块# 以写模式打开名为events.csv的文件,指定编码为utf-8
with open('events.csv', 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file) # 创建csv写入对象writer.writerow(['标题', '链接']) # 写入表头# 遍历之前提取的数据for event in events:title = event.get_text() # 获取标题link = event.find('a')['href'] # 获取链接writer.writerow([title, link]) # 写入一行数据
指令解析:
with open(...) as file
:上下文管理器,确保文件正确关闭。csv.writer(file)
:创建用于写入CSV文件的writer对象。writer.writerow([title, link])
:将标题和链接写入CSV文件中。
5. 实战案例:从零构建简易爬虫
5.1 确定目标网站
选择一个新闻网站,目标是获取首页的新闻标题和链接。
5.2 编写爬虫代码
import requests # 导入requests库
from bs4 import BeautifulSoup # 导入BeautifulSoup类# 目标网站的URL
url = 'https://news.ycombinator.com/'# 发送GET请求,获取网页内容
response = requests.get(url)# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')# 查找所有<a>标签,且class属性为'storylink'的元素
articles = soup.find_all('a', class_='storylink')# 遍历每篇文章
for article in articles:title = article.get_text() # 获取文章标题link = article['href'] # 获取文章链接print(f"标题:{title}") # 输出标题print(f"链接:{link}") # 输出链接print('-' * 40) # 输出分隔线
指令解析:
response.text
:以字符串形式获取响应内容(适用于文本内容)。soup.find_all('a', class_='storylink')
:查找所有符合条件的<a>
标签。print('-' * 40)
:打印40个-
符号,作为分隔线。
5.3 数据清洗与保存
import pandas as pd # 导入pandas库data = [] # 初始化数据列表# 遍历每篇文章,提取信息并添加到数据列表
for article in articles:title = article.get_text() # 获取标题link = article['href'] # 获取链接data.append({'标题': title, '链接': link}) # 添加到数据列表# 将数据列表转换为DataFrame对象
df = pd.DataFrame(data)# 将数据导出为CSV文件,不包含索引,编码为utf-8
df.to_csv('news.csv', index=False, encoding='utf-8')
指令解析:
data.append({...})
:将字典形式的数据添加到列表中。pd.DataFrame(data)
:将列表转换为DataFrame,便于数据处理和分析。df.to_csv()
:将DataFrame导出为CSV文件,参数index=False
表示不导出行索引。
结论
通过本教程,我们学习了Python网络编程的核心知识。从使用requests
库发送网络请求,到调用API并处理返回的数据,再到利用BeautifulSoup
进行网页解析和信息提取,我们逐步深入,解析了每一个关键指令,帮助您全面理解其背后的原理和应用。
网络编程是现代开发者的必备技能,它不仅能帮助我们获取互联网的丰富资源,还能为我们的项目提供强大的数据支持。掌握了这些技能,您就能够自主编写爬虫、调用各类API,甚至构建自己的网络服务。