杰瑞科技汇

Python3 requests爬虫如何入门?

  1. 准备工作:安装 requests 和其他必要库。
  2. 基础入门:发送最简单的 GET 和 POST 请求。
  3. 响应处理:解析响应内容、状态码、请求头等。
  4. 实战案例:爬取一个简单的静态网页。
  5. 处理动态网页:使用 Seleniumrequests 结合。
  6. 高级主题:处理 cookies、session、代理、反爬虫机制等。
  7. 最佳实践与道德规范:做一个负责任的爬虫。

准备工作

你需要安装 requests 库,如果还没有安装,打开你的终端或命令行工具,运行:

Python3 requests爬虫如何入门?-图1
(图片来源网络,侵删)
pip install requests

为了更好地处理数据,我们通常会安装 lxml(一个高效的 HTML/XML 解析器)和 beautifulsoup4(一个更友好的解析库)。

pip install lxml beautifulsoup4

基础入门

requests 的核心思想是让你用最少的代码完成最多的工作。

发送 GET 请求

GET 请求用于从服务器获取数据,比如浏览网页。

import requests
# 目标 URL
url = 'https://www.httpbin.org/get'
# 发送 GET 请求
response = requests.get(url)
# 打印响应对象
print(response)
# <Response [200]>

response 对象包含了服务器返回的所有信息。

Python3 requests爬虫如何入门?-图2
(图片来源网络,侵删)

发送 POST 请求

POST 请求用于向服务器提交数据,比如登录表单。

import requests
# 目标 URL
url = 'https://www.httpbin.org/post'
# 要提交的数据 (字典格式)
data = {
    'name': 'John Doe',
    'age': 30
}
# 发送 POST 请求
response = requests.post(url, data=data)
# 打印响应内容
print(response.text)

data 参数会被自动编码成 application/x-www-form-urlencoded 格式。


响应处理

response 对象提供了很多有用的属性和方法来处理服务器返回的数据。

import requests
url = 'https://www.httpbin.org/get'
response = requests.get(url)
# 1. 状态码
# 200 表示成功,404 表示未找到,403 表示禁止访问等
print(f"状态码: {response.status_code}")
# 2. 响应头
# 服务器返回的头部信息
print("\n响应头:")
print(response.headers)
# 3. 请求头
# 你发送请求时使用的头部信息
print("\n请求头:")
print(response.request.headers)
# 4. 响应内容
# .text 属性将响应内容作为字符串返回 (requests 会自动猜测编码)
print("\n响应内容 (文本):")
# print(response.text) # 这通常会输出很长的 JSON 字符串
# 5. 二进制内容
# 对于图片、PDF 等文件,使用 .content 获取原始字节
# response = requests.get('https://www.example.com/image.png')
# with open('image.png', 'wb') as f:
#     f.write(response.content)
# 6. JSON 内容
# 如果服务器返回的是 JSON 格式数据,可以用 .json() 直接解析成 Python 字典
# (如果响应不是有效的 JSON,会抛出 requests.exceptions.JSONDecodeError 异常)
print("\n响应内容 (JSON):")
json_data = response.json()
print(json_data)
print(json_data['url'])

实战案例:爬取名言网站

让我们来爬取一个简单的静态网站,http://quotes.toscrape.com/,这个网站专门用来练习爬虫。

Python3 requests爬虫如何入门?-图3
(图片来源网络,侵删)

目标:获取页面上所有的名言、作者和标签。

步骤

  1. 发送 GET 请求获取 HTML 内容。
  2. 使用 BeautifulSoup 解析 HTML。
  3. 通过 CSS 选择器或 XPath 定位到我们需要的数据。
  4. 提取并打印数据。
import requests
from bs4 import BeautifulSoup
import time
def scrape_quotes():
    """
    爬取 quotes.toscrape.com 网站的第一页名言
    """
    url = 'http://quotes.toscrape.com/'
    # 设置一个 User-Agent,模拟浏览器访问,有些网站会拒绝爬虫的请求
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    try:
        # 发送 GET 请求
        response = requests.get(url, headers=headers)
        # 如果请求失败 (状态码不是 200),则抛出异常
        response.raise_for_status() 
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return
    # 使用 BeautifulSoup 解析 HTML
    # 'lxml' 是一个解析器,比 Python 内置的 'html.parser' 更快
    soup = BeautifulSoup(response.text, 'lxml')
    # 找到所有包含名言的 div
    quotes = soup.find_all('div', class_='quote')
    for quote in quotes:
        # 提取名言文本
        text = quote.find('span', class_='text').get_text(strip=True)
        # 提取作者
        author = quote.find('small', class_='author').get_text(strip=True)
        # 提取标签
        tags = [tag.get_text(strip=True) for tag in quote.find_all('a', class_='tag')]
        print(f"名言: {text}")
        print(f"作者: {author}")
        print(f"标签: {', '.join(tags)}")
        print("-" * 20)
