Python爬虫技术 第11节 发送GET和POST请求

embedded/2024/10/18 18:13:56/

使用爬虫技术来从网页抓取数据或与API进行交互通常涉及几个关键步骤。这里我将指导你如何使用Python的requests库来发送GET和POST请求,以及如何解析返回的数据。

1. 安装必要的库

首先,确保你已经安装了requests库,如果还没有安装,可以通过以下命令安装:

pip install requests

2. 发送GET请求

GET请求通常用于获取信息,比如从一个API获取单词定义。下面是一个示例代码,它向一个虚构的API发送GET请求来获取单词定义:

python">import requestsdef get_word_definition(word):url = f"https://api.example.com/words/{word}"response = requests.get(url)if response.status_code == 200:data = response.json()return data['definition']else:return Noneprint(get_word_definition('example'))

3. 发送POST请求

POST请求通常用于提交数据到服务器,例如,你可以用POST请求来添加新的单词到你的单词管理系统中。假设我们有一个API允许我们这样做,代码如下:

python">import requests
import jsondef add_word_to_system(word, definition):url = "https://api.example.com/words"headers = {'Content-Type': 'application/json'}payload = {'word': word, 'definition': definition}response = requests.post(url, data=json.dumps(payload), headers=headers)if response.status_code == 201:print(f"Word '{word}' added successfully.")else:print("Failed to add the word.")add_word_to_system('example', 'A sample or model.')

4. 解析HTML网页(使用BeautifulSoup)

如果你需要从HTML网页抓取数据,可以使用BeautifulSoup库来解析HTML。先安装beautifulsoup4

pip install beautifulsoup4

然后,使用requests获取网页内容,再用BeautifulSoup解析:

python">from bs4 import BeautifulSoup
import requestsdef get_word_from_web(word):url = f"https://www.dictionary.com/browse/{word}"response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')definition = soup.find('div', {'class': 'css-1o56a8i e1hk9ate4'}).get_text()return definition.strip()else:return Noneprint(get_word_from_web('example'))

请注意,实际的网站结构可能与上述代码中的选择器不同,因此在使用时需要根据目标网站的具体HTML结构进行调整。

5. 错误处理

在发送网络请求时,应该始终包含错误处理逻辑,以应对网络问题、服务器错误或数据解析错误等异常情况。

以上就是使用Python和requests库进行GET和POST请求的基本方法,以及如何解析HTML网页的方法。如果你有具体的目标网站或API,可能需要对这些代码进行相应的调整。

当然,我们可以增加一些实用的功能,如错误处理、重试机制、日志记录等。以下是改进后的示例代码:

GET 请求示例 - 获取单词定义

python">import requests
import logginglogging.basicConfig(level=logging.INFO)def get_word_definition(word):base_url = "https://api.example.com/words/"url = base_url + wordtry:response = requests.get(url)response.raise_for_status()  # Raises an HTTPError for bad responses (4xx and 5xx)data = response.json()return data['definition']except requests.RequestException as e:logging.error(f"Request failed: {e}")return Noneexcept (KeyError, ValueError) as e:logging.error(f"Failed to parse response: {e}")return None# 使用示例
word = 'example'
definition = get_word_definition(word)
if definition:print(f"The definition of '{word}' is: {definition}")
else:print(f"Could not retrieve definition for '{word}'.")

POST 请求示例 - 向系统添加单词

python">import requests
import json
import logginglogging.basicConfig(level=logging.INFO)def add_word_to_system(word, definition):url = "https://api.example.com/words"headers = {'Content-Type': 'application/json'}payload = {'word': word, 'definition': definition}try:response = requests.post(url, data=json.dumps(payload), headers=headers)response.raise_for_status()print(f"Word '{word}' added successfully.")except requests.RequestException as e:logging.error(f"Request failed: {e}")# 使用示例
word = 'example'
definition = 'A sample or model.'
add_word_to_system(word, definition)

HTML 解析示例 - 从网页获取单词定义

python">from bs4 import BeautifulSoup
import requests
import logginglogging.basicConfig(level=logging.INFO)def get_word_from_web(word):base_url = "https://www.dictionary.com/browse/"url = base_url + wordtry:response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')definition = soup.find('div', {'class': 'css-1o56a8i e1hk9ate4'})if definition:return definition.get_text().strip()else:logging.warning("Definition not found on page.")return Noneexcept requests.RequestException as e:logging.error(f"Request failed: {e}")return None# 使用示例
word = 'example'
definition = get_word_from_web(word)
if definition:print(f"The definition of '{word}' from the web is: {definition}")
else:print(f"Could not retrieve definition for '{word}' from the web.")

