当前位置:  首页>> 技术小册>> 实战Python网络爬虫

第十二章:实战二:使用Requests库进行网络请求

在网络爬虫的开发过程中,发起网络请求是获取目标网站数据的第一步。Python中,Requests库因其简单易用、功能强大而广受欢迎,成为许多开发者进行网络请求的首选工具。本章将深入探讨如何使用Requests库进行网络请求,包括基本请求方法、请求头与参数的设置、会话管理、异常处理以及高级功能如文件上传、Cookie处理、SSL验证等,旨在帮助读者通过实战案例掌握Requests库的高级应用技巧。

1. Requests库简介

Requests是一个用Python编写的HTTP库,它使得发送HTTP/1.1请求变得非常简单。Requests遵循了Python的urlliburllib2的API,但在很多方面进行了改进和优化,使得发送请求和解析响应变得更加直观和方便。它支持HTTP连接池、会话对象、文件上传、自动内容解码等特性。

2. 安装Requests库

在开始之前,确保你已经安装了Requests库。如果尚未安装,可以通过pip命令轻松安装:

  1. pip install requests

3. 基本请求方法

Requests库支持多种HTTP请求方法,包括GET、POST、PUT、DELETE等。以下是一些基本请求方法的示例:

3.1 GET请求

GET请求是最常见的HTTP请求之一,用于请求数据。使用requests.get()方法发起GET请求:

  1. import requests
  2. url = 'https://httpbin.org/get'
  3. response = requests.get(url)
  4. print(response.status_code) # 打印响应状态码
  5. print(response.text) # 打印响应体(字符串格式)
  6. print(response.json()) # 如果响应是JSON,则直接解析并打印
3.2 POST请求

POST请求通常用于提交数据到服务器,如表单提交。使用requests.post()方法发起POST请求:

  1. import requests
  2. url = 'https://httpbin.org/post'
  3. data = {'key': 'value'}
  4. response = requests.post(url, data=data)
  5. print(response.text)

4. 请求头与参数

在发起网络请求时,经常需要设置请求头(Headers)或查询参数(Query Parameters)来模拟浏览器行为或传递额外信息。

4.1 设置请求头
  1. headers = {
  2. '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'
  3. }
  4. response = requests.get(url, headers=headers)
4.2 设置查询参数
  1. params = {'key1': 'value1', 'key2': 'value2'}
  2. response = requests.get(url, params=params)

5. 会话管理

Requests库的会话对象(Session)允许你在多个请求之间保持某些参数,如cookies、headers等,非常适合需要登录验证的网站爬取。

  1. import requests
  2. session = requests.Session()
  3. # 第一次请求登录
  4. session.post('https://example.com/login', data={'username': 'user', 'password': 'pass'})
  5. # 之后的请求都会带上登录后的cookies
  6. response = session.get('https://example.com/profile')
  7. print(response.text)

6. 异常处理

在网络请求过程中,可能会遇到各种异常,如网络问题、请求超时、服务器错误等。Requests库通过抛出异常的方式处理这些问题,开发者可以通过try-except语句来捕获并处理这些异常。

  1. import requests
  2. from requests.exceptions import RequestException
  3. try:
  4. response = requests.get('http://non-existent-domain.com')
  5. response.raise_for_status() # 如果响应状态码不是200,则抛出HTTPError异常
  6. except RequestException as e:
  7. print(e)

7. 高级功能

7.1 文件上传

使用POST请求上传文件时,可以将文件作为文件对象传递给files参数。

  1. files = {'file': open('report.xlsx', 'rb')}
  2. response = requests.post('https://httpbin.org/post', files=files)

Requests库会自动处理cookies,但你也可以手动设置或获取cookies。

  1. # 设置cookies
  2. cookies = {'user_session': 'abcdef123456'}
  3. response = requests.get(url, cookies=cookies)
  4. # 获取cookies
  5. print(response.cookies)
7.3 SSL验证

默认情况下,Requests会验证SSL证书。如果目标网站使用了自签名证书,你可能需要禁用SSL验证(注意:这可能会使你的请求容易受到中间人攻击)。

  1. response = requests.get(url, verify=False)

8. 实战案例:爬取网页数据

假设我们要爬取一个新闻网站的首页标题列表,该网站要求用户登录后才能访问部分内容。我们可以使用Requests库模拟登录,然后抓取所需数据。

  1. import requests
  2. from bs4 import BeautifulSoup # 引入BeautifulSoup用于解析HTML
  3. # 模拟登录
  4. login_url = 'https://news.example.com/login'
  5. session = requests.Session()
  6. session.post(login_url, data={'username': 'user', 'password': 'pass'})
  7. # 访问首页并解析标题
  8. home_url = 'https://news.example.com/'
  9. response = session.get(home_url)
  10. soup = BeautifulSoup(response.text, 'html.parser')
  11. titles = [title.get_text() for title in soup.find_all('h2', class_='news-title')]
  12. print(titles)

总结

本章通过详细的示例和解释,介绍了如何使用Requests库进行网络请求,包括基本请求方法、请求头与参数的设置、会话管理、异常处理以及高级功能如文件上传、Cookie处理、SSL验证等。通过实战案例的展示,希望读者能够掌握Requests库在网络爬虫开发中的应用技巧,为后续的网络爬虫项目打下坚实的基础。


该分类下的相关小册推荐: