# spider-zhihu **Repository Path**: zzxaxing/spider-zhihu ## Basic Information - **Project Name**: spider-zhihu - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-12-12 - **Last Updated**: 2021-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 获取项目源码 ```bash git clone https://github.com/zhenye163/spider-zhihu.git ``` # 项目启动说明 1. 本地启动 2. 部署到阿里云 ##
本地启动
> 基础环境要求: `mysql5.6+`,`JDK8`,`Maven3.5.3+` 1. Windows下安装Redis 直接在[redis版本库](https://github.com/microsoftarchive/redis/releases)中选取一个版本`msi`格式的redis,下载后按默认配置安装即可。 2. Windows下安装RabbitMQ 预先在[Erlang官网](https://www.erlang.org/downloads),选取64位的二进制文件,下载后按默认配置安装erlang。 然后在[RabbitMQ官网](https://www.rabbitmq.com/install-windows.html),下载可执行文件的RabbitMQ安装包,按默认配置安装。 接着在RabbitMQ所在目录的sbin目录在执行命令`rabbitmq-plugins enable rabbitmq_management`安装RabbitMQ管理插件。 最后通过菜单栏提供的启动链接或直接命令启动,以`guest:guest`用户及密码访问`localhost:15672`即可管理rabbitMQ实例。 3. 创建数据库`zhihu` ```sql create database if not exists zhihu; ``` 4. 在虚拟机安装`ElasticSearch` ElasticSearch的详细安装教程可参考[我的博客-springboot整合ElasticSearch](https://blog.csdn.net/UtopiaOfArtoria/article/details/88403459)。 按教程说明安装成功后,修改配置文件`application-dev.properties`中与elasticsearch相关配置(ip地址以及集群名称) 即可。 5. 启动项目 执行`mvn springboot:run`命令或在开发工具帮助下,即可启动项目。 ##
部署到阿里云
> 基础环境要求: 需要`docker`环境 需要在阿里云的安全策略中开发如下端口: ![需要开放的端口](readme-images/aliyun-port.png) IDEA通过2375端口测试目标服务器是否具备docker环境,因此需要更改`docker`的配置文件如下: ```bash 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 ```bash 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 # {password}是占位符,内容就是设置的密码,为了方便好记可以直接使用root(生产环境慎用) ALTER USER 'root'@'%' IDENTIFIED BY '{password}' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '{password}'; FLUSH PRIVILEGES; ``` - docker部署redis ```bash docker pull redis docker run -d --name redis-master -p 6379:6379 redis ``` - docker部署rabbitmq ```bash 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文件如下: ```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`配置参数如下: ![docker配置](readme-images/docker-configurations.png) - 服务器的mysql中需要创建数据库zhihu ```sql create database if not exists zhihu; ``` - 删除源码中与ElasticSearch的源码(感兴趣的同学,可以自己在阿里云本机安装好ElasticSearch,然后添加相关ElasticSearch配置) - 启动项目 基于dockerfile文件,将当前项目发布到阿里云服务器即可。 # 项目思路 1. 启动项目时,会执行一个初始化任务---爬取西刺网的前10页免费代理,放入RabbitMQ中,RabbitMQ会启动10个线程(10个消费者)判断这些代理是否可用,并将这些代理以及测试结果保存在Mysql中。 2. 基于Spring提供的计划调度,每15分钟会测试一下Mysql中所有代理放入RabbitMQ中,10个消费者会测试这些代理的可用性并更新其成功次数和失败次数(`success_times`,`fail_times`),如果连续3次都测试失败,会把这样的代理从DB中删除。 3. 基于Spring提供的计划调度,每10分钟会把Mysql中成功次数`success_times`最高的10条代理,放入redis中,保证redis中的代理都是高可用的免费代理。 4. 基于Spring提供的计划调度,每30分钟会爬取西祠网首页的所有免费代理,放入rabbitMQ中,10个消费者会测试这些代理的可用性并将结果保存到Mysql中。 5. 基于1-4步,相当于我们在redis中维护了一个高可用的免费代理池。每次爬取数据时,从这个免费代理池中选取一条代理,可以做到一定程度的反反爬虫。 6. 项目向外暴露了三个接口`ip:8980/users?urlToken=#{urlToken}`,`ip:8980/users/followees?urlToken=#{urlToken}`,`ip:8980/users/followers?urlToken=#{urlToken}`。第一个接口是爬取知乎用户的数据(每个知乎用户有唯一的urlToken);第二个接口是爬取该知乎用户关注的所有用户的数据;第三个接口是爬取该知乎关注该用户的所有用户的数据。通过调用这三个接口,我们会把想爬取的知乎用户数据保存在mysql的`zhihu.user`表中。 7. 利用mysqldump工具备份爬取的原始知乎用户数据保存到user_copy表中,然后调用项目暴露的接口`ip:8980/users/filter`,利用布隆算法进行知乎用户数据的去重。 8. 调用项目暴露的接口`ip:8980/users/transfer`,把去重后的知乎用户数据导入ElasticSearch中。 9. 利用ElasticSearch以及其Kibana插件分析知乎用户数据,将分析后的结果进行汇总后,用其自带画图工具或Echarts进行分析结果的可视化。 # 说明 详细的知乎用户爬取分析项目的设计思路以及代码实现可以参考[我的博客---百万知乎用户数据分析](https://blog.csdn.net/UtopiaOfArtoria/article/details/100077249)。