Code Monkey home page Code Monkey logo

javaspider's Introduction

这是一个知乎爬虫项目

根据知乎用户爬取所有和用户相关的数据

数据包括关注者,被关注者,文章,专栏,想法,提问,答案,和用户相关的其他信息

应的框架有

  1. jdk1.8
  2. spring-boot --基本架构
  3. spring-data-elastic --elastic客户端
  4. elasticsearch --搜索引擎,也用于存储数据
  5. kinaba --数据展示和分析
  6. 爬取网页用的spring提供的restTemplate

说明

  1. 使用spring的resttemplate抓去知乎的接口
  2. 使用数据线程池实现多线程抓取
  3. 记录上次停顿的位置实现连续抓取
  4. 控制抓取的数据类型
  5. 去重使用的是elsstic提供的upset方法,id的话,people使用url_token
  6. 当访问被限制的时候切换本地的http代理,不想找线程池,所以一般只开两个线程进行抓取,不得不说知乎反爬虫做的挺好,只开一个线程的时候不会被屏蔽,多了就不行了
  7. 跑了一个星期大概抓取了200W的用户数据和其他的一些
  8. 先爬取几条记录,然后代码就会自动把记录写入任务队列中
  9. 使用java.util.concurrent里面的很多包进行多线程访问的限制,比如缓存线程池,阻塞队列,atomic原子操作类等

安装和配置

  • elasticSearch5.5
    cd /apps/
    #下载
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.0.zip
    #解压缩
    unzip
    cd elasticsearch-5.6.0
    #改变配置
    vim config/elasticsearch.yml
    #配置外网访问
    network.host : 0.0.0.0
    #cluster名称
    cluster.name: elasticsearch
    #节点名称
    node.name: node-1
    #启动 bin/elasticsearch -d
    #注意因为安全设置elasticsearch不允许用root用户访问,所以新建一个用户用于启动这个服务
    
  • kibana安装
#和上面差不多,略过了
  • jdk1.8安装
#详见网上ubuntu安装jdk的教程,有很多,就不贴了
  • spring-boot版本的选择
elasticsearch更新比较快
springboot-release版本可能不太适配
现在只能使用2.0.0.M3版本
如果用在正式环境中,可能需要降低elasticsearch,或者再等几个月等springboot的适配
  • pom.xml
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.M3</version>
    </parent>
     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  • 配置application.properties
spring.data.elasticsearch.cluster-nodes=192.168.56.101:9300
server.port=80
logging.level.root=info
logging.file=D://log.log

  • 启动类和一些配置
@SpringBootApplication(scanBasePackages = "ren.superk")
@EnableElasticsearchRepositories(basePackages = "ren.superk")
public class ElasticSearchApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(ElasticSearchApplication.class,args);
    }


    @Autowired
    private PeopleService peopleService;
    @Override
    public void run(String... strings) throws Exception {
        peopleService.initDataByThreadCount(2);
    }
}


@Configuration
public class RestTemplateConfig{
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//ms
        factory.setConnectTimeout(15000);//ms
        return factory;
    }
}
  • 文件路径
使用命令行工具 tree /F .\springboot-spider\src\main > d:/tree.txt 

├─java
│  └─ren
│      └─superk
│          └─zhihu
│              ├─action
│              │      PeopleAction.java    --action接口,写了3个方法
│              │      
│              ├─config                      -- 配置
│              │      ElasticSearchApplication.java
│              │      ElasticSearchConfig.java
│              │      RestTemplateConfig.java
│              │      
│              ├─core                        --核心枚举,和类型相关的参数都存在美剧中
│              │      SortEnum.java
│              │      ZhihuEnum.java
│              │      
│              ├─model                       --实体类
│              │      Answer.java
│              │      Article.java
│              │      Columns.java
│              │      Education.java
│              │      Employment.java
│              │      Fav.java
│              │      People.java
│              │      Pins.java
│              │      Question.java
│              │      Relation.java
│              │      Topic.java
│              │      ZhihuAnswerPager.java  --这几个本来设计的有用,但废弃掉了
│              │      ZhihuArticlePager.java --这几个本来设计的有用,但废弃掉了
│              │      ZhihuColumnsPager.java --这几个本来设计的有用,但废弃掉了
│              │      ZhihuFavPager.java     --这几个本来设计的有用,但废弃掉了
│              │      ZhihuPager.java
│              │      ZhihuPeoplePager.java  --这几个本来设计的有用,但废弃掉了
│              │      ZhihuPinsPager.java    --这几个本来设计的有用,但废弃掉了
│              │      ZhihuQuestionPager.java --这几个本来设计的有用,但废弃掉了
│              │      ZhihuTopicPager.java  --这几个本来设计的有用,但废弃掉了
│              │      
│              ├─repository
│              │      PeopleRepository.java  --elasticsearch-spring-data的从IDUS方法
│              │      RelationRepository.java
│              │      
│              └─service
│                  │  PeopleService.java    --服务
│                  │  PeopleUrlService.java --网络服务
│                  │  
│                  └─impl
│                          PeopleServiceImpl.java  -- 主要的方法都写在这里面
│                          PeopleUrlServiceImpl.java
│                          test.java
│                          
└─resources
        application.properties  --配置

日志

索引

一些简单的分析,见笑了

索引

关注的人最多的人 索引

被关注的人最多的人

索引

感谢最多的

索引

学校 比较有趣

索引

回答问题最多,真劳模

索引

提问最多

索引

提问最多的主题,有趣 索引

职位,也很有趣

看图把,我不贴了

javaspider's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

javaspider's Issues

使用正则分析每日最热门的文章

思路是在根主题下用时间搜索,对每日的数据根据create或者update时间索引
然后根据感谢和点赞数进行排序
应该不是太难,
不过我不太喜欢写正则表达式

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.