神箭手 爬虫操作(1)

article/2025/10/3 11:10:55

今天有一个任务,是要将微博用户的昵称从数据库导入到神箭手中。

以前一直是手动操作,现在有一个需求是要直接导入到设置中。

数据库使用的是mysql,数据库连接使用的是JDBCtemplate,使用spring构建,还要用到神箭手的SDK。

之前没有接触过JDBCtemplate,一直使用的是JPA和Mybatis,所以趁着这个机会,学习一个JDBCtemplate。

 

 

一、大体框架

1.要利用JdbcTemplate,首先要添加Spring依赖。用quickstart模板创建Maven项目,在pom.xml中添加Spring依赖;

2.创建微博用户类(数据传递类),描述微博用户信息;

3.创建数据操作接口,规定需要哪些方法来操作数据,增、改各一种方法,删、查各4中方法;

4.创建数据操作类,实现数据操作接口。

 

1. ①创建maven项目,增加pom依赖:

        <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.3.8.RELEASE</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

② Spring配置数据库:

(1)配置db.properties


driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username=root
password=root
initialSize=3
maxActive=10

遇到问题:报一个找不到时区的错误,不知道为什么,解决方法是在url中加上时区设置。

注意:修改mysql的账号密码

(2)配置applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"><!--<context:property-placeholder location="classpath:db.properties"/>--><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="file:config/db.properties"/></bean><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="username" value="${username}"></property><property name="password" value="${password}"></property><property name="url" value="${url}"></property><property name="driverClassName" value="${driver}"></property><property name="initialSize" value="${initialSize}"></property><property name="maxActive" value="${maxActive}"></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean>
</beans>

注意:要修改location的路径。

配置文件就配置完了。

 

③创建WeibaoUser类,用于描述,设置get set 方法 和构造方法。