以上代码中,我们加入了基本的日志记录,这有助于在出现问题时调试。同时,我们使用response.raise_for_status()来自动检测HTTP错误,并通过异常处理来优雅地处理这些问题。此外,对于HTML解析,我们检查了是否找到了预期的元素,如果没有找到,则发出警告。这些都是在开发爬虫或网络应用程序时非常重要的实践。

可以考虑增加一些更高级的功能,例如使用代理、设置超时、以及实现重试机制。以下是这些功能的代码实现:

设置代理和超时

在发送请求时,你可能需要通过代理服务器来发送请求,或者设置请求的超时时间。这是修改后的get_word_definition函数:

python">import requests
import logging
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retrylogging.basicConfig(level=logging.INFO)def get_word_definition(word, proxies=None, timeout=10):base_url = "https://api.example.com/words/"url = base_url + wordsession = requests.Session()retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])adapter = HTTPAdapter(max_retries=retry)session.mount('http://', adapter)session.mount('https://', adapter)try:response = session.get(url, proxies=proxies, timeout=timeout)response.raise_for_status()data = response.json()return data['definition']except requests.RequestException as e:logging.error(f"Request failed: {e}")return Noneexcept (KeyError, ValueError) as e:logging.error(f"Failed to parse response: {e}")return None

在这个例子中,我们引入了requestsSession对象和Retry类,以便可以设定重试次数和超时时间。我们还允许传递代理参数和超时值。

使用代理

如果你需要通过代理服务器发送请求,可以这样调用:

python">proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}word = 'example'
definition = get_word_definition(word, proxies=proxies)

实现重试机制

上面的例子中,我们已经在get_word_definition函数中实现了重试机制,但如果你想为所有请求都添加重试,可以在会话级别设置:

python">session = requests.Session()
retry_strategy = Retry(total=3,status_forcelist=[429, 500, 502, 503, 504],method_whitelist=["HEAD", "GET", "OPTIONS"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)

这样,无论你使用session.get()还是session.post(),都会应用相同的重试策略。

这些是构建健壮网络请求的一些常见做法。在实际部署中,你可能还需要考虑认证、证书验证、并发控制等更多细节。希望这些信息对你有帮助!如果有任何特定需求或疑问,随时告诉我。


http://www.ppmy.cn/embedded/85606.html

相关文章

MarkTool之TCP服务端

TCP服务端,主要作用是与TCP客户端连接进行数据通讯 1、监听参数就2个,监听的IP和监听的Port 2、如果监听到有客户端,则表格中就会显示客户端的IP和Port 3、接收数据和发送数据的参数设置,有16进制,有字符,…

iOS ------ Block的相关问题

Block的定义 Block可以截获局部变量的匿名函数&#xff0c; 是将函数及其执行上下文封装起来的对象。 Block的实现 通过Clang将以下的OC代码转化为C代码 // Clang xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m//main.m #import <Foundation/Foundation.…

数据结构:基础概念

一、相关概念 概念 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff1a;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff1a;数据和数据之间是一对一的关系 树&#xff1a; 一对多 图&#xff1a;多对多 物理结构(在内存当中的存储关系)…

探索Perl的奇妙世界:入门学习与实战指南

一、Perl语言概述 1.1 Perl的起源与发展 Perl&#xff08;Practical Extraction and Reporting Language&#xff09;是一种高级、解释型、动态编程语言&#xff0c;由Larry Wall于1987年发明。Perl的初衷是作为一种文本处理工具&#xff0c;帮助系统管理员在Unix系统中处理报…

Golang | Leetcode Golang题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 func isPerfectSquare(x int) bool {y : int(math.Sqrt(float64(x)))return y*y x }// 判断是否能表示为 4^k*(8m7) func checkAnswer4(x int) bool {for x%4 0 {x / 4}return x%8 7 }func numSquares(n int) i…

视频怎么加密?常见的四种视频加密方法和软件

视频加密是一种重要的技术手段&#xff0c;用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中&#xff0c;安企神软件作为一种专业的加密工具&#xff0c;可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密&#xff0c;并探讨视频加密…

hcip学习 多实例生成树,VRRP工作原理

一、STP 和 RSTP 解决了什么问题 1、STP&#xff1a;解决了在冗余的二层网络中所出现的环路问题 2、RSTP&#xff1a;在 STP 的基础上&#xff0c;解决了 STP 收敛速度慢的问题&#xff0c;引入了一些 STP 保护机制&#xff0c;使其网络更加稳定 二、MSTP 针对 RSTP 的改进 …

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…