# 运行爬虫
scrape_quotes()

处理动态网页

很多现代网站(如淘宝、微博)的内容是通过 JavaScript 动态加载的。requests 只能获取初始的 HTML,无法执行 JS,这时,我们需要使用 Selenium

Selenium 是一个自动化测试工具,它可以控制一个真实的浏览器(如 Chrome、Firefox)来模拟人的操作,从而获取 JS 渲染后的页面内容。

准备工作

  1. 安装 Selenium: pip install selenium
  2. 下载对应浏览器的 WebDriver,如果你使用 Chrome,需要下载 ChromeDriver,并确保它在你的系统 PATH 中,或者指定其路径。

结合 requestsSelenium 的策略

  1. 用 Selenium 加载页面:获取 JS 渲染后的完整 HTML。
  2. requests 提交数据:如果后续需要频繁登录或提交表单,可以先手动在浏览器中完成,然后用 requestsSession 对象来复用登录状态,这比用 Selenium 自动填写表单更稳定、高效。

纯 Selenium 示例

from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
# 假设你已经下载了 chromedriver 并放在了 PATH 中
# 如果没有,需要指定路径: driver = webdriver.Chrome(executable_path='path/to/chromedriver')
driver = webdriver.Chrome()
url = 'http://quotes.toscrape.com/js/'
driver.get(url)
# 等待几秒钟,确保 JS 有足够时间执行
# 在实际项目中,最好使用 WebDriverWait 来智能等待
time.sleep(3) 
# 获取渲染后的页面源代码
page_source = driver.page_source
# 关闭浏览器
driver.quit()
# 现在我们可以用 BeautifulSoup 解析这个完整的 HTML 了
soup = BeautifulSoup(page_source, 'lxml')
quotes = soup.find_all('div', class_='quote')
for quote in quotes:
    text = quote.find('span', class_='text').get_text(strip=True)
    author = quote.find('small', class_='author').get_text(strip=True)
    print(f"名言: {text} - {author}")

高级主题

a. 处理 Cookies 和 Session

当你需要登录后才能访问某些页面时,需要处理 cookies。requests 提供了 Session 对象来保持会话。

import requests
# 创建一个 Session 对象
session = requests.Session()
# 1. 先发送登录请求,获取 cookies
login_url = 'https://example.com/login'
login_data = {'username': 'your_user', 'password': 'your_pass'}
# headers 可以包含 CSRF token 等
login_headers = {'User-Agent': 'My-Bot/1.0'}
# 登录后,Session 对象会自动保存 cookies
response = session.post(login_url, data=login_data, headers=login_headers)
print(f"登录状态码: {response.status_code}")
# 2. 再访问需要登录的页面,无需手动携带 cookies
protected_url = 'https://example.com/dashboard'
response = session.get(protected_url)
# 这个请求会自动带上之前登录时获取的 cookies
print(f"访问受保护页面的内容: {response.text[:100]}...")

b. 设置代理

为了防止 IP 被封,可以使用代理服务器。

proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}
response = requests.get('http://example.com', proxies=proxies)

c. 处理反爬虫机制

  • 设置 User-Agent:模拟浏览器,如前面案例所示。
  • 控制爬取频率:在两次请求之间加入延时,避免对服务器造成过大压力。
    import time
    time.sleep(1) # 暂停1秒
  • 使用代理池:轮换不同的 IP 地址。
  • 处理验证码:这是最棘手的问题,简单的验证码可以用 OCR 库(如 pytesseract)识别,复杂的则可能需要人工介入或使用第三方打码平台。

最佳实践与道德规范

做一个好的爬虫开发者,遵守道德规范至关重要。

  1. 检查 robots.txt:在爬取任何网站之前,先访问 http://www.example.com/robots.txt,这个文件告诉爬虫哪些页面可以爬,哪些不可以。
  2. 设置合理的 User-Agent:让网站管理员知道你是谁,你的爬虫是做什么的。
  3. 控制请求频率:不要发送过于密集的请求,给服务器喘息的时间。time.sleep() 是你的好朋友。
  4. 处理错误:使用 try...except 块来处理网络异常、超时等错误。
  5. 尊重数据版权:不要爬取和滥用受版权保护的数据。
  6. 遵守服务条款:有些网站的服务条款明确禁止爬虫行为。

requests 是 Python 爬虫工具箱中不可或缺的利器,从简单的静态网页到复杂的需要处理 cookies 和会话的应用,requests 都能轻松应对,当遇到动态网页时,再结合 Selenium,你就能应对绝大多数的爬虫场景。

技术是中立的,但使用技术的人需要有责任心,编写高效、稳定、且道德的爬虫,是每个开发者的责任。

分享:
扫描分享到社交APP
上一篇
下一篇