当前位置: 首页 > news >正文

整合 Java, Python 和 Scrapy 爬虫以传递和使用参数

这篇博客将详细说明如何从 Java 应用程序调用一个 Python 脚本,并在此过程中传递参数给一个 Scrapy 爬虫。最终目标是让 Java 控制爬虫的行为,如爬取数量和特定的运行参数。

一、Scrapy 爬虫的修改

首先,我们需要确保 Scrapy 爬虫能接收从命令行传递的参数。这涉及到修改 Scrapy 的启动文件和爬虫文件。

  1. 创建 Python 启动脚本 run.py

    这个脚本负责解析从 Java 传来的命令行参数,并将其传递给 Scrapy 爬虫。

    # run.py
    import sys
    from scrapy import cmdlineif __name__ == '__main__':# 接受从外部传入的参数# spider_name = sys.argv[1]  # 爬虫名称# token = sys.argv[2]        # 接受令牌# num = sys.argv[3]          # 接受数字参数# map_json = sys.argv[4]     # 接受JSON格式的字典# 测试数据spider_name = 'pic'token = "123"num = 100map_json = '{"a": 1, "b": 2}'# 构建 Scrapy 命令command = ["scrapy", "crawl", spider_name,"-a", f"token={token}","-a", f"num={num}","-a", f"map={map_json}"]cmdline.execute(command)
    
  2. 修改 Scrapy 爬虫以使用这些参数

    # pic_spider.py
    import scrapy
    import jsonclass PicSpider(scrapy.Spider):"""彼岸图网站图片爬虫https://pic.netbian.com/"""name = 'pic'# allowed_domains = ['netbian.com']start_urls = ['https://pic.netbian.com//']def __init__(self, token=None, num=None, java_map=None, *args, **kwargs):super(PicSpider, self).__init__(*args, **kwargs)self.token = tokenself.num = int(num) if num else 100  # 接收数字并提供默认值self.map = json.loads(java_map) if java_map else {}  # 正确的条件检查def parse(self, resp, **kwargs):print(resp.text)
    
二、Java 端的实现

