在网络爬虫的开发过程中,发起网络请求是获取目标网站数据的第一步。Python中,Requests
库因其简单易用、功能强大而广受欢迎,成为许多开发者进行网络请求的首选工具。本章将深入探讨如何使用Requests
库进行网络请求,包括基本请求方法、请求头与参数的设置、会话管理、异常处理以及高级功能如文件上传、Cookie处理、SSL验证等,旨在帮助读者通过实战案例掌握Requests
库的高级应用技巧。
Requests
是一个用Python编写的HTTP库,它使得发送HTTP/1.1请求变得非常简单。Requests
遵循了Python的urllib
和urllib2
的API,但在很多方面进行了改进和优化,使得发送请求和解析响应变得更加直观和方便。它支持HTTP连接池、会话对象、文件上传、自动内容解码等特性。
在开始之前,确保你已经安装了Requests
库。如果尚未安装,可以通过pip命令轻松安装:
pip install requests
Requests
库支持多种HTTP请求方法,包括GET、POST、PUT、DELETE等。以下是一些基本请求方法的示例:
GET请求是最常见的HTTP请求之一,用于请求数据。使用requests.get()
方法发起GET请求:
import requests
url = 'https://httpbin.org/get'
response = requests.get(url)
print(response.status_code) # 打印响应状态码
print(response.text) # 打印响应体(字符串格式)
print(response.json()) # 如果响应是JSON,则直接解析并打印
POST请求通常用于提交数据到服务器,如表单提交。使用requests.post()
方法发起POST请求:
import requests
url = 'https://httpbin.org/post'
data = {'key': 'value'}
response = requests.post(url, data=data)
print(response.text)
在发起网络请求时,经常需要设置请求头(Headers)或查询参数(Query Parameters)来模拟浏览器行为或传递额外信息。
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)
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get(url, params=params)
Requests
库的会话对象(Session)允许你在多个请求之间保持某些参数,如cookies、headers等,非常适合需要登录验证的网站爬取。
import requests
session = requests.Session()
# 第一次请求登录
session.post('https://example.com/login', data={'username': 'user', 'password': 'pass'})
# 之后的请求都会带上登录后的cookies
response = session.get('https://example.com/profile')
print(response.text)
在网络请求过程中,可能会遇到各种异常,如网络问题、请求超时、服务器错误等。Requests
库通过抛出异常的方式处理这些问题,开发者可以通过try-except语句来捕获并处理这些异常。
import requests
from requests.exceptions import RequestException
try:
response = requests.get('http://non-existent-domain.com')
response.raise_for_status() # 如果响应状态码不是200,则抛出HTTPError异常
except RequestException as e:
print(e)
使用POST请求上传文件时,可以将文件作为文件对象传递给files
参数。
files = {'file': open('report.xlsx', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
Requests
库会自动处理cookies,但你也可以手动设置或获取cookies。
# 设置cookies
cookies = {'user_session': 'abcdef123456'}
response = requests.get(url, cookies=cookies)
# 获取cookies
print(response.cookies)
默认情况下,Requests
会验证SSL证书。如果目标网站使用了自签名证书,你可能需要禁用SSL验证(注意:这可能会使你的请求容易受到中间人攻击)。
response = requests.get(url, verify=False)
假设我们要爬取一个新闻网站的首页标题列表,该网站要求用户登录后才能访问部分内容。我们可以使用Requests
库模拟登录,然后抓取所需数据。
import requests
from bs4 import BeautifulSoup # 引入BeautifulSoup用于解析HTML
# 模拟登录
login_url = 'https://news.example.com/login'
session = requests.Session()
session.post(login_url, data={'username': 'user', 'password': 'pass'})
# 访问首页并解析标题
home_url = 'https://news.example.com/'
response = session.get(home_url)
soup = BeautifulSoup(response.text, 'html.parser')
titles = [title.get_text() for title in soup.find_all('h2', class_='news-title')]
print(titles)
本章通过详细的示例和解释,介绍了如何使用Requests
库进行网络请求,包括基本请求方法、请求头与参数的设置、会话管理、异常处理以及高级功能如文件上传、Cookie处理、SSL验证等。通过实战案例的展示,希望读者能够掌握Requests
库在网络爬虫开发中的应用技巧,为后续的网络爬虫项目打下坚实的基础。