package add.users;import java.util.Date;public class WeiboUser {private long id;private long sysUserId;private long cId;private long mBlogUserId;private String userName;private String url;private String urlMd5;private boolean siteType;private boolean status;private String insertTime;private String updateTime;/*** 构造方法*/public WeiboUser() {}public WeiboUser(long id, String userName, boolean siteType, boolean status) {this.id = id;this.userName = userName;this.siteType = siteType;this.status = status;}public WeiboUser(long id, long sysUserId, long cId, long mBlogUserId, String userName,String url, String urlMd5, boolean siteType, boolean status, String insertTime, String updateTime) {this.id = id;this.sysUserId = sysUserId;this.cId = cId;this.mBlogUserId = mBlogUserId;this.userName = userName;this.url = url;this.urlMd5 = urlMd5;this.siteType = siteType;this.status = status;this.insertTime = insertTime;this.updateTime = updateTime;}public long getId() {return id;}public void setId(long id) {this.id = id;}public long getSysUserId() {return sysUserId;}public void setSysUserId(long sysUserId) {this.sysUserId = sysUserId;}public long getcId() {return cId;}public void setcId(long cId) {this.cId = cId;}public long getmBlogUserId() {return mBlogUserId;}public void setmBlogUserId(long mBlogUserId) {this.mBlogUserId = mBlogUserId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUrlMd5() {return urlMd5;}public void setUrlMd5(String urlMd5) {this.urlMd5 = urlMd5;}public boolean isSiteType() {return siteType;}public void setSiteType(boolean siteType) {this.siteType = siteType;}public boolean isStatus() {return status;}public void setStatus(boolean status) {this.status = status;}public String getInsertTime() {return insertTime;}public void setInsertTime(String insertTime) {this.insertTime = insertTime;}public String getUpdateTime() {return updateTime;}public void setUpdateTime(String updateTime) {this.updateTime = updateTime;}
}

④创建数据传递接口,规定操作数据的方法

package add.users.dao;import add.users.WeiboUser;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public interface BaseJdbcTemplate {//private JdbcTemplate template;//public abstract boolean addUser(WeiboUser user);WeiboUser queryUserById(long id);List<WeiboUser> queryUsers();
}

⑤.创建数据传递类,实现数据操作(目前只使用到获得数据,增删改查以后补上)这是根据ID查一行和查全部行

package add.users;import add.users.dao.BaseJdbcTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class JdbcTemplateImpl implements BaseJdbcTemplate {private ApplicationContext apc = null;private JdbcTemplate jdbcTemplate = null;public JdbcTemplateImpl(){apc = new FileSystemXmlApplicationContext(new String[]{"config/applicationContext.xml"});jdbcTemplate =apc.getBean("jdbcTemplate", JdbcTemplate.class);}//    public boolean addUser(WeiboUser user) {
//        return false;
//    }public WeiboUser queryUserById(long id) {String sql = "SELECT id, cid, sys_user_id, mblog_userid, url, url_md5, insert_time, update_time, " +"mblog_user_name, site_type, status FROM mblog_user_config WHERE id=?";WeiboUser user = null;user = jdbcTemplate.queryForObject(sql, new QueryUserRowMapper(), id);return user;}public List<WeiboUser> queryUsers() {String sql = "SELECT * FROM mblog_user_config";//WeiboUser user = null;List<WeiboUser> users = null;users = jdbcTemplate.query(sql, new QueryUserRowMapper());return users;}
}

 

提取出的RowMapper实现类:(获取全属性数据,指定数据获取暂时没有实现)

package add.users;import org.springframework.jdbc.core.RowMapper;import java.sql.ResultSet;
import java.sql.SQLException;public class QueryUserRowMapper implements RowMapper<WeiboUser> {public WeiboUser mapRow(ResultSet resultSet, int rowNum) throws SQLException {WeiboUser user = new WeiboUser(resultSet.getLong("id"),resultSet.getString("mblog_user_name"),resultSet.getBoolean("site_type"),resultSet.getBoolean("status"));user.setcId(resultSet.getLong("cid"));user.setmBlogUserId(resultSet.getLong("mblog_userid"));user.setUrl(resultSet.getString("url"));user.setUrlMd5(resultSet.getString("url_md5"));user.setSysUserId(resultSet.getLong("sys_user_id"));user.setInsertTime(resultSet.getDate("insert_time").toString());user.setUpdateTime(resultSet.getDate("update_time").toString());return user;}
}

简单的test一下:

import java.util.List;public class test1 {public static void main(String[] args) throws AWTException {JdbcTemplateImpl jdbcTemplate = new JdbcTemplateImpl();List<WeiboUser> users = jdbcTemplate.queryUsers();for(WeiboUser user:users){if(user.isSiteType()&&user.isStatus())System.out.println(user.getUserName());}}
}

控制台输出数据:

 

jdbc配置连接完成。

 

下一步是将数据上传到神箭手的 新浪微博用户昵称或用户ID或关键字或话题 框中。

根据神箭手的java SDK,首先是在pom中引入神箭手的依赖,然后配置账号密钥,然后就是自定义设置。

①在pom中引入

        <dependency><groupId>io.shenjian.sdk</groupId><artifactId>java-sdk</artifactId><version>1.0.4</version></dependency>

②配置连接,配置stop和start

package add.users;import io.shenjian.sdk.ShenjianClient;
import io.shenjian.sdk.ShenjianException;
import io.shenjian.sdk.model.*;public class shanjianshouConnect {String userKey = "<your user_key>";String userSecret = "<your user_secret>";ShenjianClient client = new ShenjianClient(userKey, userSecret);public void stopCrawler(){try{int crawlerId = 3365960;client.stopCrawler(crawlerId);} catch(ShenjianException e){e.printStackTrace();}}public boolean startCrawler(){try {/* 此处填写要操作的爬虫的ID */int crawlerId = 3365960;client.startCrawler(crawlerId);} catch (ShenjianException e) {e.printStackTrace();}return true;}
}

③使用ShenjianClient类中的configCrawlerCustom方法上传名字

package add.users;import io.shenjian.sdk.ShenjianClient;
import io.shenjian.sdk.ShenjianException;
import io.shenjian.sdk.model.Webhook;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class addUserToSjs {shanjianshouConnect connect = new shanjianshouConnect();public boolean addUser(){JdbcTemplateImpl jdbcTemplate = new JdbcTemplateImpl();List<WeiboUser> userList = jdbcTemplate.queryUsers();StringBuffer sb = new StringBuffer("");for(WeiboUser user:userList){if(user.isSiteType()&&user.isStatus()){sb.append(user.getUserName());sb.append(" ");}}String totalUSers = sb.toString();String[] users = totalUSers.split(" ");try {int crawlerId = 3365960;Map<String, Object> configMap = new HashMap<String, Object>();configMap.put("keywordsOrNames", new String[]{"黄磊微博"});//configMap.put("keywordsOrNames", users);connect.client.configCrawlerCustom(crawlerId, configMap);return true;} catch (ShenjianException e) {e.printStackTrace();return false;}}public void getWebHook(){ShenjianClient client = new ShenjianClient(connect.userKey, connect.userSecret);try {/* 此处填写要操作的爬虫的ID */int crawlerId = 3365960;Webhook webhookInfo = client.getWebhookInfo(crawlerId);System.out.println("Webhook URL : " + webhookInfo.getUrl());System.out.println("Events : ");for (int i = 0; i < webhookInfo.getEvents().length; i++){System.out.println(i+1 + webhookInfo.getEvents()[i]);}} catch (ShenjianException e) {e.printStackTrace();}}}

注意:上传格式为数组,关键字是keywordsOrNames

关键字在:

 

然后进行测试:

package add.users;import io.shenjian.sdk.ShenjianException;
import io.shenjian.sdk.model.AppStatus;import java.awt.*;
import java.util.List;public class test1 {public static void main(String[] args) throws AWTException {addUserToSjs addUser = new addUserToSjs();
//        addUser.addUser();Robot  r   =   new Robot();shanjianshouConnect connect = new shanjianshouConnect();//AppStatus status = connect.client.getCrawlerStatus(3365960);addUser.addUser();}
}

注意,添加完成后需要重启爬虫服务,才能配置成功

然后进入神箭手查看设置:

配置成功

 

 

参考:

https://blog.csdn.net/u010004204/article/details/76222442       JDBC

https://docs.shenjian.io/develop/platform/sdk/sdk-java.html       神箭手


http://chatgpt.dhexx.cn/article/JnqiS24b.shtml

相关文章

如何在神箭手云爬虫上写爬虫

摘要 上一篇博客跟大家详细介绍了如何写出《黄焖鸡米饭是怎么火起来的》这样的数据分析类的文章&#xff0c;相信很多人都对数据来源也就是如何爬取到黄焖鸡米饭商家信息很感兴趣。那么今天我就跟大家具体讲一讲怎么使用神箭手云爬虫写爬虫&#xff0c;以上篇博客的…

神箭手云爬虫平台 如何在1小时内编写简单爬虫

既然你来到了这里&#xff0c;想必你肯定已经知道了神箭手云爬虫平台是干什么的&#xff0c;目的也是非常的明确。 那么接下来的过程中&#xff0c;我将给你演示如何在最快时间内编写一个简单的爬虫&#xff0c;每一个属性的讲解&#xff0c;将会让你一路顺风。 demo项目GitHu…

神箭手云爬虫工具

title: 神箭手云爬虫 categories: 神箭手 tags:爬虫 分为&#xff1a; 入口页&#xff0c;帮助页&#xff0c;内容页 入口页&#xff1a; scanUrl 爬虫网页的入口 帮助页&#xff1a;helperurl 一帮包含大量的内容页&#xff08;列表&#xff09;&#xff0c;多数情况下事业…

JS求绝对值

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求&#xff0c;一个变量&#xff0c;需要判断它的值为负数时不能小于-20&#xff0c;正数也不能小于20&#xff0c;这个时候就需要用到求绝对值了。 Math.abs(num) > 求绝对值 使用示例&#xf…

javascript:求绝对值最小的数

问题来源&#xff1a;http://androidguy.blog.51cto.com/974126/1129543 有一个已经排序的数组&#xff08;升序&#xff09;&#xff0c;数组中可能有正数、负数或0&#xff0c;求数组中元素的绝对值最小的数&#xff0c;要求&#xff0c;不能用顺序比较的方法&#xff08;复杂…

力扣 -----最小绝对值(JavaScript解法)

一、题目描述 二、示例 三、解题思路 先进行一个排序&#xff0c;然后使用双指针&#xff0c;依次进行比较&#xff0c;将比较的值进行存储&#xff0c;最小值改变的话&#xff0c;数组置空&#xff0c;最小值改变&#xff0c;如果和最小值相等的话直接push。我刚开始写的排序…

python3 绝对值_python3对序列求绝对值

原博文 2018-11-08 11:27 − http://www.cnblogs.com/itdyb/p/5731804.html 一开始我是这样写的&#xff0c;据说这样写python2是可以的&#xff1a; myList [-1,2,-3,4,-5,6]absList map(abs, myList) &... 0 1936 相关推荐 2019-12-23 10:33 − ## Python3使用sud…

【前端】JavaScript基础(二)

目录 一、内置对象 Math对象 Data日期 数组对象 字符串对象 字符串的不可变 根据字符返回位置 根据位置返回字符&#xff08;重点&#xff09; 字符串基本方法&#xff08;重点&#xff09; 字符串的替换与转换 二、简单类型和复杂类型 简单类型传参 复杂类型传参 一、内…

LeetCode 任意子数组和绝对值的最大值(JavaScript)

这道题目&#xff0c;我是通过看题解&#xff0c;然后通过自己思考才写出来的&#xff0c;第一次写博客&#xff0c;如果有不好之处&#xff0c;请谅解。 写这个题目之前&#xff0c;我们先了解一下前缀和&#xff0c;通过下面例子&#xff0c;或许你就明白了什么是前缀和了。…

常用JavaScript控制结构语句,绝对值,累加,阶乘,循环

计算一个数的绝对值 function abs(x) {if (x > 0) {return x;} else {return -x;} } console.log(abs(10) abs(-10)); //>true计算数组元素之和 let arr [1, 3, 5];function sum(array) {let sum 0;for (let x of array) { //循环数组把每个元素赋给xsum x;}return…

02-Node.js基础(一)

目录 一、什么是Node.js二、Node.js在软件架构中的地位三、Node.js 可以做什么&#xff08;作用&#xff09;浏览器端的 JavaScriptNode端的JavaScript 四、Node.js APIsWeb端APINode.js端APIWeb端JS与Node端JS对比 五、安装 Node.js第一步&#xff1a;在官网下载 Node.js 安装…

vue取绝对值

先放效果&#xff1a; 代码 <template><el-input v-model"num" placeholder"请输入数字" /><el-button type"primary" click"changeNum">取绝对值</el-button> </template> import { ref } from &quo…

关于JSZIP压缩图片打包下载的一些用法

功能介绍 前端在处理一些批量文件或者图片时候&#xff0c;通过使用异步上传&#xff0c;减少表单一次性提交的的数据量。并将这些图片或者文件根据用户自定义压缩、分类保存到本地。是一个用于压缩文件和解压的JavaScript库。 官网地址 https://stuk.github.io/jszip/docume…

jsZip将多个文件压缩成一个压缩包

在项目开发中&#xff0c;搭档大佬要做一个断点续传的功能&#xff0c;让我帮忙研究一下前端将多个文件压缩成一个压缩包的方法&#xff0c;所以就有了这篇文章。 我的demo是写在vue中的&#xff0c;所以首先要有一个vue环境&#xff0c;才能进行接下来的步骤。那么下面我们就…

前端vue使用jszip压缩文件

一.引入element的上传文件组件 <el-form-item label"文件"><el-uploadclass"upload-demo"dragaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"multiple:before-upload"beforeUpload"><el-icon …

vue3中使用jszip压缩文件

1、安装依赖 npm install jszip npm install file-saver --save 2、使用 <template><el-card class"mb15"><template #header><span>jszip</span></template><!-- 二维码容器 --><div id"qrCodeBox">&…

docxtemplater、pizzip、jszip-utils、file-saver 前端实现导出word

一、准备工作 1、插件安装&#xff1a; npm i docxtemplater pizzip jszip-utils file-saver -S2、安装完成&#xff1a; 3、导出的模板文件。 我这里是将其命名word-export.docx,并将其放在public/docxs目录下&#xff0c;如图所示&#xff1a; 二、实现代码 页面使用&…

【sduoj】前端JSZip库的使用

2021SCSDUSC 文章目录 JSZIP安装使用引入实例化读取zip文件读取压缩包中的文件遍历压缩包内的所有文件&#xff08;单层&#xff09; 小结 JSZIP JSZip是一个用于创建、读取和编辑.zip文件的javascript库&#xff0c;具有好用而简单的 API。 安装 在sduoj项目中&#xff0c…

zipJS 前端压缩使用

前端在处理文件时&#xff0c;对于大文件或者多个文件上传、下载、编辑&#xff0c;直接使用原文件不方便&#xff0c;最近使用一个可以前端中处理 zip 文件的库&#xff0c;JSzip&#xff0c;主要功能&#xff1a;前端中压缩、解压缩、编辑zip文件。 在 nodeJS 中&#xff0…