Docker网络和数据管理:提升你的Python爬虫

news/发布时间2024/5/15 7:46:53

在本篇博客中,我们将深入探讨Docker的网络和数据管理功能,并通过具体的代码案例演示如何为Python爬虫应用配置网络和持久化数据。

Docker的网络功能

Docker网络允许容器以多种方式互联,这对于构建多个服务需要通信的应用非常有用。默认情况下,Docker提供了几种网络模式:

  • bridge:默认的网络模式,为每个独立的容器提供了一个隔离的网络环境。
  • host:移除了网络隔离,容器会直接使用宿主机的网络。
  • none:禁用所有网络。
  • overlay:支持Docker Swarm,用于不同的宿主机上的容器间的通信。

创建自定义网络

我们可以创建一个自定义网络来确保我们的爬虫服务可以在隔离的环境中互联。

docker network create crawler-network

连接容器到网络

当运行容器时,可以通过​​--network​​标志将其连接到创建好的网络。

docker run --network=crawler-network --name my-crawler python-spider

Docker的数据管理

为了持久化数据和状态,Docker提供了卷(volumes)和绑定挂载(bind mounts)。

  • :由Docker管理的主机文件系统的一部分,非常适合持久化数据和共享数据。
  • 绑定挂载:直接映射了主机上的一个文件或目录到容器中,可以用来提供配置文件或修改源代码。

使用卷存储数据

假设我们的爬虫需要保存数据到一个CSV文件,我们可以创建一个卷来保存这些数据。

docker volume create crawler-data

然后,我们将这个卷挂载到容器的指定目录。

docker run --network=crawler-network -v crawler-data:/data --name my-crawler python-spider

在​​spider.py​​中,我们可以将爬取的数据写入到​​/data​​目录下的文件,这样即使容器停止运行,数据也不会丢失。

代码案例:配置网络和卷

让我们更新​​Dockerfile​​,以便在容器中的​​/data​​目录中保存爬虫输出。

# Use an official Python runtime as a parent image
FROM python:3.8# Set the working directory in the container
WORKDIR /usr/src/app# Copy the current directory contents into the container at /usr/src/app
COPY . .# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir requests beautifulsoup4# Define mountable directory
VOLUME /data# Run spider.py when the container launches
CMD ["python", "./spider.py"]

更新​​spider.py​​,让其将输出写入到​​/data​​目录。

import requests
from bs4 import BeautifulSoup
import csv
import osdef main(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')return soup.title.stringif __name__ == '__main__':urls = ['http://example.com']output_file = '/data/output.csv'# 确保/data目录存在os.makedirs(os.path.dirname(output_file), exist_ok=True)with open(output_file, 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow(['URL', 'Title'])for url in urls:title = main(url)print(f'URL: {url}')print(f'Title: {title}')writer.writerow([url, title])

现在,当我们运行Docker容器并将卷挂载到​​/data​​时,爬虫程序将把结果保存到这个卷中。

docker run --network=crawler-network -v crawler-data:/data --name my-crawler python-spider

总结

通过使用Docker的网络和数据管理功能,我们可以有效地为Python爬虫创建一个可复用、可伸缩且持久化的环境。Docker的网络功能允许容器之间的安全互联,而数据卷则确保了我们的数据是安全和可持续的,即使在容器重新启动后也不会丢失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/AUxg/3266.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台,找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK:SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字…

戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)

戏曲文化苑小程序目录 目录 基于微信小程序的戏曲文化苑系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 (1)戏曲管理 (2)公告信息管理 (3)公告类型管理…

板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 一、什么是HttpServletResponse二、响应数据的常用方法三、响应乱码问题字符流乱码字节流乱码 四、重定向:sendRedirect请求转发和重定向的区别 在上一节中,我们系统的学习了…

数据库架构师之道:MySQL安装与系统整合指南

目录 MySQL数据库安装(centos) 版本选择 企业版 社区版 选哪个 MySQL特点 MySQL服务端-客户端 mysql下载选择 软件包解释 安装MySQL的方式 rpm包安装 yum方式安装 源码编译安装★ 具体的编译安装步骤★★ 环境准备 free -m命令 cat /pr…

Flutter GLSL - 肆 | 从条纹到马赛克

theme: cyanosis Flutter & GLSL 系列文章: 《Flutter & GLSL - 壹 | Shader 让绘制无限强大》《Flutter & GLSL - 贰 | 从坐标到颜色》《Flutter & GLSL - 叁 | 变量传参》《Flutter & GLSL - 肆 | 从条纹到马赛克》 案例代码开源地址 【skele…

C++学习之list容器

C++ list基本概念 在C++中,std::list是一个双向链表(doubly linked list)容器,它包含在 <list> 头文件中。下面是一些关于C++ std::list的基本概念: 双向链表结构:std::list是由多个节点组成的双向链表结构,每个节点包含数据元素和指向前一个节点和后一个节点的指…

