# ztecrawler **Repository Path**: yuelenghan/ztecrawler ## Basic Information - **Project Name**: ztecrawler - **Description**: 爬虫 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2016-11-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 机器人程序说明 ### 概要 机器人程序主要有抓取和推送两个功能,抓取功能是从网站上获取内容,然后通过xpath和正则表达式对内容进行抽取和过滤,最后把结果保存到数据库和服务器上。推送功能是通过一定的条件,从数据库中取出相应的新闻内容,以公司为单位,通过调用IM的推送接口,向客户端推送新闻。 数据库zte_crawler,一共4张表: - t_img:图片表 - t_news:新闻表 - t_orig_webpage:新闻原始页面表 - t_seed_page:种子页面表 ### 框架和运行环境 使用到的第三方框架包括:httpclient, spring, spring-data-jpa, hibernate, webmagic, ehcache, maven等。 通过httpclient进行网络访问, 使用webmagic进行爬虫相关的业务处理,使用spring-data-jpa进行持久层访问和数据持久化(jpa使用hibernate提供的实现),使用spring进行业务bean管理和定时任务调度,使用spring提供的线程池进行多线程管理和调度,使用ehcache作为数据缓存。 项目使用maven进行依赖管理和打包,使用pom.xml进行配置统一管理,使用不同的profile对打包进行资源过滤,满足多个不同环境的打包。 ### 功能说明 #### 抓取 - 抓取入口: - 定时任务CrawTask:抓取种子页面策略 5-23点,10,30,50分钟执行一次;抓取内容页策略,5-23点, 每分钟的0秒和30秒执行一次。 - JobServlet,通过servlet手动调用。 - 抓取流程: - SeedPageService:抓取种子页面,通过种子页面获取新闻列表,抽取出title(非空)、pageUrl(非空)、keyword、thumbnail等内容。生成的新闻列表放入NewsQueue队列并持久化到数据库,等待ContentPageService进一步抓取新闻内容。 - ContentPageService:抓取内容页面,通过抓取种子页面生成的待抓取新闻队列NewsQueue,进行内容抓取,抓取成功之后进行内容抽取和处理,包括图片下载,字符串替换等。抽取完成之后,把相应的内容更新到数据库表,最后把t_news表中的is_enabled字段置为1,表明该条记录抓取成功。 - 模板: 通过httpclient获取网页内容之后,需要使用xpath和正则表达式对内容进行过滤和抽取,内容过滤和抽取的过程使用模板来实现。 一个种子页面对应一个模板,模板有4种类型: - listPage:普通列表页面 - textPage:文字列表页面,比如:糗事百科网站,没有内容详情页面 - rssPage:rss形式的列表页面,rssPage页面是XML格式,区别于listPage - contentPage:内容详情页面 前三种均为列表页面,列表页面抽取到的数据为一个list列表,一般情况下需要对list进行二次抓取,获取内容详情(textPage类型除外),二次抓取获得的内容详情通过contentPage进行抽取,得到新闻内容。 模板支持多个表达式组合解析,解析顺序自上而下,解析方式支持xpath和正则表达式。 #### 推送 - 推送入口: - 定时任务PushTask,推送新闻,每天早上8点和下午4点 - PushNewsServlet,通过servlet手动调用 - 推送流程: - 生成推送的新闻:从配置文件constant.properties中读取关键词,根据关键词从t_news中查询满足条件的数据,查询结果按publishTime倒序排列,根据查询结果取出最新的5条新闻,最后生成一个html页面的字符串,html字符串作为推送的内容,第一条新闻的标题作为推送的标题。 - 调用推送接口:从constan.properties中读取推送范围和接收者信息,推送范围可以是系统、渠道或公司,接收者信息为相应的systemCode、channelId或companyId。通过这两个参数,获取到需要推送的公司信息,调用推送接口进行新闻推送。 #### 其他说明 - 系统启动时 系统启动时调用MyServletContextListener,初始化常量和NewsQueue - 定时任务 目前有三类定时任务:抓取(CrawTask)、推送(PushTask)、删除(DeleteTask) DeleteTask:因为此程序主要用来推送新闻,所以会对历史数据和无效的数据做定时清理。 - log4j扩展 使用MyDailyRollingFileAppender对log4j功能进行扩展,增加自动删除历史日志的功能,通过配置maxBackupIndex属性,设置保留天数,目前的配置只保留7天的日志。 - 线程池说明 抓取和推送都使用了多线程,这里使用spring提供的线程池进行多线程调度,线程池的配置在spring-context.xml中。 - 运行说明 由于webmagic的bug,设置代理运行时会报错,所以只能在不用设置代理即可访问网络的环境下运行,本机(公司内网)无法正常抓取。