爬取博客内容记录到数据库

简介: 一、需求分析网站:https://www.cnblogs.com/分析:需要的数据:标题、摘要、原文地址、发布时间存储数据库二、设计数据库标题、摘要、原文地址、发布时间文章表:id主键 title标题summary摘要detailurl详细地址pubtime发布时间ctime创建时间S...

一、需求分析
网站:https://www.cnblogs.com/

分析:

需要的数据:标题、摘要、原文地址、发布时间

存储数据库
222

二、设计数据库
标题、摘要、原文地址、发布时间

文章表:id主键 title标题summary摘要detailurl详细地址pubtime发布时间ctime创建时间

SQL脚本:

create database db_data1906;
use db_data1906;
create table t_bkyarticle(id int primary key auto_increment,title varchar(100),summary text,detailurl varchar(200),pubtime date,ctime date);
三、实现编码
技术栈:SpringBoot

1.新建项目

SpringBoot

2、依赖jar

3、逐层编写代码

实体层

@TableName("t_bkyarticle")
@Data
public class BkyArticle {

@TableId(type = IdType.AUTO)
private Integer id;
private String title;
private String summary;
private String detailurl;
private Date pubtime;
private Date ctime;

}
持久层

public interface BkyArticleDao extends BaseMapper {

@Insert("insert into t_bkyarticle(title,summary,detailurl,pubtime,ctime) values(#{title},#{summary},#{detailurl},#{pubtime},now())")
int save(BkyArticle article);

}
业务逻辑层

public interface BkyArticleService extends IService {

boolean saveEntity(BkyArticle article);

}
@Service
public class BkyArticleServiceImpl extends ServiceImpl implements BkyArticleService {

@Override
public boolean saveEntity(BkyArticle article) {
    return getBaseMapper().save(article)>0;
}

}
4、编写爬虫核心代码

自定义页面处理器

@Service
public class BkyArticlePage implements PageProcessor {

private String baseUrl="https://www.cnblogs.com/";
@Override
public void process(Page page) {
    //1、解析当前页面的内容
    List<String> titles=page.getHtml().xpath("div[@id='post_list']/div[@class='post_item']/div[@class='post_item_body']/h3/a/text()").all();
    List<String> urls=page.getHtml().xpath("div[@id='post_list']/div[@class='post_item']/div[@class='post_item_body']/h3/a/@href").all();
    List<String> infos=page.getHtml().xpath("div[@id='post_list']/div[@class='post_item']/div[@class='post_item_body']/p[@class='post_item_summary']/text()").all();
    List<String> times=page.getHtml().xpath("div[@id='post_list']/div[@class='post_item']/div[@class='post_item_body']/div[@class='post_item_foot']/a/text()").all();
    //2、组装解析的结果
    List<BkyArticle> articles=new ArrayList<>();
    for(int i=0;i<titles.size();i++){
        BkyArticle article=new BkyArticle();
        article.setTitle(titles.get(i));
        article.setSummary(infos.get(i));
        article.setDetailurl(urls.get(i));
        article.setPubtime(parseTime(getTimeStr(times.get(i))));
        articles.add(article);
    }
    //3、传递给了结果处理器
    page.putField("list",articles);

    //4、分页查询 获取分页的路径并标记继续爬取
    if(page.getUrl().get().equals(baseUrl)){
        //计算所有的分页请路径
        List<String> pageurls=new ArrayList<>();
        List<String>allpages=page.getHtml().xpath("div[@id='paging_block']/div[@class='pager']/a/text()").all();
        int maxPage=Integer.parseInt(allpages.get(allpages.size()-2));
        for(int i=2;i<=maxPage;i++){
            pageurls.add(baseUrl+"/sitehome/p/"+i);
        }
        //设置继续爬取的网页
        page.addTargetRequests(pageurls);
    }
}
private String getTimeStr(String s){
    String s1=s.trim();
    if(s1.indexOf(" ")>0){
        return s.substring(s.indexOf(' ')+1);
    }else {
        return null;
    }
}
private Date parseTime(String time){
    if(time!=null) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        try {
            return sdf.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
            return new Date();
        }
    }else {
        return new Date();
    }
}
private Site site=Site.me().setTimeOut(6000).setSleepTime(2000);

@Override
public Site getSite() {
    return site;
}

}
结果处理器

@Repository
public class BkyArticPipeline implements Pipeline {

@Autowired
private BkyArticleDao bkyArticleDao;
@Override
public void process(ResultItems resultItems, Task task) {
    List<BkyArticle> articleList=resultItems.get("list");
    System.out.println("爬取数据:"+articleList.size());
    for(BkyArticle a:articleList){
        bkyArticleDao.save(a);
    }
}

}
5、编写启动接口

控制器 实现爬取的运行

@Api
@RestController
public class BkyArticController {

@Autowired
private BkyArticleService bkyArticleService;
@Autowired
private BkyArticlePage page;
@Autowired
private BkyArticPipeline pipeline;
//启动爬虫
@GetMapping("/api/spider/start.do")
public R start(){
    Spider.create(page).addPipeline(pipeline).addUrl("https://www.cnblogs.com/").thread(5).run();
    return R.ok("爬取已经启动");
}
//查询爬取数据
@GetMapping("api/bkyartic/all.do")
public R all(){
    return R.ok(bkyArticleService.list());
}

}
6、配置Swagger

@Configuration //配置文件
public class SwaggerConfig {

//创建文档说明
public ApiInfo createAI(){
    ApiInfo apiInfo=new ApiInfoBuilder().title("文章接口").description("实现一款基于爬虫实现的数据接口").contact(new Contact("Feri","http://www.17feri.top","xingfei_work@163.com")).build();
    return apiInfo;
}
//创建Swagger扫描信息
@Bean
public Docket createD(){
    return new Docket(DocumentationType.SWAGGER_2).apiInfo(createAI()).select().
            apis(RequestHandlerSelectors.basePackage("com.feri.point.controller")).build();
}

}
7、启动测试

16e2096cb6aeb56b

相关文章
|
6月前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
【2月更文挑战第23天】【2月更文挑战第73篇】如何处理爬取到的数据,例如存储到数据库或文件中?
88 2
|
1月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
6月前
|
关系型数据库 MySQL 应用服务中间件
tomcat 搭建博客 及破解数据库密码
tomcat 搭建博客 及破解数据库密码
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础练习系列14、博客后台管理系统
MySQL数据库基础练习系列14、博客后台管理系统
45 1
|
6月前
|
JavaScript Java 关系型数据库
博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)
博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)
314 0
|
6月前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
88 1
|
弹性计算 安全 关系型数据库
基于阿里云ECS和云数据库RDS搭建博客
对搭建博客整个心路历程进行总结
201 7
|
JavaScript 前端开发
“layui助力博客管理升级!用增删改查功能打造优质博客体验“
“layui助力博客管理升级!用增删改查功能打造优质博客体验“
49 0
|
弹性计算 安全 关系型数据库
基于阿里云ECS和云数据库RDS搭建博客
对搭建博客整个心路历程进行总结
206 3
|
缓存 安全 数据库
构建简单博客系统:从数据库设计到性能优化实践
本文以构建简单博客系统为例,详细介绍了从数据库设计与建模到性能调优与扩展的全过程。通过丰富的代码示例,读者将全面了解如何设计数据库模型、实现数据库操作和查询优化,以及如何实现用户认证与权限控制,最终实现一个高效、安全的博客系统。
294 0
下一篇
无影云桌面