树-王道-复试

树 1.度&#xff1a; 树中孩子节点个数&#xff0c;所有结点的度最大值为 树的度 2.有序树&#xff1a; 逻辑上看&#xff0c;树中结点的各子树从左至右是有次序的&#xff0c;不能互换。 **3.**树的根节点没有前驱&#xff0c;其他节点只有一个前驱 **4.**所有节点可有零个或…

wondows10用Electron打包threejs的项目记录

背景 电脑是用的mac&#xff0c;安装了parallels desktop ,想用electron 想同时打包出 苹果版本和windows版本。因为是在虚拟机里安装&#xff0c;它常被我重装&#xff0c;所以记录一下打包的整个过程。另外就是node生态太活跃&#xff0c;几个依赖没记录具体版本&#xff0…

Flink中的双流Join

1. Flink中双流Join介绍 Flink版本Join支持类型Join API1.4innerTable/SQL1.5inner,left,right,fullTable/SQL1.6inner,left,right,fullTable/SQL/DataStream Join大体分为两种&#xff1a;Window Join 和 Interval Join 两种。 Window Join又可以根据Window的类型细分为3种…

Kotlin 进阶版 协程

kotlin是协程的一种实现 Dispatchers.IO&#xff1a;适用于执行磁盘或网络 I/O 操作的调度器&#xff0c;例如文件读写、网络请求等。在 Android 中&#xff0c;Dispatchers.IO 会使用一个专门的线程池来处理这些操作&#xff0c;以防止阻塞主线程。 Dispatchers.Main&#xf…

RabbitMQ鉴权设计以及相关探讨

文章目录 1. rabbitmq的鉴权设计2. rabbitmq鉴权应用范围3. rabbitmq鉴权的常用方法3.1 用户管理3.2 角色管理3.3 权限管理 4. 默认鉴权4.1 默认用户4.2 默认角色 5. 参考文档 鉴权&#xff0c;分别由鉴和权组成 鉴&#xff1a; 表示身份认证&#xff0c;认证相关用户是否存在…

如何使用逻辑回归处理多标签问题?

逻辑回归处理多分类 1、背景描述2、One vs One3、One VS Rest4、从Sigmoid到Softmax的推导 1、背景描述 逻辑回归本身只能用于二分类问题&#xff0c;如果实际情况是多分类的&#xff0c;那么就需要对模型进行一些改动。下面介绍三种常用的将逻辑回归用于多分类的方法 2、One …

使用openai-whisper实现语音转文字

使用openai-whisper实现语音转文字 1 安装依赖 1.1 Windows下安装ffmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 # ffmpeg官网 https://ffm…

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…

Qt事件过滤器

1. 事件过滤器 void QObject::installEventFilter(QObject *filterObj) bool eventFilter(QObject *obj, QEvent *event); filterObj表示事件筛选器对象&#xff0c;它接收发送到此QObject对象&#xff08;安装事件过滤器的部件对象&#xff09;的所有事件。筛选器可以停止事件…

LeetCode JS专栏刷题笔记(二)

一、前言 LeetCode - JavaScript 专栏刷题笔记第二篇。 第一篇刷题笔记详见&#xff1a;LeetCode JS专栏刷题笔记&#xff08;一&#xff09; 二、算法题目 1. 复合函数 LeetCode地址&#xff1a;2629. 复合函数 请你编写一个函数&#xff0c;它接收一个函数数组 [f1, f2, …

SQL-FEFT JOIN (拼接表)

语法 SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_nametable2.column_name; 按照一定规则&#xff0c;将表table1和表table2拼接起来。 例&#xff1a; Employees 表&#xff1a; ------------------------ | Column Name | Type | ------…

挑战!贪吃蛇小游戏的实现(3)

经过&#xff08;1&#xff09;&#xff08;2&#xff09;两篇文章的介绍&#xff0c;相信大家对该游戏的实现已经有了具体的思路&#xff0c;废话不多说&#xff0c;让我们开始实现相关的代码吧&#xff01; 1.游戏主逻辑 void test() {int ch 0;srand((unsigned int)time(NU…

【Linux系统化学习】动静态库 | 软硬链接

目录 硬链接和软链接 硬链接 软链接 动态库和静态库 静态库 静态库的生成 静态库的使用 将库打包和使用 动态库 动态库的生成 动态库的使用 库搜索路径 硬链接和软链接 硬链接 上篇文章我们说到真正找到磁盘上的文件并不是文件名&#xff0c;而是inode。其实在…

【Appium UI自动化】pytest运行常见错误解决办法

通过Appium工具录制代码在pycharm上运行报错&#xff1a; 错误一&#xff1a; 1.提示 setup() 方法运行 error failed 解决办法&#xff1a;未创建 init __ 方法&#xff0c;创建一个空的__init.py文件就解决了。 原因&#xff1a; 错误二&#xff1a; 2.运行代码&#xff…
推荐文章