spider flow爬虫使用
spider flow爬虫的安装和使用
代码:
下载20240417的spider flow的master分支的代码: https://github.com/ssssssss-team/spider-flow
下载20240429的selenium插件的master分支的代码: https://gitee.com/ssssssss-team/spider-flow-selenium
假定在JDK 21下编译和运行,github上的代码原来是在JDK 1.8上编译和运行的,所以需要修改。
解压:
把spider-flow-master.zip解压到电脑上的某个目录比如D:\idealU_PROJECT\spider-flow-master_20240417,然后把spider-flow-selenium-master.zip解压到D:\idealU_PROJECT\spider-flow-master_20240417\spider-flow-selenium-master_20240429目录下。
修改:spider-flow-core\src\main\java\org\spiderflow\core\script\ScriptManager.java
//import jdk.nashorn.api.scripting.ScriptObjectMirror;
import org.openjdk.nashorn.api.scripting.ScriptObjectMirror;
修改:spider-flow-core\src\main\java\org\spiderflow\core\service\SpiderFlowService.java
import org.springframework.context.annotation.Lazy;
…
@Lazy
@Autowired
private SpiderJobManager spiderJobManager;
修改:spider-flow-core/src/main/java/org/spiderflow/core/executor/shape/ExecuteSQLExecutor.java ??
把 Array.get(object,Math.min(-1,index));
改成:Array.get(object,Math.min(size-1,index));
修改:spider-flow-web/src/main/java/org/spiderflow/configuration/ResourcesConfiguration.java
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(“/**”)
//.allowedOrigins(“*”)
.allowedOriginPatterns(“*”)
修改:spider-flow-selenium-master_20240429\src\main\java\org\spiderflow\selenium\driver\ChromeDriverProvider.java
public WebDriver getWebDriver(SpiderNode node, String proxyStr) {
System.setProperty(“webdriver.chrome.driver”, chromeDriverPath);
ChromeOptions options = new ChromeOptions();
String userAgent = node.getStringJsonValue(USER_AGENT);
//允许远程连接进行调试
options.addArguments(“–remote-allow-origins=*”);
//options.addArguments(“–headless”);
修改:spider-flow-selenium-master_20240429\src\main\java\org\spiderflow\selenium\driver\HtmlUnitDriverProvider.java
import org.openqa.selenium.Platform;
…
public WebDriver getWebDriver(SpiderNode node, String proxyStr) {
//DesiredCapabilities capabilities = DesiredCapabilities.htmlUnit();
DesiredCapabilities capabilities = new DesiredCapabilities(“htmlunit”, “”, Platform.ANY);
修改:pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
…
<guava.version>31.1-jre</guava.version>
…
<dependencies>
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
…
<module>spider-flow-web</module>
<module>spider-flow-selenium-master_20240429</module>
</modules>
修改:spider-flow-web/pom.xml:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.20.0</version>
</dependency>
<!– 引入selenium插件 –>
<dependency>
<groupId>org.spiderflow</groupId>
<artifactId>spider-flow-selenium</artifactId>
</dependency>
</dependencies>
…
<finalName>spider-flow-${project.version}</finalName>
<mainClass>org.spiderflow.SpiderApplication</mainClass>
修改:spider-flow-selenium-master_20240429/pom.xml
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.20.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<version>4.13.0</version>
</dependency>
</dependencies>
修改:spider-flow-web/src/main/resources/application.properties
server.port=8088
spring.profiles.active=dev
logging.level.root=INFO
#logging.level.org.spiderflow=DEBUG
#平台最大线程数
spider.thread.max=64
#单任务默认最大线程数
spider.thread.default=4
#设置为true时定时任务才生效
spider.job.enable=true
#爬虫任务的工作空间
spider.workspace=spider_workspace
#布隆过滤器默认容量
spider.bloomfilter.capacity=1000000
#布隆过滤器默认容错率
spider.bloomfilter.error-rate=0.0001
#死循环检测(节点执行次数超过该值时认为是死循环)默认值为5000
#spider.detect.dead-cycle=5000
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.serialization.fail_on_empty_beans=false
spring.mvc.favicon.enabled=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=${my.db.user}
spring.datasource.password=${my.db.passwd}
spring.datasource.url=jdbc:mysql://${my.db.host}:${my.db.port}/spiderflow?useSSL=false&useUnicode=true&characterEncoding=UTF8&autoReconnect=true
#JavaMailSender邮件发送的配置
spring.mail.protocol=smtp
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=xxx@qq.com
spring.mail.password=xxxyyy
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.fallback=false
spring.mail.properties.mail.smtp.ssl.enable=true
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
#selenium插件配置
#设置chrome的WebDriver驱动路径,下载地址:http://npm.taobao.org/mirrors/chromedriver/,注意版本问题
selenium.driver.chrome=${spider.workspace}\\chromedriver.exe
#设置fireFox的WebDriver驱动路径,下载地址:https://github.com/mozilla/geckodriver/releases
selenium.driver.firefox=${spider.workspace}\\geckodriver.exe
#爬虫通知相关内容配置,可使用SpiderFlow中的变量名和以下变量名:currentDate:当前发送时间
spider.notice.subject=spider-flow流程通知
spider.notice.content.start=流程开始执行:{name},开始时间:{currentDate}
spider.notice.content.end=流程执行完毕:{name},结束时间:{currentDate}
spider.notice.content.exception=流程发生异常:{name},异常时间:{currentDate}
增加:spider-flow-web/src/main/resources/application-dev.properties
spider.thread.default=2
spider.workspace=spider_workspace
my.db.user=xxx
my.db.passwd=xxxyyy
my.db.host=192.168.1.248
my.db.port=3306
selenium.driver.chrome=${spider.workspace}\\chromedriver.exe
selenium.driver.firefox=${spider.workspace}\\geckodriver.exe
增加:spider-flow-web/src/main/resources/application-test.properties
spider.thread.default=4
spider.workspace=/data/spider
my.db.user=xxx
my.db.passwd=xxxyyy
my.db.host=192.168.1.249
my.db.port=3306
selenium.driver.chrome=${spider.workspace}/chromedriver
selenium.driver.firefox=${spider.workspace}/geckodriver
增加:spider-flow-web/src/main/resources/application-prod.properties (略)
配置SpiderApplication运行选项,增加”Add VM options”,添加运行时参数: –add-opens java.base/java.lang=ALL-UNNAMED
spider-flow安装:
$ mkdir /data/spider/
$ cd /data/spider/
$ wget https://chromedriver.storage.googleapis.com/124.0.6367.91/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip
$ wget https://github.com/mozilla/geckodriver/releases/download/v0.34.0/geckodriver-v0.34.0-linux64.tar.gz
$ tar -zxvf geckodriver-v0.34.0-linux64.tar.gz
$ cd ~
$ mkdir spiderflow/
$ cd spiderflow
$ 把spider-flow.jar拷贝到本目录。
$ 到mysql里面执行spiderflow的db目录下的spiderflow.sql,建立spiderflow数据库。
运行:
$ nohup java -Xmn64m -Xms256m -Xmx256m –add-opens java.base/java.lang=ALL-UNNAMED -jar spider-flow.jar –spring.profiles.active=test /dev/null 2>&1 &
生成的log位置(配置文件的”spider.workspace”所设置的目录下):
$ ll /data/spider/logs/
访问WEB:
本机访问: http://127.0.0.1:8088
使用:
教程: https://www.bookstack.cn/read/spiderflow-0.5.0/%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md
- 变量节点定义的变量全局可用。
- 爬取节点可以选择自动cookie,这样登录后用cookie做鉴权的网站后续直接爬数据即可,不用再手工设置cookie了。
- 对于有复杂验证码登录的网站,可以手工先把cookie存下来,然后用加全局cookie的方式设置好cookie即可。
- 不用cookie的网站,则要手工设置鉴权header或者token或者parameter。
- 页面切换时,需要用resp.sleep等待一会,让resp刷新。
- 翻页输出和执行sql最好也sleep一下,不然数据会重复。
- 对于数据从xhttprequst请求的网站,直接浏览器检查模式下找到该请求,然后爬取,这样就不用抓xhttprequest所在的网页,那样反而可能抓不到。
- SQL节点可以支持批量插入,参数使用List或Array即可,以最长的List或Array为基准,生成sql语句时其他长度不够的重复最后一个值,非List、Array的参数也是全部重复。
- 要使用selenium插件,必须运行在安装有chrome或firefox的电脑上(必须chromedriver、selenium-devtools-vXXX和chrome主版本一致都为XXX,否则CDP不一致没法用),所以无界面的server上运行不了。