Python 课程7-网络编程

前言

        在数字化高速发展的今天,网络编程已成为每个开发者的必备技能。从数据采集、接口调用到信息挖掘,网络编程的应用无处不在。本教程将带您深入探索Python的网络编程世界,详细讲解requests库的使用、API数据的抓取与处理,以及如何利用BeautifulSoup进行网页爬虫。我们将逐步解析每个指令,助您快速掌握这门技能,成为网络编程的高手!


目录

  1. 网络编程简介
    • 1.1 什么是网络编程
    • 1.2 网络编程的应用场景
  2. 网络请求(requests 库)
    • 2.1 安装requests库
    • 2.2 发送GET请求
    • 2.3 发送POST请求
    • 2.4 设置请求头和参数
    • 2.5 处理响应
  3. API数据抓取与处理
    • 3.1 理解API
    • 3.2 调用RESTful API
    • 3.3 解析JSON数据
    • 3.4 错误处理与异常捕获
  4. 爬虫简介(BeautifulSoup)
    • 4.1 安装BeautifulSoup
    • 4.2 获取网页内容
    • 4.3 解析HTML
    • 4.4 提取数据
    • 4.5 数据存储
  5. 实战案例:从零构建简易爬虫
    • 5.1 确定目标网站
    • 5.2 编写爬虫代码
    • 5.3 数据清洗与保存
  6. 总结与进阶

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,甚至构建自己的网络服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值