在 Java 端,需要构建一个命令行字符串并使用 Runtime.exec() 来调用 Python 脚本。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;public class RunScrapyFromJava {public static void main(String[] args) {try {String pythonScriptPath = "path/to/run.py";String spiderName = "pic";String token = "some_token";int num = 100;Map<String, Object> map = new HashMap<>();map.put("key1", "value1");map.put("key2", "value2");String jsonMap = new Gson().toJson(map);if (jsonMap.isEmpty()) {jsonMap = "{}";  // 确保总是传递一个 JSON 字符串}// 构建命令String command = String.format("python %s %s %s %d '%s'",pythonScriptPath, spiderName, token, num, jsonMap);Process p = Runtime.getRuntime().exec(command);p.waitFor();BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (Exception e) {e.printStackTrace();}}
}
总结

这个过程实现了从 Java 端通过 Python 启动脚本向 Scrapy 爬虫动态传递参数,使得爬虫行为可以根据外部输入进行调整。此方法适用于需要从 Java 控制 Python 爬虫的场景,如企业应用中的数据采集任务。

相关文章:

整合 Java, Python 和 Scrapy 爬虫以传递和使用参数

这篇博客将详细说明如何从 Java 应用程序调用一个 Python 脚本&#xff0c;并在此过程中传递参数给一个 Scrapy 爬虫。最终目标是让 Java 控制爬虫的行为&#xff0c;如爬取数量和特定的运行参数。 一、Scrapy 爬虫的修改 首先&#xff0c;我们需要确保 Scrapy 爬虫能接收从命…...

Android 蓝牙实战——蓝牙音乐播放进度(二十)

对于蓝牙音乐的开发来说,播放进度是一个比较重要的数据参数,这里我们就来分析一下蓝牙音乐播放进度的相关回调。 一、回调流程 1、AvrcpControllerService 源码位置:/packages/apps/Bluetooth/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java /…...

SQL注入实例(sqli-labs/less-1)

初始网页 从网页可知传递的参数名为 id&#xff0c;并且为数字类型 1、得知数据表有多少列 1.1 使用联合查询查找列数&#xff08;效率低&#xff09; http://localhost/sqli-labs-master/Less-1/?id1 union select 1,2 -- 1.2 使用order by查找列数&#xff08;效率高&…...

Python中tkinter编程入门3

在使用tkinter创建了窗口之后&#xff0c;可以将一些控件“放置”到窗口中。这些控件包括标签、按键以及输入框等。 1 在窗口中“放置”标签 在窗口中“放置”标签主要有两个步骤&#xff0c;一是创建标签控件&#xff0c;二是将创建好的标签“放置”到窗口上。 1.1 创建标签…...

XMind 2023 v23.05.2660软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; XMind 2023 v23.05.2660被视为顶尖思维导图软件&#xff0c;其界面简洁清爽&#xff0c;功能布局直观简单&#xff0c;摒弃繁复不实。尽管体积小巧&a…...

docker compose kafka集群部署

kafka集群部署 目录 部署zookeeper准备工作2、部署kafka准备工作3、编辑docker-compose.yml文件4、启动服务5、测试kafka6、web监控管理 部署zookeeper准备工作 mkdir data/zookeeper-{1,2,3}/{data,datalog,logs,conf} -p cat >data/zookeeper-1/conf/zoo.cfg<<EOF…...

最新版在线客服系统源码

源码介绍 首发最新在线客服系统源码&#xff0c;优化更好并且重构源码布局UI 性能不吃cpu并发快,普通1H2G都能带动最新版只要是服务器都能带动 搭建即可使用,操作简单,易懂 修复了老版本bug 内附有搭建教程 gofly.v1kf.com 运行环境 Nginx 1.20 MySQL 5.7 演示截图...

【比邻智选】MR880A模组

&#x1f680;高性价比&#xff0c;5G/4G双模&#xff0c;稳定可靠 &#x1f310;功能丰富&#xff0c;5G特性一应俱全 &#x1f9e9;多封装兼容&#xff0c;适配性强&#xff0c;灵活升级智能设备...

超大文件去除重复数据

背景 一个超大200万行文件 第一列是文件名 第二列是文本 第一列有重复的文件名 如何删除重复的文件名和对应的文本 awk ‘!seen[$1]’ 使用一些命令行工具来处理大文件&#xff0c;如awk、sed、grep等。 使用awk命令来去除重复行&#xff1a; bash awk !seen[$1] your_file.…...

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…...

苹果电脑怎么安装crossover 如何在Mac系统中安装CrossOver CrossOver Mac软件安装说明

很多Mac的新用户在使用电脑的过程中&#xff0c;常常会遇到很多应用软件不兼容的情况。加上自己以前一直都是用Windows系统&#xff0c;总觉得Mac系统用得很难上手。 其实&#xff0c;用户可以在Mac上安装CrossOver&#xff0c;它支持用户在Mac上运行Windows软件&#xff0c;例…...

C++学习————第十天(string的基本使用)

1、string 对象类的常见构造 (constructor)函数名称 功能说明&#xff1a; string() &#xff08;重点&#xff09; 构造空的string类对象&#xff0c;即空字符串 string(const char* s) &#xff08;重点&#xff09;…...

华为OD介绍

概念 华为OD是华为提出的一种新的用工方式&#xff0c;其全称是Outsourcing Dispacth&#xff0c;也可以简写为ODP&#xff0c;是华为和北京外企德科人力资源服务上海有限公司联合招聘的简称。华为OD岗位属于华为外包员工的一种&#xff0c;仅限于软件研发类岗位&#xff0c;类…...

判断点在多边形内部

0. 介绍 网上资料很多&#xff0c;只简单介绍下&#xff0c;方便自己今后的理解。 1. 射线法 从该点引一条射线出来&#xff0c;如果和多边形有偶数个交点&#xff0c;则点在多边形外部。 因为有入必有出&#xff0c;所以从外部引进来的射线一定是交多边形偶数个点。 如图…...

livox雷达斜装修改

fast_lio中的mid360.yaml中的外参 extrinsic_est_en: false # true: enable the online estimation of IMU-LiDAR extrinsicextrinsic_T: [ -0.011, -0.02329, 0.04412 ]extrinsic_R: [ 1, 0, 0,...

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…...

k8s各个组件的作用

Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化计算机容器化应用程序的部署、扩展和管理。以下是 Kubernetes 中的关键组件及其作用&#xff1a; API 服务器&#xff08;API Server&#xff09;&#xff1a; 作为集群中所有资源操作的入…...

Spring Cloud 整合Sentinel

1、引入依赖 版本说明 alibaba/spring-cloud-alibaba Wiki GitHub 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <…...

Java入门基础学习笔记4——开发Helloworld入门程序

Java程序开发的三个步骤&#xff1a; 1&#xff09;编写代码 2&#xff09;编译代码 3&#xff09;运行代码 注意事项&#xff1a; 第一个java程序建议使用记事本来编写。 建议代码文件名全英文、首字母大写、满足驼峰模式&#xff0c;源代码文件的后缀必须是.java 注意&a…...

了解WebSocket

1.概念&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;属于应用层协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握…...

轻量级GraphRAG框架nano-graphrag:模块化设计与实践指南

1. 项目概述&#xff1a;一个为开发者而生的轻量级GraphRAG实现 如果你正在寻找一个能够快速上手、代码清晰、易于二次开发的GraphRAG&#xff08;图增强检索生成&#xff09;框架&#xff0c;那么 nano-graphrag 很可能就是你需要的那个工具。GraphRAG这个概念&#xff0c;简…...

别再只点保存了!QGIS工程文件.QGZ和.QGS到底怎么选?附XML结构详解

QGIS工程文件格式深度解析&#xff1a;.QGZ与.QGS的选择策略与XML实战指南 当你在QGIS中完成一幅精心设计的地图&#xff0c;点击保存按钮时&#xff0c;系统弹出的格式选择对话框可能让你陷入短暂的犹豫——该选择.QGZ还是.QGS&#xff1f;这个看似简单的选择背后&#xff0c;…...

AD19原理图编译总报off grid pin警告?手把手教你从库源头搞定封装与栅格对齐

AD19原理图编译报off grid pin警告&#xff1f;从库源头解决封装与栅格对齐问题 每次在AD19中编译原理图时&#xff0c;看到那一长串的"off grid pin"警告&#xff0c;是不是感觉特别烦躁&#xff1f;这些看似无害的警告实际上可能隐藏着严重的设计隐患。作为一位经历…...

如何快速掌握ComfyUI图像修复插件:终极完整使用指南

如何快速掌握ComfyUI图像修复插件&#xff1a;终极完整使用指南 【免费下载链接】comfyui-inpaint-nodes Nodes for better inpainting with ComfyUI: Fooocus inpaint model for SDXL, LaMa, MAT, and various other tools for pre-filling inpaint & outpaint areas. 项…...

数据标注平台搭建:支持主动学习的智能标注工具

在软件测试领域&#xff0c;测试数据的质量直接决定了测试覆盖率和缺陷发现能力。随着AI驱动测试的兴起&#xff0c;高质量标注数据成为训练测试预言、缺陷预测模型、自动化测试脚本生成等智能测试工具的核心资产。然而&#xff0c;传统的人工标注方式效率低下、一致性差&#…...

基于SpringBoot的B2C生鲜电商平台毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Vue框架的B2C生鲜电商平台以解决当前生鲜电商领域存在的核心问题包括供应链管理效率低下导致的商品损耗率居高不下用户端体…...

从表情包到OLED屏显:基于Image2Lcd与PCtoLCD2002的嵌入式图片取模实战

1. 从表情包到OLED显示的完整流程 最近在做一个智能家居项目时&#xff0c;遇到了一个有趣的需求&#xff1a;需要为自制的语音助手设计一个唤醒图标。这个图标要在0.96寸OLED上显示&#xff0c;但市面上现成的图标要么尺寸不合适&#xff0c;要么风格不匹配。于是我想到了一个…...

FPGA调试实录:我的SPI Master模块为什么读不到数据?常见问题排查指南

FPGA调试实录&#xff1a;SPI Master模块数据读取失败的深度排查指南 当你的SPI Master模块在调试过程中突然"罢工"&#xff0c;示波器上的波形看似正常却始终无法读取数据时&#xff0c;那种挫败感每个硬件工程师都深有体会。本文将从实战角度出发&#xff0c;分享一…...

可口可乐AI印相私密工作流首次公开(含内部CMYK预置包、罐体反光建模提示词库与印刷出血校准表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;可口可乐AI印相私密工作流的起源与战略价值 可口可乐AI印相私密工作流并非源于通用大模型的简单套用&#xff0c;而是其全球数字创新实验室在2022年启动的“Project Chroma”中孵化出的端到端隐私增强…...

JS 侦探社:如何精准判断一个对象是不是数组?

&#x1f575;️‍♂️ JS 侦探社&#xff1a;如何精准判断一个对象是不是数组&#xff1f; &#x1f914; 为什么判断数组这么难&#xff1f; 在 JavaScript 中&#xff0c;数组本质上也是一种对象。 console.log(typeof []); // "object" console.log(typeof {}…...