FastAPI与Selenium:打造高效的Web数据抓取服务

devtools/2025/2/6 11:44:07/

<a class=爬虫代理" />

引言

在互联网数据采集中,图片数据往往占据了重要位置。Pixabay作为一个免版权图片网站,拥有海量优质图片。本文将展示如何利用FastAPI搭建一个RESTful接口,通过Selenium模拟浏览器行为访问Pixabay,并使用代理IP、User-Agent和Cookie配置提高爬虫稳定性,进而采集页面中图片及其相关描述信息。

环境准备

本文示例依赖以下第三方库:

  • FastAPI:用于搭建API接口;
  • Uvicorn:作为ASGI服务器运行FastAPI应用;
  • Selenium:用于模拟浏览器操作,实现数据抓取;
  • ChromeDriver:与Chrome浏览器版本匹配的驱动程序。

安装命令示例:

pip install fastapi uvicorn selenium

代理IP、User-Agent与Cookie配置说明

  1. 代理IP技术
    使用代理IP可以有效防止目标网站对单一IP的封禁。本文以亿牛云爬虫代理为例,配置了代理的域名、端口、用户名和密码,通过ChromeOptions传递给Selenium。
  2. User-Agent设置
    为了模拟真实用户访问,在浏览器启动时设置User-Agent,降低被反爬的风险。
  3. Cookie设置
    Cookie可用于维持会话状态或绕过部分反爬策略。在访问Pixabay后,添加Cookie可以确保后续操作更贴近真实浏览器行为。

代码实现

以下代码示例展示了如何整合FastAPI和Selenium,实现对Pixabay页面的访问及图片数据采集。代码中包含详细的中文注释,便于理解各步骤的作用。

python"># -*- coding: utf-8 -*-
"""
FastAPI与Selenium结合示例:
通过FastAPI提供API接口,使用Selenium进行网页抓取。
代码中配置了代理IP(参考亿牛云爬虫代理www.16yun.cn)、User-Agent和Cookie。
此示例访问 https://pixabay.com ,采集页面中的图片及其相关信息。
"""from fastapi import FastAPI
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import timeapp = FastAPI()def create_driver():# 初始化Chrome选项chrome_options = Options()# 设置User-Agent,模拟真实浏览器请求user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \"(KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"chrome_options.add_argument(f"user-agent={user_agent}")# 配置代理IP参数(参考亿牛云爬虫代理)proxy_host = "proxy.16yun.cn"      # 代理域名proxy_port = "8000"                    # 代理端口proxy_user = "your_username"           # 代理用户名proxy_pass = "your_password"           # 代理密码# 拼接代理字符串,格式为:username:password@host:portproxy = f"{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"chrome_options.add_argument(f"--proxy-server=http://{proxy}")# 可选:如果需要无头模式(不打开浏览器窗口),取消下行注释# chrome_options.add_argument("--headless")# 初始化Chrome WebDriverdriver = webdriver.Chrome(options=chrome_options)# 预先访问目标网站,设置Cookie示例(Cookie需与目标域名匹配)driver.get("https://pixabay.com")driver.add_cookie({"name": "example_cookie",    # Cookie名称"value": "cookie_value",     # Cookie值"domain": "pixabay.com"      # Cookie对应的域名})return driver@app.get("/crawl")
def crawl():"""接口说明:该接口使用Selenium访问 https://pixabay.com 页面,采集页面中所有图片的URL及其相关描述信息(通过alt属性提供),并以JSON格式返回采集结果。"""try:# 创建Selenium WebDriver实例driver = create_driver()# 访问目标URL:Pixabay首页driver.get("https://pixabay.com")# 等待页面加载(根据实际情况可调整等待时间)time.sleep(5)# 查找页面中所有的img标签元素img_elements = driver.find_elements(By.TAG_NAME, "img")# 存储图片信息的列表images_info = []# 遍历所有图片元素,提取图片URL和描述信息(alt属性)for img in img_elements:src = img.get_attribute("src")alt = img.get_attribute("alt")# 如果图片URL不存在则跳过if not src:continueimages_info.append({"src": src,"alt": alt})except Exception as e:# 捕获异常并返回错误信息return {"error": str(e)}finally:# 关闭浏览器,释放资源driver.quit()return {"total_images": len(images_info), "images": images_info}# 启动FastAPI服务(在命令行中运行: uvicorn main:app --host 0.0.0.0 --port 8000)
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

