git clone https://github.com/zhenye163/spider-zhihu
基础环境要求:
mysql5.6+
,JDK8
,Maven3.5.3+
- Windows下安装Redis
直接在redis版本库中选取一个版本msi
格式的redis,下载后按默认配置安装即可。
- Windows下安装RabbitMQ
预先在Erlang官网,选取64位的二进制文件,下载后按默认配置安装erlang。
然后在RabbitMQ官网,下载可执行文件的RabbitMQ安装包,按默认配置安装。
接着在RabbitMQ所在目录的sbin目录在执行命令rabbitmq-plugins enable rabbitmq_management
安装RabbitMQ管理插件。
最后通过菜单栏提供的启动链接或直接命令启动,以guest:guest
用户及密码访问localhost:15672
即可管理rabbitMQ实例。
- 创建数据库
zhihu
create database if not exists zhihu;
- 启动项目
执行mvn springboot:run
命令或在开发工具帮助下,即可启动项目。
基础环境要求: 需要
docker
环境
需要在阿里云的安全策略中开发如下端口:
IDEA通过2375端口测试目标服务器是否具备docker环境,因此需要更改docker
的配置文件如下:
vim /usr/lib/systemd/system/docker.service
# 在ExecStart=/usr/bin/dockerd-current 后面加上
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
# 重启docker服务使配置生效
systemctl daemon-reload
systemctl restart docker
- docker部署mysql
docker pull mysql
docker run --name mysql-master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
# mysql8.0+换了加密规则;navcat无法直接联通,需要重新设置加密规则
docker exec -it mysql-master bash
mysql -u root -p
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
# {password}是占位符,其内容为`root`即可
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '{password}';
FLUSH PRIVILEGES;
- docker部署redis
docker pull redis
docker run -d --name redis-master -p 6379:6379 redis
- docker部署rabbitmq
docker pull rabbitmq
docker run -d --name rabbitmq-master -p 5672:5672 -p 15672:15672 rabbitmq
# 还需要安装rabbitmq管理插件
docker exec -it rabbitmq-master /bin/bash
rabbitmq-plugins enable rabbitmq_management
- 编写dockerfile文件如下:
FROM java:8
MAINTAINER zhenye
EXPOSE 8980
VOLUME /tmp
RUN mkdir /app
RUN mkdir /app/logs
ADD target/spider-zhihu-1.0.0.jar /app/spider-zhihu-1.0.0.jar
ENTRYPOINT java -server -Xms512M -Xmx512M -Xmn256M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M -Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n,address=8080 -Xverify:none -XX:+DisableExplicitGC -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Dspring.profiles.active=prod -jar /app/spider-zhihu-1.0.0.jar
然后利用IDEA插件---docker integration
配置参数如下:
- 服务器的mysql中需要创建数据库zhihu
create database if not exists zhihu;
- 启动项目
基于dockerfile文件,将当前项目发布到阿里云服务器即可。
- 启动项目时,会执行一个初始化任务---爬取西刺网的前10页免费代理,放入RabbitMQ中,RabbitMQ会启动10个线程(10个消费者)判断这些代理是否可用,并将这些代理以及测试结果保存在Mysql中。
- 基于Spring提供的计划调度,每15分钟会测试一下Mysql中所有代理放入RabbitMQ中,10个消费者会测试这些代理的可用性并更新其成功次数和失败次数(
success_times
,fail_times
),如果连续3次都测试失败,会把这样的代理从DB中删除。 - 基于Spring提供的计划调度,每10分钟会把Mysql中成功次数
success_times
最高的10条代理,放入redis中,保证redis中的代理都是高可用的免费代理。 - 基于Spring提供的计划调度,每30分钟会爬取西祠网首页的所有免费代理,放入rabbitMQ中,10个消费者会测试这些代理的可用性并将结果保存到Mysql中。
- 基于1-4步,相当于我们在redis中维护了一个高可用的免费代理池。每次爬取数据时,从这个免费代理池中选取一条代理,可以做到一定程度的反反爬虫。
- 项目向外暴露了三个接口
ip:8980/users?urlToken=#{urlToken}
,ip:8980/users/followees?urlToken=#{urlToken}
,ip:8980/users/followers?urlToken=#{urlToken}
。第一个接口是爬取知乎用户的数据(每个知乎用户有唯一的urlToken);第二个接口是爬取该知乎用户关注的所有用户的数据;第三个接口是爬取该知乎关注该用户的所有用户的数据。通过调用这三个接口,我们会把想爬取的知乎用户数据保存在mysql的zhihu.user
表中。 - 将
zhihu.user
中的数据,导入elasticsearch中进行数据分析---待完成...