代码说明

  1. 代理配置
    create_driver函数中,通过chrome_options.add_argument("--proxy-server=http://{proxy}")设置了代理IP,其中代理信息参考亿牛云爬虫代理的参数。
  2. User-Agent设置
    利用chrome_options.add_argument(f"user-agent={user_agent}")模拟真实浏览器请求,帮助绕过部分反爬机制。
  3. Cookie设置
    通过在访问Pixabay后添加Cookie(示例中为example_cookie),使得后续请求更接近真实浏览器行为。
  4. 图片信息采集
    /crawl接口中,通过driver.find_elements(By.TAG_NAME, "img")获取页面中所有图片元素,并提取每个图片src图片链接)和alt图片描述)属性,构造成列表返回。
  5. FastAPI接口
    FastAPI提供的/crawl接口无需传入参数,直接访问Pixabay首页采集图片数据,适用于展示或后续数据处理流程。

总结

本文通过实际案例演示了如何使用FastAPI和Selenium构建一个Web数据抓取服务。通过配置代理IP、User-Agent和Cookie,我们能够更稳健地访问目标网站(此处为Pixabay),并采集其中的图片及相关信息。在实际应用中,可根据需求扩展数据解析逻辑、增加错误重试机制或并行处理策略,进一步优化抓取效率与鲁棒性。

希望这篇文章及示例代码能为你构建高效爬虫服务提供有价值的参考。


http://www.ppmy.cn/devtools/156525.html

相关文章

深度学习之“线性代数”

线性代数在深度学习中是解决多维数学对象计算问题的核心工具。这些数学对象包括标量、向量、矩阵和张量&#xff0c;借助它们可以高效地对数据进行操作和建模。以下将详细介绍这些数学对象及其在深度学习中的典型用途。 数学对象概述 标量 标量是最简单的数学对象&#xff0…

3. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--环境搭建

构建现代云原生应用程序时&#xff0c;开发环境的搭建至关重要。NET Aspire 作为一款专为云原生应用设计的开发框架&#xff0c;提供了一整套工具、模板和集成包&#xff0c;旨在简化分布式系统的构建和管理。开始项目初始化之前&#xff0c;确保开发环境的正确配置是成功的第一…

深度学习 Pytorch 神经网络的学习

本节将从梯度下降法向外拓展&#xff0c;介绍更常用的优化算法&#xff0c;实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型&#xff0c;可能会有数百个 w w w的存在&#xff0c;同时如果我们使用的是像交叉熵这样…

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域&#xff0c;周围八个格子分别放置了不同的奖品名称&#xff0c;中间是一个 “开始抽奖” 的按钮。点击按钮后&#xff0c;抽奖区域的格子会快速滚动&#xff0c;颜色不断变化&#xf…

Leetcode面试高频题分类刷题总结

https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类&#xff08;Sort&#xff09;&#xff1a; 基础知识&#xff1a;快速排序&#xff08;Quick Sort&#xff09;&#xff0c; 归并排序&#xff08;Merge Sort&#xff09;的…

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…

pthread_cond_timedwait的概念和使用案例

pthread_cond_timedwait 是 POSIX 线程库中用于条件变量等待的函数&#xff0c;允许线程在等待某个条件时设置超时时间。以下是其概念和示例&#xff1a; 概念 作用 线程等待条件变量被触发&#xff0c;但最多等待到指定的超时时间。若超时前条件未被触发&#xff0c;线程自动唤…

android java 用系统弹窗的方式实现模拟点击动画特效

接上一篇&#xff1a;android java系统弹窗的基础模板-CSDN博客 本篇记录的是系统弹窗的一个应用示例&#xff1a;实现点击动画效果 首先模拟点击的实现参考&#xff1a;android模拟点击_motionevent upevent motionevent.obtain(systemclo-CSDN博客 动画效果&#xff0c;是…